new annontations.
Project: http://git-wip-us.apache.org/repos/asf/asterixdb/repo Commit: http://git-wip-us.apache.org/repos/asf/asterixdb/commit/22d1dbcb Tree: http://git-wip-us.apache.org/repos/asf/asterixdb/tree/22d1dbcb Diff: http://git-wip-us.apache.org/repos/asf/asterixdb/diff/22d1dbcb Branch: refs/heads/ecarm002/interval_join_merge Commit: 22d1dbcba8e2b36074f852fd5015d5ae75e66168 Parents: fd84e34 Author: Preston Carman <prest...@apache.org> Authored: Fri Jul 8 16:30:46 2016 -0700 Committer: Preston Carman <prest...@apache.org> Committed: Fri Jul 8 16:30:46 2016 -0700 ---------------------------------------------------------------------- .../rules/IntervalSplitPartitioningRule.java | 33 ++++---- .../asterix/optimizer/rules/util/JoinUtils.java | 79 ++++++++------------ .../interval_overlapping.11.query.aql | 2 +- .../interval_overlapping.12.query.aql | 2 +- .../IntervalJoinExpressionAnnotation.java | 8 +- .../IntervalPartitionUtil.java | 30 +++++++- 6 files changed, 86 insertions(+), 68 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/asterixdb/blob/22d1dbcb/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntervalSplitPartitioningRule.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntervalSplitPartitioningRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntervalSplitPartitioningRule.java index 629606c..9df5a50 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntervalSplitPartitioningRule.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntervalSplitPartitioningRule.java @@ -23,7 +23,6 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import org.apache.asterix.algebra.operators.IntervalLocalRangeSplitterOperator; import org.apache.asterix.algebra.operators.physical.IntervalIndexJoinPOperator; import org.apache.asterix.algebra.operators.physical.IntervalLocalRangeSplitterPOperator; import org.apache.asterix.algebra.operators.physical.IntervalPartitionJoinPOperator; @@ -43,13 +42,11 @@ import org.apache.hyracks.algebricks.core.algebra.base.LogicalOperatorTag; import org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable; import org.apache.hyracks.algebricks.core.algebra.base.PhysicalOperatorTag; import org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression; -import org.apache.hyracks.algebricks.core.algebra.expressions.ConstantExpression; import org.apache.hyracks.algebricks.core.algebra.expressions.VariableReferenceExpression; import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractBinaryJoinOperator.JoinKind; import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractLogicalOperator.ExecutionMode; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ExchangeOperator; -import org.apache.hyracks.algebricks.core.algebra.operators.logical.ExtensionOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.InnerJoinOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.MaterializeOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator; @@ -97,21 +94,21 @@ public class IntervalSplitPartitioningRule implements IAlgebraicRewriteRule { private static final int START_SPLITS = 3; - private static final Set<FunctionIdentifier> intervalJoinConditions = new HashSet<>(); + private static final Set<FunctionIdentifier> INTERVAL_JOIN_CONDITIONS = new HashSet<>(); static { - intervalJoinConditions.add(AsterixBuiltinFunctions.INTERVAL_AFTER); - intervalJoinConditions.add(AsterixBuiltinFunctions.INTERVAL_BEFORE); - intervalJoinConditions.add(AsterixBuiltinFunctions.INTERVAL_COVERED_BY); - intervalJoinConditions.add(AsterixBuiltinFunctions.INTERVAL_COVERS); - intervalJoinConditions.add(AsterixBuiltinFunctions.INTERVAL_ENDED_BY); - intervalJoinConditions.add(AsterixBuiltinFunctions.INTERVAL_ENDS); - intervalJoinConditions.add(AsterixBuiltinFunctions.INTERVAL_MEETS); - intervalJoinConditions.add(AsterixBuiltinFunctions.INTERVAL_MET_BY); - intervalJoinConditions.add(AsterixBuiltinFunctions.INTERVAL_OVERLAPPED_BY); - intervalJoinConditions.add(AsterixBuiltinFunctions.INTERVAL_OVERLAPPING); - intervalJoinConditions.add(AsterixBuiltinFunctions.INTERVAL_OVERLAPS); - intervalJoinConditions.add(AsterixBuiltinFunctions.INTERVAL_STARTED_BY); - intervalJoinConditions.add(AsterixBuiltinFunctions.INTERVAL_STARTS); + INTERVAL_JOIN_CONDITIONS.add(AsterixBuiltinFunctions.INTERVAL_AFTER); + INTERVAL_JOIN_CONDITIONS.add(AsterixBuiltinFunctions.INTERVAL_BEFORE); + INTERVAL_JOIN_CONDITIONS.add(AsterixBuiltinFunctions.INTERVAL_COVERED_BY); + INTERVAL_JOIN_CONDITIONS.add(AsterixBuiltinFunctions.INTERVAL_COVERS); + INTERVAL_JOIN_CONDITIONS.add(AsterixBuiltinFunctions.INTERVAL_ENDED_BY); + INTERVAL_JOIN_CONDITIONS.add(AsterixBuiltinFunctions.INTERVAL_ENDS); + INTERVAL_JOIN_CONDITIONS.add(AsterixBuiltinFunctions.INTERVAL_MEETS); + INTERVAL_JOIN_CONDITIONS.add(AsterixBuiltinFunctions.INTERVAL_MET_BY); + INTERVAL_JOIN_CONDITIONS.add(AsterixBuiltinFunctions.INTERVAL_OVERLAPPED_BY); + INTERVAL_JOIN_CONDITIONS.add(AsterixBuiltinFunctions.INTERVAL_OVERLAPPING); + INTERVAL_JOIN_CONDITIONS.add(AsterixBuiltinFunctions.INTERVAL_OVERLAPS); + INTERVAL_JOIN_CONDITIONS.add(AsterixBuiltinFunctions.INTERVAL_STARTED_BY); + INTERVAL_JOIN_CONDITIONS.add(AsterixBuiltinFunctions.INTERVAL_STARTS); } @Override @@ -321,7 +318,7 @@ public class IntervalSplitPartitioningRule implements IAlgebraicRewriteRule { } // Check whether the function is a function we want to alter. AbstractFunctionCallExpression funcExpr = (AbstractFunctionCallExpression) expr; - if (!intervalJoinConditions.contains(funcExpr.getFunctionIdentifier())) { + if (!INTERVAL_JOIN_CONDITIONS.contains(funcExpr.getFunctionIdentifier())) { return null; } ILogicalExpression funcArg = funcExpr.getArguments().get(branch).getValue(); http://git-wip-us.apache.org/repos/asf/asterixdb/blob/22d1dbcb/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/util/JoinUtils.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/util/JoinUtils.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/util/JoinUtils.java index 14b7aa6..b991531 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/util/JoinUtils.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/util/JoinUtils.java @@ -19,16 +19,16 @@ package org.apache.asterix.optimizer.rules.util; import java.util.Collection; +import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import java.util.Map; import java.util.logging.Logger; import org.apache.asterix.algebra.operators.physical.IntervalIndexJoinPOperator; import org.apache.asterix.algebra.operators.physical.IntervalPartitionJoinPOperator; import org.apache.asterix.common.annotations.IntervalJoinExpressionAnnotation; -import org.apache.asterix.common.annotations.JoinIntervalMaxDurationExpressionAnnotation; -import org.apache.asterix.common.annotations.JoinRecordCountsExpressionAnnotation; import org.apache.asterix.om.functions.AsterixBuiltinFunctions; import org.apache.asterix.runtime.operators.joins.AfterIntervalMergeJoinCheckerFactory; import org.apache.asterix.runtime.operators.joins.BeforeIntervalMergeJoinCheckerFactory; @@ -63,6 +63,30 @@ public class JoinUtils { private static final Logger LOGGER = Logger.getLogger(JoinUtils.class.getName()); + private static final Map<FunctionIdentifier, FunctionIdentifier> INTERVAL_JOIN_CONDITIONS = new HashMap<>(); + static { + INTERVAL_JOIN_CONDITIONS.put(AsterixBuiltinFunctions.INTERVAL_AFTER, AsterixBuiltinFunctions.INTERVAL_BEFORE); + INTERVAL_JOIN_CONDITIONS.put(AsterixBuiltinFunctions.INTERVAL_BEFORE, AsterixBuiltinFunctions.INTERVAL_AFTER); + INTERVAL_JOIN_CONDITIONS.put(AsterixBuiltinFunctions.INTERVAL_COVERED_BY, + AsterixBuiltinFunctions.INTERVAL_COVERS); + INTERVAL_JOIN_CONDITIONS.put(AsterixBuiltinFunctions.INTERVAL_COVERS, + AsterixBuiltinFunctions.INTERVAL_COVERED_BY); + INTERVAL_JOIN_CONDITIONS.put(AsterixBuiltinFunctions.INTERVAL_ENDED_BY, AsterixBuiltinFunctions.INTERVAL_ENDS); + INTERVAL_JOIN_CONDITIONS.put(AsterixBuiltinFunctions.INTERVAL_ENDS, AsterixBuiltinFunctions.INTERVAL_ENDED_BY); + INTERVAL_JOIN_CONDITIONS.put(AsterixBuiltinFunctions.INTERVAL_MEETS, AsterixBuiltinFunctions.INTERVAL_MET_BY); + INTERVAL_JOIN_CONDITIONS.put(AsterixBuiltinFunctions.INTERVAL_MET_BY, AsterixBuiltinFunctions.INTERVAL_MEETS); + INTERVAL_JOIN_CONDITIONS.put(AsterixBuiltinFunctions.INTERVAL_OVERLAPPED_BY, + AsterixBuiltinFunctions.INTERVAL_OVERLAPS); + INTERVAL_JOIN_CONDITIONS.put(AsterixBuiltinFunctions.INTERVAL_OVERLAPPING, + AsterixBuiltinFunctions.INTERVAL_OVERLAPPING); + INTERVAL_JOIN_CONDITIONS.put(AsterixBuiltinFunctions.INTERVAL_OVERLAPS, + AsterixBuiltinFunctions.INTERVAL_OVERLAPPED_BY); + INTERVAL_JOIN_CONDITIONS.put(AsterixBuiltinFunctions.INTERVAL_STARTED_BY, + AsterixBuiltinFunctions.INTERVAL_STARTS); + INTERVAL_JOIN_CONDITIONS.put(AsterixBuiltinFunctions.INTERVAL_STARTS, + AsterixBuiltinFunctions.INTERVAL_STARTED_BY); + } + private JoinUtils() { } @@ -114,7 +138,6 @@ public class JoinUtils { return null; } - private static void setSortMergeIntervalJoinOp(AbstractBinaryJoinOperator op, FunctionIdentifier fi, List<LogicalVariable> sideLeft, List<LogicalVariable> sideRight, IRangeMap rangeMap, IOptimizationContext context) { @@ -126,20 +149,20 @@ public class JoinUtils { private static void setIntervalPartitionJoinOp(AbstractBinaryJoinOperator op, FunctionIdentifier fi, List<LogicalVariable> sideLeft, List<LogicalVariable> sideRight, IRangeMap rangeMap, IntervalJoinExpressionAnnotation ijea, IOptimizationContext context) { - long leftCount = ijea.getLeftRecordCount() > 0 ? ijea.getLeftRecordCount() - : getCardinality(sideLeft, context); + long leftCount = ijea.getLeftRecordCount() > 0 ? ijea.getLeftRecordCount() : getCardinality(sideLeft, context); long rightCount = ijea.getRightRecordCount() > 0 ? ijea.getRightRecordCount() : getCardinality(sideRight, context); long leftMaxDuration = ijea.getLeftMaxDuration() > 0 ? ijea.getLeftMaxDuration() : getMaxDuration(sideLeft, context); long rightMaxDuration = ijea.getRightMaxDuration() > 0 ? ijea.getRightMaxDuration() : getMaxDuration(sideRight, context); + int tuplesPerFrame = ijea.getTuplesPerFrame() > 0 ? ijea.getTuplesPerFrame() + : context.getPhysicalOptimizationConfig().getMaxRecordsPerFrame(); IIntervalMergeJoinCheckerFactory mjcf = getIntervalMergeJoinCheckerFactory(fi, rangeMap); op.setPhysicalOperator(new IntervalPartitionJoinPOperator(op.getJoinKind(), JoinPartitioningType.BROADCAST, sideLeft, sideRight, context.getPhysicalOptimizationConfig().getMaxFramesForJoin(), leftCount, - rightCount, leftMaxDuration, rightMaxDuration, - context.getPhysicalOptimizationConfig().getMaxRecordsPerFrame(), mjcf, rangeMap)); + rightCount, leftMaxDuration, rightMaxDuration, tuplesPerFrame, mjcf, rangeMap)); } private static void setIntervalIndexJoinOp(AbstractBinaryJoinOperator op, FunctionIdentifier fi, @@ -235,48 +258,12 @@ public class JoinUtils { } private static boolean isIntervalFunction(FunctionIdentifier fi) { - return fi.equals(AsterixBuiltinFunctions.INTERVAL_OVERLAPPING) - || fi.equals(AsterixBuiltinFunctions.INTERVAL_OVERLAPS) - || fi.equals(AsterixBuiltinFunctions.INTERVAL_OVERLAPPED_BY) - || fi.equals(AsterixBuiltinFunctions.INTERVAL_COVERS) - || fi.equals(AsterixBuiltinFunctions.INTERVAL_COVERED_BY) - || fi.equals(AsterixBuiltinFunctions.INTERVAL_AFTER) - || fi.equals(AsterixBuiltinFunctions.INTERVAL_BEFORE) - || fi.equals(AsterixBuiltinFunctions.INTERVAL_MEETS) - || fi.equals(AsterixBuiltinFunctions.INTERVAL_MET_BY) - || fi.equals(AsterixBuiltinFunctions.INTERVAL_STARTS) - || fi.equals(AsterixBuiltinFunctions.INTERVAL_STARTED_BY) - || fi.equals(AsterixBuiltinFunctions.INTERVAL_ENDS) - || fi.equals(AsterixBuiltinFunctions.INTERVAL_ENDED_BY); + return INTERVAL_JOIN_CONDITIONS.containsKey(fi); } private static FunctionIdentifier reverseIntervalExpression(FunctionIdentifier fi) { - if (fi.equals(AsterixBuiltinFunctions.INTERVAL_OVERLAPS)) { - return AsterixBuiltinFunctions.INTERVAL_OVERLAPPED_BY; - } else if (fi.equals(AsterixBuiltinFunctions.INTERVAL_OVERLAPPED_BY)) { - return AsterixBuiltinFunctions.INTERVAL_OVERLAPS; - } else if (fi.equals(AsterixBuiltinFunctions.INTERVAL_OVERLAPPING)) { - return AsterixBuiltinFunctions.INTERVAL_OVERLAPPING; - } else if (fi.equals(AsterixBuiltinFunctions.INTERVAL_COVERS)) { - return AsterixBuiltinFunctions.INTERVAL_COVERED_BY; - } else if (fi.equals(AsterixBuiltinFunctions.INTERVAL_COVERED_BY)) { - return AsterixBuiltinFunctions.INTERVAL_COVERS; - } else if (fi.equals(AsterixBuiltinFunctions.INTERVAL_STARTS)) { - return AsterixBuiltinFunctions.INTERVAL_STARTED_BY; - } else if (fi.equals(AsterixBuiltinFunctions.INTERVAL_STARTED_BY)) { - return AsterixBuiltinFunctions.INTERVAL_STARTS; - } else if (fi.equals(AsterixBuiltinFunctions.INTERVAL_ENDS)) { - return AsterixBuiltinFunctions.INTERVAL_ENDED_BY; - } else if (fi.equals(AsterixBuiltinFunctions.INTERVAL_ENDED_BY)) { - return AsterixBuiltinFunctions.INTERVAL_ENDS; - } else if (fi.equals(AsterixBuiltinFunctions.INTERVAL_AFTER)) { - return AsterixBuiltinFunctions.INTERVAL_BEFORE; - } else if (fi.equals(AsterixBuiltinFunctions.INTERVAL_BEFORE)) { - return AsterixBuiltinFunctions.INTERVAL_AFTER; - } else if (fi.equals(AsterixBuiltinFunctions.INTERVAL_MET_BY)) { - return AsterixBuiltinFunctions.INTERVAL_MEETS; - } else if (fi.equals(AsterixBuiltinFunctions.INTERVAL_MEETS)) { - return AsterixBuiltinFunctions.INTERVAL_MET_BY; + if (INTERVAL_JOIN_CONDITIONS.containsKey(fi)) { + return INTERVAL_JOIN_CONDITIONS.get(fi); } return null; } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/22d1dbcb/asterixdb/asterix-app/src/test/resources/runtimets/queries/temporal/interval_joins/interval_overlapping/interval_overlapping.11.query.aql ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temporal/interval_joins/interval_overlapping/interval_overlapping.11.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temporal/interval_joins/interval_overlapping/interval_overlapping.11.query.aql index 1fe23da..7cf839d 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temporal/interval_joins/interval_overlapping/interval_overlapping.11.query.aql +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temporal/interval_joins/interval_overlapping/interval_overlapping.11.query.aql @@ -26,7 +26,7 @@ use dataverse TinyCollege; for $f in dataset Staff for $d in dataset Students -where /*+ interval-partition-join [10000,11000,12000,14000,15000] 7 7 400 400 */ interval-overlapping($d.attendance, $f.employment) +where /*+ interval-partition-join [10000,11000,12000,14000,15000] 7 7 400 400 300 */ interval-overlapping($d.attendance, $f.employment) /*+ range ["F", "L", "R"] */ order by $f.name, $d.name return { "staff" : $f.name, "student" : $d.name } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/22d1dbcb/asterixdb/asterix-app/src/test/resources/runtimets/queries/temporal/interval_joins/interval_overlapping/interval_overlapping.12.query.aql ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temporal/interval_joins/interval_overlapping/interval_overlapping.12.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temporal/interval_joins/interval_overlapping/interval_overlapping.12.query.aql index 2057130..aa55cec 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temporal/interval_joins/interval_overlapping/interval_overlapping.12.query.aql +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temporal/interval_joins/interval_overlapping/interval_overlapping.12.query.aql @@ -26,7 +26,7 @@ use dataverse TinyCollege; for $f in dataset Staff for $d in dataset Students -where /*+ interval-partition-join [10000,11000,12000,14000,15000] 7 7 400 400 */ interval-overlapping($f.employment, $d.attendance) +where /*+ interval-partition-join [10000,11000,12000,14000,15000] 7 7 400 400 300 */ interval-overlapping($f.employment, $d.attendance) /*+ range ["F", "L", "R"] */ order by $f.name, $d.name return { "staff" : $f.name, "student" : $d.name } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/22d1dbcb/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/annotations/IntervalJoinExpressionAnnotation.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/annotations/IntervalJoinExpressionAnnotation.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/annotations/IntervalJoinExpressionAnnotation.java index f2f325d..7d4f02a 100644 --- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/annotations/IntervalJoinExpressionAnnotation.java +++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/annotations/IntervalJoinExpressionAnnotation.java @@ -37,6 +37,7 @@ public class IntervalJoinExpressionAnnotation extends AbstractExpressionAnnotati private long rightMaxDuration = -1; private long leftRecordCount = -1; private long rightRecordCount = -1; + private int tuplesPerFrame = -1; @Override @@ -56,11 +57,12 @@ public class IntervalJoinExpressionAnnotation extends AbstractExpressionAnnotati String[] args = ((String) object).split(" "); setJoinType(args[0]); - if (joinType.equals(PARTITION_HINT_STRING) && args.length == 6) { + if (joinType.equals(PARTITION_HINT_STRING) && args.length == 7) { leftRecordCount = Long.valueOf(args[2]); rightRecordCount = Long.valueOf(args[3]); leftMaxDuration = Long.valueOf(args[4]); rightMaxDuration = Long.valueOf(args[5]); + tuplesPerFrame = Integer.valueOf(args[6]); } } @@ -94,6 +96,10 @@ public class IntervalJoinExpressionAnnotation extends AbstractExpressionAnnotati return rightRecordCount; } + public int getTuplesPerFrame() { + return tuplesPerFrame; + } + public void setRangeMap(IRangeMap map) { this.map = map; } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/22d1dbcb/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/joins/intervalpartition/IntervalPartitionUtil.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/joins/intervalpartition/IntervalPartitionUtil.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/joins/intervalpartition/IntervalPartitionUtil.java index c6e95e1..4752e00 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/joins/intervalpartition/IntervalPartitionUtil.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/joins/intervalpartition/IntervalPartitionUtil.java @@ -27,16 +27,44 @@ import java.util.Map.Entry; import org.apache.asterix.runtime.operators.joins.IIntervalMergeJoinChecker; import org.apache.hyracks.algebricks.common.utils.Pair; +import org.apache.hyracks.algebricks.core.rewriter.base.PhysicalOptimizationConfig; import org.apache.hyracks.data.std.primitive.LongPointable; import org.apache.hyracks.dataflow.common.data.partition.range.IRangeMap; public class IntervalPartitionUtil { public static final double C_CPU = 0.5; - public static final double C_IO = 10; + public static final double C_IO = 100; private IntervalPartitionUtil() { } + public static void main(String[] args) { + +// +// PhysicalOptimizationConfig poc = new PhysicalOptimizationConfig(); +// +// long[] countList = { poc.getMaxFramesForJoinLeftInput() }; +// long[] maxDurationList = { poc.getMaxIntervalDuration() }; +// int[] tuplesList = { poc.getMaxRecordsPerFrame() }; + + long[] countList = { 2441, 9766, 39063, 156250, 625000, 2500000, 10000000 }; + long[] maxDurationList = { 1, 3, 30, 300, 3000, 30000, 300000 }; + int[] tuplesList = { 5, 50, 300, 900 }; + + + int k; + for (long count : countList) { + for (long maxDuration : maxDurationList) { + for (int tuples : tuplesList) { + k = determineK(count, maxDuration, count, maxDuration, tuples); + System.err.println( + "size: " + count + " duration: " + maxDuration + " tuples: " + tuples + " k: " + k); + } + } + } + + } + public static int determineK(long countR, long maxDurationR, long countS, long maxDurationS, int avgTuplePerFrame) { double deltaR = 1.0 / maxDurationR; double deltaS = 1.0 / maxDurationS;