blob: 6d412b5dabfe07865dee59d727b78a9b9b91938c [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package com.datatorrent.lib.util.time;
import java.math.BigDecimal;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.Preconditions;
import com.datatorrent.api.Context.DAGContext;
import com.datatorrent.api.Context.OperatorContext;
/**
* This a is class which holds utility functions that can be used by operators to perform common
* tasks.
*
* @since 3.3.0
*/
public class WindowUtils
{
/**
* Computes the duration of an Operator's application window in milliseconds.
* @param context The context of the Operator whose application window duration is
* being computed.
* @return The duration of an Operator's application window in milliseconds.
*/
public static long getAppWindowDurationMs(OperatorContext context)
{
return context.getValue(DAGContext.STREAMING_WINDOW_SIZE_MILLIS).longValue() *
context.getValue(OperatorContext.APPLICATION_WINDOW_COUNT).longValue();
}
/**
* Computes the number of application windows that will fit into the given
* millisecond duration. This method rounds the number of application windows up.
* @param context The context of the Operator for which the number of application
* windows is being computed.
* @param millis The millisecond duration to compute the number of application windows for.
* @return The number of application windows that will fit into the given millisecond duration.
*/
public static long msToAppWindowCount(OperatorContext context, long millis)
{
Preconditions.checkArgument(millis > 0);
long appWindowDurationMS = getAppWindowDurationMs(context);
long appWindowCount = millis / appWindowDurationMS;
if (millis % appWindowDurationMS != 0) {
appWindowCount++;
}
return appWindowCount;
}
/**
* Converts tuples per second into tuples per application window. The value for
* tuples per application window is rounded up.
* @param context The context of the Operator for which tuples per application window is
* being computed.
* @param tuplesPerSecond Tuples per second.
* @return Tuples per application window.
*/
public static long tpsToTpw(OperatorContext context, long tuplesPerSecond)
{
Preconditions.checkArgument(tuplesPerSecond > 0);
BigDecimal tuplesPerWindow = new BigDecimal(getAppWindowDurationMs(context));
tuplesPerWindow = tuplesPerWindow.divide(new BigDecimal(1000));
tuplesPerWindow = tuplesPerWindow.multiply(new BigDecimal(tuplesPerSecond));
Preconditions.checkArgument(tuplesPerWindow.compareTo(new BigDecimal(Long.MAX_VALUE)) <= 0,
"Overflow computing tuples per window.");
tuplesPerWindow = tuplesPerWindow.stripTrailingZeros();
long tuplesPerWindowLong = tuplesPerWindow.longValue();
if (tuplesPerWindow.scale() > 0) {
LOG.debug("{}", tuplesPerWindow);
tuplesPerWindowLong++;
}
return tuplesPerWindowLong;
}
private static final Logger LOG = LoggerFactory.getLogger(WindowUtils.class);
}