diff --git a/processing/src/main/java/org/apache/druid/query/rowsandcols/ArrayListRowsAndColumns.java b/processing/src/main/java/org/apache/druid/query/rowsandcols/ArrayListRowsAndColumns.java index 073fad16a4bb..92c10fb8e8e8 100644 --- a/processing/src/main/java/org/apache/druid/query/rowsandcols/ArrayListRowsAndColumns.java +++ b/processing/src/main/java/org/apache/druid/query/rowsandcols/ArrayListRowsAndColumns.java @@ -291,7 +291,8 @@ public int compare(int lhs, int rhs) swappers.add(swapper); } - Arrays.quickSort( + // Use stable sort, so peer rows retain original order. + Arrays.mergeSort( 0, rows.size(), (lhs, rhs) -> { diff --git a/processing/src/main/java/org/apache/druid/query/rowsandcols/semantic/DefaultNaiveSortMaker.java b/processing/src/main/java/org/apache/druid/query/rowsandcols/semantic/DefaultNaiveSortMaker.java index a21651e0d2a0..45915dd9b5c6 100644 --- a/processing/src/main/java/org/apache/druid/query/rowsandcols/semantic/DefaultNaiveSortMaker.java +++ b/processing/src/main/java/org/apache/druid/query/rowsandcols/semantic/DefaultNaiveSortMaker.java @@ -97,7 +97,9 @@ public RowsAndColumns complete() } final int numColsToCompare = index; - Arrays.quickSort( + + // Use stable sort, so peer rows retain original order. + Arrays.mergeSort( 0, rac.numRows(), (k1, k2) -> { diff --git a/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidCorrelateUnnestRel.java b/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidCorrelateUnnestRel.java index 847c41b63ede..53421807f2e3 100644 --- a/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidCorrelateUnnestRel.java +++ b/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidCorrelateUnnestRel.java @@ -122,7 +122,7 @@ public DruidCorrelateUnnestRel withPartialQuery(PartialDruidQuery newQueryBuilde { return new DruidCorrelateUnnestRel( getCluster(), - getTraitSet().plusAll(newQueryBuilder.getRelTraits()), + newQueryBuilder.getTraitSet(getConvention()), correlateRel, newQueryBuilder, leftFilter, diff --git a/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidJoinQueryRel.java b/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidJoinQueryRel.java index 293dba817a8b..d0f6f7bef250 100644 --- a/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidJoinQueryRel.java +++ b/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidJoinQueryRel.java @@ -124,7 +124,7 @@ public DruidJoinQueryRel withPartialQuery(final PartialDruidQuery newQueryBuilde { return new DruidJoinQueryRel( getCluster(), - getTraitSet().plusAll(newQueryBuilder.getRelTraits()), + newQueryBuilder.getTraitSet(getConvention()), joinRel, leftFilter, newQueryBuilder, @@ -136,7 +136,7 @@ public DruidJoinQueryRel withPartialQuery(final PartialDruidQuery newQueryBuilde public DruidQuery toDruidQuery(final boolean finalizeAggregations) { final DruidRel leftDruidRel = (DruidRel) left; - final DruidQuery leftQuery = Preconditions.checkNotNull((leftDruidRel).toDruidQuery(false), "leftQuery"); + final DruidQuery leftQuery = Preconditions.checkNotNull(leftDruidRel.toDruidQuery(false), "leftQuery"); final RowSignature leftSignature = leftQuery.getOutputRowSignature(); final DataSource leftDataSource; diff --git a/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidOuterQueryRel.java b/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidOuterQueryRel.java index d9bd16343ef1..e679f2755368 100644 --- a/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidOuterQueryRel.java +++ b/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidOuterQueryRel.java @@ -73,7 +73,7 @@ public static DruidOuterQueryRel create( { return new DruidOuterQueryRel( sourceRel.getCluster(), - sourceRel.getTraitSet().plusAll(partialQuery.getRelTraits()), + partialQuery.getTraitSet(sourceRel.getConvention()), sourceRel, partialQuery, sourceRel.getPlannerContext() @@ -91,7 +91,7 @@ public DruidOuterQueryRel withPartialQuery(final PartialDruidQuery newQueryBuild { return new DruidOuterQueryRel( getCluster(), - getTraitSet().plusAll(newQueryBuilder.getRelTraits()), + newQueryBuilder.getTraitSet(getConvention()), sourceRel, newQueryBuilder, getPlannerContext() diff --git a/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidQuery.java b/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidQuery.java index 22f5a2cbf345..180c53747f2a 100644 --- a/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidQuery.java +++ b/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidQuery.java @@ -473,6 +473,7 @@ private static Grouping computeGrouping( * @param virtualColumnRegistry re-usable virtual column references * @param typeFactory factory for SQL types * @return dimensions + * * @throws CannotBuildQueryException if dimensions cannot be computed */ private static List computeDimensions( @@ -582,7 +583,9 @@ private static Subtotals computeSubtotals( * @param finalizeAggregations true if this query should include explicit finalization for all of its * aggregators, where required. Useful for subqueries where Druid's native query layer * does not do this automatically. + * * @return aggregations + * * @throws CannotBuildQueryException if dimensions cannot be computed */ private static List computeAggregations( @@ -876,8 +879,6 @@ private static Filtration toFiltration(DimFilter filter, VirtualColumnRegistry v *

* Necessary because some combinations are unsafe, mainly because they would lead to the creation of too many * time-granular buckets during query processing. - * - * @see Granularity#getIterable(Interval) the problematic method call we are trying to avoid */ private static boolean canUseQueryGranularity( final DataSource dataSource, @@ -954,11 +955,6 @@ public Query getQuery() */ private Query computeQuery() { - if (windowing != null) { - // Windowing can only be handled by window queries. - return toWindowQuery(); - } - if (dataSource instanceof QueryDataSource) { // If there is a subquery, then we prefer the outer query to be a groupBy if possible, since this potentially // enables more efficient execution. (The groupBy query toolchest can handle some subqueries by itself, without @@ -970,6 +966,11 @@ private Query computeQuery() } } + final WindowOperatorQuery operatorQuery = toWindowQuery(); + if (operatorQuery != null) { + return operatorQuery; + } + final TimeBoundaryQuery timeBoundaryQuery = toTimeBoundaryQuery(); if (timeBoundaryQuery != null) { return timeBoundaryQuery; @@ -1010,7 +1011,8 @@ private TimeBoundaryQuery toTimeBoundaryQuery() || grouping == null || grouping.getSubtotals().hasEffect(grouping.getDimensionSpecs()) || grouping.getHavingFilter() != null - || selectProjection != null) { + || selectProjection != null + || windowing != null) { return null; } @@ -1074,7 +1076,8 @@ private TimeseriesQuery toTimeseriesQuery() if (!plannerContext.engineHasFeature(EngineFeature.TIMESERIES_QUERY) || grouping == null || grouping.getSubtotals().hasEffect(grouping.getDimensionSpecs()) - || grouping.getHavingFilter() != null) { + || grouping.getHavingFilter() != null + || windowing != null) { return null; } @@ -1194,7 +1197,7 @@ private TopNQuery toTopNQuery() } // Must have GROUP BY one column, no GROUPING SETS, ORDER BY ≤ 1 column, LIMIT > 0 and ≤ maxTopNLimit, - // no OFFSET, no HAVING. + // no OFFSET, no HAVING, no windowing. final boolean topNOk = grouping != null && grouping.getDimensions().size() == 1 && !grouping.getSubtotals().hasEffect(grouping.getDimensionSpecs()) @@ -1205,7 +1208,8 @@ private TopNQuery toTopNQuery() && sorting.getOffsetLimit().getLimit() <= plannerContext.getPlannerConfig() .getMaxTopNLimit() && !sorting.getOffsetLimit().hasOffset()) - && grouping.getHavingFilter() == null; + && grouping.getHavingFilter() == null + && windowing == null; if (!topNOk) { return null; @@ -1284,7 +1288,7 @@ private TopNQuery toTopNQuery() @Nullable private GroupByQuery toGroupByQuery() { - if (grouping == null) { + if (grouping == null || windowing != null) { return null; } @@ -1429,8 +1433,8 @@ private WindowOperatorQuery toWindowQuery() @Nullable private ScanQuery toScanQuery() { - if (grouping != null) { - // Scan cannot GROUP BY. + if (grouping != null || windowing != null) { + // Scan cannot GROUP BY or do windows. return null; } @@ -1484,16 +1488,16 @@ private ScanQuery toScanQuery() // Cannot handle this ordering. // Scan cannot ORDER BY non-time columns. plannerContext.setPlanningError( - "SQL query requires order by non-time column %s that is not supported.", + "SQL query requires order by non-time column %s, which is not supported.", orderByColumns ); return null; } if (!dataSource.isConcrete()) { // Cannot handle this ordering. - // Scan cannot ORDER BY non-time columns. + // Scan cannot ORDER BY non-concrete datasources on _any_ column. plannerContext.setPlanningError( - "SQL query is a scan and requires order by on a datasource[%s], which is not supported.", + "SQL query requires order by on non-concrete datasource [%s], which is not supported.", dataSource ); return null; diff --git a/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidQueryRel.java b/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidQueryRel.java index 3e5c72a71fdd..61999f8ad65f 100644 --- a/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidQueryRel.java +++ b/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidQueryRel.java @@ -37,7 +37,6 @@ import org.apache.druid.sql.calcite.table.DruidTable; import javax.annotation.Nullable; - import java.util.Set; /** @@ -170,7 +169,7 @@ public DruidQueryRel withPartialQuery(final PartialDruidQuery newQueryBuilder) { return new DruidQueryRel( getCluster(), - getTraitSet().plusAll(newQueryBuilder.getRelTraits()), + newQueryBuilder.getTraitSet(getConvention()), table, druidTable, getPlannerContext(), diff --git a/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidUnionDataSourceRel.java b/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidUnionDataSourceRel.java index 15e363af1e23..5e213de711cc 100644 --- a/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidUnionDataSourceRel.java +++ b/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidUnionDataSourceRel.java @@ -107,7 +107,7 @@ public DruidUnionDataSourceRel withPartialQuery(final PartialDruidQuery newQuery { return new DruidUnionDataSourceRel( getCluster(), - getTraitSet().plusAll(newQueryBuilder.getRelTraits()), + newQueryBuilder.getTraitSet(getConvention()), unionRel, unionColumnNames, newQueryBuilder, diff --git a/sql/src/main/java/org/apache/druid/sql/calcite/rel/PartialDruidQuery.java b/sql/src/main/java/org/apache/druid/sql/calcite/rel/PartialDruidQuery.java index 0cd71af8e5e7..ae1a007b62cd 100644 --- a/sql/src/main/java/org/apache/druid/sql/calcite/rel/PartialDruidQuery.java +++ b/sql/src/main/java/org/apache/druid/sql/calcite/rel/PartialDruidQuery.java @@ -20,8 +20,15 @@ package org.apache.druid.sql.calcite.rel; import com.google.common.base.Preconditions; +import it.unimi.dsi.fastutil.ints.Int2IntMap; +import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; +import org.apache.calcite.plan.Convention; import org.apache.calcite.plan.RelOptUtil; -import org.apache.calcite.plan.RelTrait; +import org.apache.calcite.plan.RelTraitSet; +import org.apache.calcite.rel.RelCollation; +import org.apache.calcite.rel.RelCollationTraitDef; +import org.apache.calcite.rel.RelCollations; +import org.apache.calcite.rel.RelFieldCollation; import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.core.Aggregate; import org.apache.calcite.rel.core.Filter; @@ -31,6 +38,7 @@ import org.apache.calcite.rel.core.Window; import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rex.RexBuilder; +import org.apache.calcite.rex.RexInputRef; import org.apache.calcite.rex.RexNode; import org.apache.calcite.rex.RexUtil; import org.apache.calcite.sql.SqlKind; @@ -41,6 +49,7 @@ import org.apache.druid.sql.calcite.planner.PlannerContext; import javax.annotation.Nullable; +import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.function.Supplier; @@ -61,6 +70,7 @@ public class PartialDruidQuery private final Sort sort; private final Project sortProject; private final Window window; + private final Project windowProject; public enum Stage { @@ -71,19 +81,53 @@ public enum Stage WHERE_FILTER, SELECT_PROJECT, - // AGGREGATE, HAVING_FILTER, AGGREGATE_PROJECT can only be present on non-WINDOW aggregating queries. + // AGGREGATE, HAVING_FILTER, AGGREGATE_PROJECT can be present on non-WINDOW aggregating queries. AGGREGATE, - HAVING_FILTER, - AGGREGATE_PROJECT, + HAVING_FILTER { + @Override + public boolean canFollow(Stage stage) + { + return stage == AGGREGATE; + } + }, + AGGREGATE_PROJECT { + @Override + public boolean canFollow(Stage stage) + { + return stage == AGGREGATE || stage == HAVING_FILTER; + } + }, // SORT, SORT_PROJECT may be present on any query, except ones with WINDOW. SORT, - SORT_PROJECT, - - // WINDOW may be present only together with SCAN. - WINDOW, + SORT_PROJECT { + @Override + public boolean canFollow(Stage stage) + { + return stage == SORT; + } + }, + + // WINDOW, WINDOW_PROJECT may be present only together with SCAN. + WINDOW { + @Override + public boolean canFollow(Stage stage) + { + return stage == SCAN; + } + }, + WINDOW_PROJECT { + @Override + public boolean canFollow(Stage stage) + { + return stage == WINDOW; + } + }; - UNNEST_PROJECT + public boolean canFollow(final Stage stage) + { + return stage.compareTo(this) < 0; + } } private PartialDruidQuery( @@ -97,6 +141,7 @@ private PartialDruidQuery( final Sort sort, final Project sortProject, final Window window, + final Project windowProject, final Project unnestProject ) { @@ -110,16 +155,28 @@ private PartialDruidQuery( this.sort = sort; this.sortProject = sortProject; this.window = window; + this.windowProject = windowProject; this.unnestProject = unnestProject; } - public static PartialDruidQuery create(final RelNode scanRel) + public static PartialDruidQuery create(final RelNode inputRel) { final Supplier builderSupplier = () -> RelFactories.LOGICAL_BUILDER.create( - scanRel.getCluster(), - scanRel.getTable() != null ? scanRel.getTable().getRelOptSchema() : null + inputRel.getCluster(), + inputRel.getTable() != null ? inputRel.getTable().getRelOptSchema() : null + ); + return new PartialDruidQuery(builderSupplier, inputRel, null, null, null, null, null, null, null, null, null, null); + } + + public static PartialDruidQuery createOuterQuery(final PartialDruidQuery inputQuery) + { + final RelNode inputRel = inputQuery.leafRel(); + return create( + inputRel.copy( + inputQuery.getTraitSet(inputRel.getConvention()), + inputRel.getInputs() + ) ); - return new PartialDruidQuery(builderSupplier, scanRel, null, null, null, null, null, null, null, null, null); } public RelNode getScan() @@ -172,6 +229,11 @@ public Window getWindow() return window; } + public Project getWindowProject() + { + return windowProject; + } + public PartialDruidQuery withWhereFilter(final Filter newWhereFilter) { validateStage(Stage.WHERE_FILTER); @@ -186,6 +248,7 @@ public PartialDruidQuery withWhereFilter(final Filter newWhereFilter) sort, sortProject, window, + windowProject, unnestProject ); } @@ -230,6 +293,7 @@ public PartialDruidQuery withSelectProject(final Project newSelectProject) sort, sortProject, window, + windowProject, unnestProject ); } @@ -248,6 +312,7 @@ public PartialDruidQuery withAggregate(final Aggregate newAggregate) sort, sortProject, window, + windowProject, unnestProject ); } @@ -266,6 +331,7 @@ public PartialDruidQuery withHavingFilter(final Filter newHavingFilter) sort, sortProject, window, + windowProject, unnestProject ); } @@ -284,6 +350,7 @@ public PartialDruidQuery withAggregateProject(final Project newAggregateProject) sort, sortProject, window, + windowProject, unnestProject ); } @@ -302,6 +369,7 @@ public PartialDruidQuery withSort(final Sort newSort) newSort, sortProject, window, + windowProject, unnestProject ); } @@ -320,6 +388,7 @@ public PartialDruidQuery withSortProject(final Project newSortProject) sort, newSortProject, window, + windowProject, unnestProject ); } @@ -338,6 +407,7 @@ public PartialDruidQuery withWindow(final Window newWindow) sort, sortProject, newWindow, + windowProject, unnestProject ); } @@ -355,18 +425,96 @@ public PartialDruidQuery withUnnest(final Project newUnnestProject) sort, sortProject, window, + windowProject, newUnnestProject ); } + public PartialDruidQuery withWindowProject(final Project newWindowProject) + { + validateStage(Stage.WINDOW_PROJECT); + return new PartialDruidQuery( + builderSupplier, + scan, + whereFilter, + selectProject, + aggregate, + aggregateProject, + havingFilter, + sort, + sortProject, + window, + newWindowProject, + unnestProject + ); + } + public RelDataType getRowType() { return leafRel().getRowType(); } - public RelTrait[] getRelTraits() + /** + * Get traits for this partial query. + * + * This is the traits from {@link #leafRel()}, plus {@link RelCollationTraitDef} if {@link #stage()} is + * {@link Stage#AGGREGATE} or {@link Stage#AGGREGATE_PROJECT} (to represent the fact that Druid sorts by grouping + * keys when grouping). + * + * @param convention convention to include in the returned array + */ + public RelTraitSet getTraitSet(final Convention convention) { - return leafRel().getTraitSet().toArray(new RelTrait[0]); + final RelTraitSet leafRelTraits = leafRel().getTraitSet(); + + final Stage currentStage = stage(); + + switch (currentStage) { + case AGGREGATE: + case AGGREGATE_PROJECT: + final RelCollation collation = leafRelTraits.getTrait(RelCollationTraitDef.INSTANCE); + if ((collation == null || collation.getFieldCollations().isEmpty()) && aggregate.getGroupSets().size() == 1) { + // Druid sorts by grouping keys when grouping. Add the collation. + // Note: [aggregate.getGroupSets().size() == 1] above means that collation isn't added for GROUPING SETS. + final List sortFields = new ArrayList<>(); + + if (currentStage == Stage.AGGREGATE) { + for (int i = 0; i < aggregate.getGroupCount(); i++) { + sortFields.add(new RelFieldCollation(i)); + } + } else { + // AGGREGATE_PROJECT + final List projectExprs = aggregateProject.getProjects(); + + // Build a map of all Project exprs that are input refs. Project expr index -> dimension index. + final Int2IntMap dimensionMapping = new Int2IntOpenHashMap(); + dimensionMapping.defaultReturnValue(-1); + for (int i = 0; i < projectExprs.size(); i++) { + RexNode projectExpr = projectExprs.get(i); + if (projectExpr.isA(SqlKind.INPUT_REF)) { + dimensionMapping.put(((RexInputRef) projectExpr).getIndex(), i); + } + } + + // Add collations for dimensions so long as they are all mappings. + for (int i = 0; i < aggregate.getGroupCount(); i++) { + final int mapping = dimensionMapping.applyAsInt(i); + if (mapping >= 0) { + sortFields.add(new RelFieldCollation(mapping)); + } else { + // As soon as we see a non-mapping, stop adding. + break; + } + } + } + + return leafRelTraits.plus(convention).plus(RelCollations.of(sortFields)); + } + // Fall through. + + default: + return leafRelTraits.plus(convention); + } } public DruidQuery build( @@ -410,26 +558,7 @@ public DruidQuery build( public boolean canAccept(final Stage stage) { - final Stage currentStage = stage(); - - if (stage == Stage.WINDOW) { - // Special case: WINDOW can only be provided along with SCAN. - return currentStage == Stage.SCAN; - } else if (currentStage == Stage.SELECT_PROJECT && stage == Stage.SELECT_PROJECT) { - // Special case: allow layering SELECT_PROJECT on top of SELECT_PROJECT. Calcite's builtin rules cannot - // always collapse these, so we have to (one example: testSemiJoinWithOuterTimeExtract). See - // withSelectProject for the code here that handles this. - return true; - } else if (stage.compareTo(currentStage) <= 0) { - // Cannot go backwards. - return false; - } else if (stage.compareTo(Stage.AGGREGATE) > 0 && stage.compareTo(Stage.SORT) < 0 && aggregate == null) { - // Cannot do post-aggregation stages without an aggregation. - return false; - } else { - // If we are after the SORT phase, make sure we have a sort... - return stage.compareTo(Stage.SORT) <= 0 || sort != null; - } + return stage.canFollow(stage()); } /** @@ -441,7 +570,9 @@ public boolean canAccept(final Stage stage) @SuppressWarnings("VariableNotUsedInsideIf") public Stage stage() { - if (window != null) { + if (windowProject != null) { + return Stage.WINDOW_PROJECT; + } else if (window != null) { return Stage.WINDOW; } else if (sortProject != null) { return Stage.SORT_PROJECT; @@ -472,6 +603,8 @@ public RelNode leafRel() final Stage currentStage = stage(); switch (currentStage) { + case WINDOW_PROJECT: + return windowProject; case WINDOW: return window; case SORT_PROJECT: @@ -504,7 +637,7 @@ public double estimateCost() // Account for the cost of post-scan expressions. if (getSelectProject() != null) { - for (final RexNode rexNode : getSelectProject().getChildExps()) { + for (final RexNode rexNode : getSelectProject().getProjects()) { if (!rexNode.isA(SqlKind.INPUT_REF)) { cost += CostEstimates.COST_EXPRESSION; } @@ -534,7 +667,7 @@ public double estimateCost() // Account for the cost of post-aggregation expressions. if (getAggregateProject() != null) { - for (final RexNode rexNode : getAggregateProject().getChildExps()) { + for (final RexNode rexNode : getAggregateProject().getProjects()) { if (!rexNode.isA(SqlKind.INPUT_REF)) { cost += CostEstimates.COST_EXPRESSION; } @@ -543,7 +676,7 @@ public double estimateCost() // Account for the cost of post-sort expressions. if (getSortProject() != null) { - for (final RexNode rexNode : getSortProject().getChildExps()) { + for (final RexNode rexNode : getSortProject().getProjects()) { if (!rexNode.isA(SqlKind.INPUT_REF)) { cost += CostEstimates.COST_EXPRESSION; } @@ -564,7 +697,7 @@ private void validateStage(final Stage stage) } @Override - public boolean equals(final Object o) + public boolean equals(Object o) { if (this == o) { return true; @@ -572,15 +705,18 @@ public boolean equals(final Object o) if (o == null || getClass() != o.getClass()) { return false; } - final PartialDruidQuery that = (PartialDruidQuery) o; - return Objects.equals(scan, that.scan) && - Objects.equals(whereFilter, that.whereFilter) && - Objects.equals(selectProject, that.selectProject) && - Objects.equals(aggregate, that.aggregate) && - Objects.equals(havingFilter, that.havingFilter) && - Objects.equals(aggregateProject, that.aggregateProject) && - Objects.equals(sort, that.sort) && - Objects.equals(sortProject, that.sortProject); + PartialDruidQuery that = (PartialDruidQuery) o; + return Objects.equals(scan, that.scan) + && Objects.equals(whereFilter, that.whereFilter) + && Objects.equals(selectProject, that.selectProject) + && Objects.equals(aggregate, that.aggregate) + && Objects.equals(havingFilter, that.havingFilter) + && Objects.equals(aggregateProject, that.aggregateProject) + && Objects.equals(sort, that.sort) + && Objects.equals(sortProject, that.sortProject) + && Objects.equals(window, that.window) + && Objects.equals(windowProject, that.windowProject) + && Objects.equals(unnestProject, that.unnestProject); } @Override @@ -594,7 +730,10 @@ public int hashCode() havingFilter, aggregateProject, sort, - sortProject + sortProject, + window, + windowProject, + unnestProject ); } @@ -610,6 +749,8 @@ public String toString() ", aggregateProject=" + aggregateProject + ", sort=" + sort + ", sortProject=" + sortProject + + ", window=" + window + + ", windowProject=" + windowProject + ", unnestProject=" + unnestProject + '}'; } diff --git a/sql/src/main/java/org/apache/druid/sql/calcite/rel/Windowing.java b/sql/src/main/java/org/apache/druid/sql/calcite/rel/Windowing.java index 6eb1c6b1e588..af5983d6edbf 100644 --- a/sql/src/main/java/org/apache/druid/sql/calcite/rel/Windowing.java +++ b/sql/src/main/java/org/apache/druid/sql/calcite/rel/Windowing.java @@ -22,6 +22,8 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; +import org.apache.calcite.rel.RelCollation; +import org.apache.calcite.rel.RelCollationTraitDef; import org.apache.calcite.rel.RelFieldCollation; import org.apache.calcite.rel.core.AggregateCall; import org.apache.calcite.rel.core.Project; @@ -32,6 +34,7 @@ import org.apache.calcite.rex.RexLiteral; import org.apache.calcite.rex.RexNode; import org.apache.calcite.rex.RexWindowBound; +import org.apache.calcite.util.mapping.Mappings; import org.apache.druid.java.util.common.ISE; import org.apache.druid.java.util.common.StringUtils; import org.apache.druid.query.QueryException; @@ -65,6 +68,7 @@ import javax.annotation.Nonnull; import java.util.ArrayList; import java.util.Collections; +import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; @@ -111,7 +115,7 @@ public class Windowing public static Windowing fromCalciteStuff( final PartialDruidQuery partialQuery, final PlannerContext plannerContext, - final RowSignature rowSignature, + final RowSignature sourceRowSignature, final RexBuilder rexBuilder ) { @@ -119,31 +123,45 @@ public static Windowing fromCalciteStuff( ArrayList ops = new ArrayList<>(); - final List expectedOutputColumns = new ArrayList<>(rowSignature.getColumnNames()); - final String outputNamePrefix = Calcites.findUnusedPrefixForDigits("w", rowSignature.getColumnNames()); + final List windowOutputColumns = new ArrayList<>(sourceRowSignature.getColumnNames()); + final String outputNamePrefix = Calcites.findUnusedPrefixForDigits("w", sourceRowSignature.getColumnNames()); int outputNameCounter = 0; + + // Track prior partition columns and sort columns group-to-group, so we only insert sorts and repartitions if + // we really need to. + List priorPartitionColumns = null; + LinkedHashSet priorSortColumns = new LinkedHashSet<>(); + + final RelCollation priorCollation = partialQuery.getScan().getTraitSet().getTrait(RelCollationTraitDef.INSTANCE); + if (priorCollation != null) { + // Populate initial priorSortColumns using collation of the input to the window operation. Allows us to skip + // the initial sort operator if the rows were already in the desired order. + priorSortColumns = computeSortColumnsFromRelCollation(priorCollation, sourceRowSignature); + } + for (int i = 0; i < window.groups.size(); ++i) { - final WindowGroup group = new WindowGroup(window, window.groups.get(i), rowSignature); + final WindowGroup group = new WindowGroup(window, window.groups.get(i), sourceRowSignature); - if (i > 0) { - LinkedHashSet sortColumns = new LinkedHashSet<>(); - for (String partitionColumn : group.getPartitionColumns()) { - sortColumns.add(ColumnWithDirection.ascending(partitionColumn)); - } - sortColumns.addAll(group.getOrdering()); + final LinkedHashSet sortColumns = new LinkedHashSet<>(); + for (String partitionColumn : group.getPartitionColumns()) { + sortColumns.add(ColumnWithDirection.ascending(partitionColumn)); + } + sortColumns.addAll(group.getOrdering()); + // Add sorting and partitioning if needed. + if (!sortMatches(priorSortColumns, sortColumns)) { + // Sort order needs to change. Resort and repartition. ops.add(new NaiveSortOperatorFactory(new ArrayList<>(sortColumns))); + ops.add(new NaivePartitioningOperatorFactory(group.getPartitionColumns())); + priorSortColumns = sortColumns; + priorPartitionColumns = group.getPartitionColumns(); + } else if (!group.getPartitionColumns().equals(priorPartitionColumns)) { + // Sort order doesn't need to change, but partitioning does. Only repartition. + ops.add(new NaivePartitioningOperatorFactory(group.getPartitionColumns())); + priorPartitionColumns = group.getPartitionColumns(); } - // Presently, the order by keys are not validated to ensure that the incoming query has pre-sorted the data - // as required by the window query. This should be done. In order to do it, we will need to know what the - // sub-query that we are running against actually looks like in order to then validate that the data will - // come back in the order expected. Unfortunately, the way that the queries are re-written to DruidRels - // loses all the context of sub-queries, making it not possible to validate this without changing how the - // various Druid rules work (i.e. a very large blast radius change). For now, it is easy enough to validate - // this when we build the native query, so we validate it there. - - // Aggregations. + // Add aggregations. final List aggregateCalls = group.getAggregateCalls(); final List processors = new ArrayList<>(); @@ -151,13 +169,13 @@ public static Windowing fromCalciteStuff( for (AggregateCall aggregateCall : aggregateCalls) { final String aggName = outputNamePrefix + outputNameCounter++; - expectedOutputColumns.add(aggName); + windowOutputColumns.add(aggName); ProcessorMaker maker = KNOWN_WINDOW_FNS.get(aggregateCall.getAggregation().getName()); if (maker == null) { final Aggregation aggregation = GroupByRules.translateAggregateCall( plannerContext, - rowSignature, + sourceRowSignature, null, rexBuilder, partialQuery.getSelectProject(), @@ -182,7 +200,7 @@ public static Windowing fromCalciteStuff( new WindowAggregate( aggName, aggregateCall, - rowSignature, + sourceRowSignature, plannerContext, partialQuery.getSelectProject(), window.constants, @@ -206,20 +224,37 @@ public static Windowing fromCalciteStuff( throw new ISE("No processors from Window[%s], why was this code called?", window); } - // The ordering required for partitioning is actually not important for the semantics. However, it *is* - // important that it be consistent across the query. Because if the incoming data is sorted descending - // and we try to partition on an ascending sort, we will think the data is not sorted correctly - ops.add(new NaivePartitioningOperatorFactory(group.getPartitionColumns())); ops.add(new WindowOperatorFactory( processors.size() == 1 ? processors.get(0) : new ComposingProcessor(processors.toArray(new Processor[0])) )); } - return new Windowing( - RowSignatures.fromRelDataType(expectedOutputColumns, window.getRowType()), - ops - ); + // Apply windowProject, if present. + if (partialQuery.getWindowProject() != null) { + // We know windowProject is a mapping due to the isMapping() check in DruidRules. Check for null anyway, + // as defensive programming. + final Mappings.TargetMapping mapping = Preconditions.checkNotNull( + partialQuery.getWindowProject().getMapping(), + "mapping for windowProject[%s]", partialQuery.getWindowProject() + ); + + final List windowProjectOutputColumns = new ArrayList<>(); + for (int i = 0; i < mapping.size(); i++) { + windowProjectOutputColumns.add(windowOutputColumns.get(mapping.getSourceOpt(i))); + } + + return new Windowing( + RowSignatures.fromRelDataType(windowProjectOutputColumns, partialQuery.getWindowProject().getRowType()), + ops + ); + } else { + // No windowProject. + return new Windowing( + RowSignatures.fromRelDataType(windowOutputColumns, window.getRowType()), + ops + ); + } } private final RowSignature signature; @@ -400,4 +435,68 @@ public int getConstantInt(int argPosition) return ((Number) getConstantArgument(argPosition).getValue()).intValue(); } } + + /** + * Return a list of {@link ColumnWithDirection} corresponding to a {@link RelCollation}. + * + * @param collation collation + * @param sourceRowSignature signature of the collated rows + */ + private static LinkedHashSet computeSortColumnsFromRelCollation( + final RelCollation collation, + final RowSignature sourceRowSignature + ) + { + final LinkedHashSet retVal = new LinkedHashSet<>(); + + for (RelFieldCollation fieldCollation : collation.getFieldCollations()) { + final ColumnWithDirection.Direction direction; + + switch (fieldCollation.getDirection()) { + case ASCENDING: + case STRICTLY_ASCENDING: + direction = ColumnWithDirection.Direction.ASC; + break; + + case DESCENDING: + case STRICTLY_DESCENDING: + direction = ColumnWithDirection.Direction.DESC; + break; + + default: + // Not a useful direction. Return whatever we've come up with so far. + return retVal; + } + + final ColumnWithDirection columnWithDirection = new ColumnWithDirection( + sourceRowSignature.getColumnName(fieldCollation.getFieldIndex()), + direction + ); + + retVal.add(columnWithDirection); + } + + return retVal; + } + + /** + * Whether currentSort is a prefix of priorSort. (i.e., whether data sorted by priorSort is *also* sorted + * by currentSort.) + */ + private static boolean sortMatches( + final Iterable priorSort, + final Iterable currentSort + ) + { + final Iterator priorIterator = priorSort.iterator(); + final Iterator currentIterator = currentSort.iterator(); + + while (currentIterator.hasNext()) { + if (!priorIterator.hasNext() || !currentIterator.next().equals(priorIterator.next())) { + return false; + } + } + + return true; + } } diff --git a/sql/src/main/java/org/apache/druid/sql/calcite/rule/DruidRules.java b/sql/src/main/java/org/apache/druid/sql/calcite/rule/DruidRules.java index 4276a48b2f13..2dd94c62d766 100644 --- a/sql/src/main/java/org/apache/druid/sql/calcite/rule/DruidRules.java +++ b/sql/src/main/java/org/apache/druid/sql/calcite/rule/DruidRules.java @@ -105,6 +105,14 @@ public static List rules(PlannerContext plannerContext) if (plannerContext.queryContext().getBoolean(DruidQuery.CTX_ENABLE_WINDOW_FNS, false)) { retVal.add(new DruidQueryRule<>(Window.class, PartialDruidQuery.Stage.WINDOW, PartialDruidQuery::withWindow)); + retVal.add( + new DruidQueryRule<>( + Project.class, + PartialDruidQuery.Stage.WINDOW_PROJECT, + Project::isMapping, // We can remap fields, but not apply expressions + PartialDruidQuery::withWindowProject + ) + ); retVal.add(DruidOuterQueryRule.WINDOW); } return retVal; @@ -113,12 +121,14 @@ public static List rules(PlannerContext plannerContext) public static class DruidQueryRule extends RelOptRule { private final PartialDruidQuery.Stage stage; - private final BiFunction f; + private final Predicate matchesFn; + private final BiFunction applyFn; public DruidQueryRule( final Class relClass, final PartialDruidQuery.Stage stage, - final BiFunction f + final Predicate matchesFn, + final BiFunction applyFn ) { super( @@ -126,24 +136,35 @@ public DruidQueryRule( StringUtils.format("%s(%s)", DruidQueryRule.class.getSimpleName(), stage) ); this.stage = stage; - this.f = f; + this.matchesFn = matchesFn; + this.applyFn = applyFn; + } + + public DruidQueryRule( + final Class relClass, + final PartialDruidQuery.Stage stage, + final BiFunction applyFn + ) + { + this(relClass, stage, r -> true, applyFn); } @Override public boolean matches(final RelOptRuleCall call) { - final DruidRel druidRel = call.rel(1); - return druidRel.getPartialDruidQuery().canAccept(stage); + final RelType otherRel = call.rel(0); + final DruidRel druidRel = call.rel(1); + return druidRel.getPartialDruidQuery().canAccept(stage) && matchesFn.test(otherRel); } @Override public void onMatch(final RelOptRuleCall call) { final RelType otherRel = call.rel(0); - final DruidRel druidRel = call.rel(1); + final DruidRel druidRel = call.rel(1); - final PartialDruidQuery newPartialDruidQuery = f.apply(druidRel.getPartialDruidQuery(), otherRel); - final DruidRel newDruidRel = druidRel.withPartialQuery(newPartialDruidQuery); + final PartialDruidQuery newPartialDruidQuery = applyFn.apply(druidRel.getPartialDruidQuery(), otherRel); + final DruidRel newDruidRel = druidRel.withPartialQuery(newPartialDruidQuery); if (newDruidRel.isValidDruidQuery()) { call.transformTo(newDruidRel); @@ -154,6 +175,7 @@ public void onMatch(final RelOptRuleCall call) public abstract static class DruidOuterQueryRule extends RelOptRule { public static final RelOptRule AGGREGATE = new DruidOuterQueryRule( + PartialDruidQuery.Stage.AGGREGATE, operand(Aggregate.class, operandJ(DruidRel.class, null, CAN_BUILD_ON, any())), "AGGREGATE" ) @@ -166,7 +188,7 @@ public void onMatch(final RelOptRuleCall call) final DruidOuterQueryRel outerQueryRel = DruidOuterQueryRel.create( druidRel, - PartialDruidQuery.create(druidRel.getPartialDruidQuery().leafRel()) + PartialDruidQuery.createOuterQuery(druidRel.getPartialDruidQuery()) .withAggregate(aggregate) ); if (outerQueryRel.isValidDruidQuery()) { @@ -176,6 +198,7 @@ public void onMatch(final RelOptRuleCall call) }; public static final RelOptRule WHERE_FILTER = new DruidOuterQueryRule( + PartialDruidQuery.Stage.WHERE_FILTER, operand(Filter.class, operandJ(DruidRel.class, null, CAN_BUILD_ON, any())), "WHERE_FILTER" ) @@ -188,7 +211,7 @@ public void onMatch(final RelOptRuleCall call) final DruidOuterQueryRel outerQueryRel = DruidOuterQueryRel.create( druidRel, - PartialDruidQuery.create(druidRel.getPartialDruidQuery().leafRel()) + PartialDruidQuery.createOuterQuery(druidRel.getPartialDruidQuery()) .withWhereFilter(filter) ); if (outerQueryRel.isValidDruidQuery()) { @@ -198,6 +221,7 @@ public void onMatch(final RelOptRuleCall call) }; public static final RelOptRule SELECT_PROJECT = new DruidOuterQueryRule( + PartialDruidQuery.Stage.SELECT_PROJECT, operand(Project.class, operandJ(DruidRel.class, null, CAN_BUILD_ON, any())), "SELECT_PROJECT" ) @@ -210,7 +234,7 @@ public void onMatch(final RelOptRuleCall call) final DruidOuterQueryRel outerQueryRel = DruidOuterQueryRel.create( druidRel, - PartialDruidQuery.create(druidRel.getPartialDruidQuery().leafRel()) + PartialDruidQuery.createOuterQuery(druidRel.getPartialDruidQuery()) .withSelectProject(filter) ); if (outerQueryRel.isValidDruidQuery()) { @@ -220,6 +244,7 @@ public void onMatch(final RelOptRuleCall call) }; public static final RelOptRule SORT = new DruidOuterQueryRule( + PartialDruidQuery.Stage.SORT, operand(Sort.class, operandJ(DruidRel.class, null, CAN_BUILD_ON, any())), "SORT" ) @@ -232,7 +257,7 @@ public void onMatch(final RelOptRuleCall call) final DruidOuterQueryRel outerQueryRel = DruidOuterQueryRel.create( druidRel, - PartialDruidQuery.create(druidRel.getPartialDruidQuery().leafRel()) + PartialDruidQuery.createOuterQuery(druidRel.getPartialDruidQuery()) .withSort(sort) ); if (outerQueryRel.isValidDruidQuery()) { @@ -242,6 +267,7 @@ public void onMatch(final RelOptRuleCall call) }; public static final RelOptRule WINDOW = new DruidOuterQueryRule( + PartialDruidQuery.Stage.WINDOW, operand(Window.class, operandJ(DruidRel.class, null, CAN_BUILD_ON, any())), "WINDOW" ) @@ -254,7 +280,7 @@ public void onMatch(final RelOptRuleCall call) final DruidOuterQueryRel outerQueryRel = DruidOuterQueryRel.create( druidRel, - PartialDruidQuery.create(druidRel.getPartialDruidQuery().leafRel()) + PartialDruidQuery.createOuterQuery(druidRel.getPartialDruidQuery()) .withWindow(window) ); if (outerQueryRel.isValidDruidQuery()) { @@ -263,17 +289,24 @@ public void onMatch(final RelOptRuleCall call) } }; - public DruidOuterQueryRule(final RelOptRuleOperand op, final String description) + private final PartialDruidQuery.Stage stage; + + public DruidOuterQueryRule( + final PartialDruidQuery.Stage stage, + final RelOptRuleOperand op, + final String description + ) { super(op, StringUtils.format("%s(%s)", DruidOuterQueryRel.class.getSimpleName(), description)); + this.stage = stage; } @Override public boolean matches(final RelOptRuleCall call) { - // Subquery must be a groupBy, so stage must be >= AGGREGATE. - final DruidRel druidRel = call.rel(call.getRelList().size() - 1); - return druidRel.getPartialDruidQuery().stage().compareTo(PartialDruidQuery.Stage.AGGREGATE) >= 0; + // Only consider doing a subquery when the stage cannot be fused into a single query. + final DruidRel druidRel = call.rel(call.getRelList().size() - 1); + return !stage.canFollow(druidRel.getPartialDruidQuery().stage()); } } } diff --git a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteJoinQueryTest.java b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteJoinQueryTest.java index d41d56f54c44..620a8cbbb7ae 100644 --- a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteJoinQueryTest.java +++ b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteJoinQueryTest.java @@ -68,6 +68,7 @@ import org.apache.druid.query.groupby.GroupByQuery; import org.apache.druid.query.groupby.ResultRow; import org.apache.druid.query.groupby.orderby.DefaultLimitSpec; +import org.apache.druid.query.groupby.orderby.NoopLimitSpec; import org.apache.druid.query.groupby.orderby.OrderByColumnSpec; import org.apache.druid.query.ordering.StringComparators; import org.apache.druid.query.scan.ScanQuery; @@ -2715,8 +2716,7 @@ public void testLeftJoinOnTwoInlineDataSourcesWithTimeFilter(Map ) ) .intervals(querySegmentSpec(Filtration.eternity())) - .virtualColumns(expressionVirtualColumn("_v0", "\'10.1\'", ColumnType.STRING)) - .columns("__time", "_v0") + .columns("__time", "v0") .filters(new SelectorDimFilter("v0", "10.1", null)) .context(queryContext) .build() @@ -2827,9 +2827,7 @@ public void testLeftJoinOnTwoInlineDataSourcesWithOuterWhere(Map ) ) .intervals(querySegmentSpec(Filtration.eternity())) - .virtualColumns(expressionVirtualColumn("_v0", "\'10.1\'", ColumnType.STRING)) - .columns("__time", "_v0") - .filters(new SelectorDimFilter("v0", "10.1", null)) + .columns("__time", "v0") .context(queryContext) .build() ), @@ -3022,8 +3020,7 @@ public void testInnerJoinOnTwoInlineDataSourcesWithOuterWhere(Map queryContext) .setGranularity(Granularities.ALL) .setDimensions(dimensions(new DefaultDimensionSpec("dim1", "d0"))) .setAggregatorSpecs(aggregators(new LongSumAggregatorFactory("a0", "cnt"))) - .setLimitSpec( - new DefaultLimitSpec( - ImmutableList.of( - new OrderByColumnSpec( - "d0", - OrderByColumnSpec.Direction.ASCENDING, - StringComparators.LEXICOGRAPHIC - ) - ), - Integer.MAX_VALUE - ) - ) + .setLimitSpec(NoopLimitSpec.instance()) .setContext(queryContext) .build() ), @@ -4208,18 +4183,7 @@ public void testRemovableLeftJoin(Map queryContext) .setGranularity(Granularities.ALL) .setDimensions(dimensions(new DefaultDimensionSpec("dim1", "d0"))) .setAggregatorSpecs(aggregators(new LongSumAggregatorFactory("a0", "cnt"))) - .setLimitSpec( - new DefaultLimitSpec( - ImmutableList.of( - new OrderByColumnSpec( - "d0", - OrderByColumnSpec.Direction.ASCENDING, - StringComparators.LEXICOGRAPHIC - ) - ), - Integer.MAX_VALUE - ) - ) + .setLimitSpec(NoopLimitSpec.instance()) .setContext(queryContext) .build() ), diff --git a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java index 065d77a8906a..e376da8b7e35 100644 --- a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java +++ b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java @@ -91,6 +91,7 @@ import org.apache.druid.query.groupby.GroupByQuery; import org.apache.druid.query.groupby.GroupByQueryConfig; import org.apache.druid.query.groupby.orderby.DefaultLimitSpec; +import org.apache.druid.query.groupby.orderby.NoopLimitSpec; import org.apache.druid.query.groupby.orderby.OrderByColumnSpec; import org.apache.druid.query.groupby.orderby.OrderByColumnSpec.Direction; import org.apache.druid.query.lookup.RegisteredLookupExtractionFn; @@ -2030,18 +2031,7 @@ public void testGroupByAndOrderByOrdinalOfAlias() .setGranularity(Granularities.ALL) .setDimensions(dimensions(new DefaultDimensionSpec("cnt", "d0", ColumnType.LONG))) .setAggregatorSpecs(aggregators(new CountAggregatorFactory("a0"))) - .setLimitSpec( - DefaultLimitSpec - .builder() - .orderBy( - new OrderByColumnSpec( - "d0", - OrderByColumnSpec.Direction.ASCENDING, - StringComparators.NUMERIC - ) - ) - .build() - ) + .setLimitSpec(NoopLimitSpec.instance()) .setContext(QUERY_CONTEXT_DEFAULT) .build() ), @@ -5515,7 +5505,7 @@ public void testUnplannableQueries() final Map queries = ImmutableMap.of( // SELECT query with order by non-__time. "SELECT dim1 FROM druid.foo ORDER BY dim1", - "Possible error: SQL query requires order by non-time column [dim1 ASC] that is not supported.", + "Possible error: SQL query requires order by non-time column [dim1 ASC], which is not supported.", // JOIN condition with not-equals (<>). "SELECT foo.dim1, foo.dim2, l.k, l.v\n" @@ -6842,10 +6832,15 @@ public void testNestedGroupBy() .setDataSource(CalciteTests.DATASOURCE1) .setInterval(querySegmentSpec(Filtration.eternity())) .setGranularity(Granularities.ALL) - .setDimensions(dimensions( - new DefaultDimensionSpec("dim1", "d0"), - new DefaultDimensionSpec("m2", "d1", ColumnType.DOUBLE) - )) + .setDimensions( + useDefault ? dimensions( + new DefaultDimensionSpec("m2", "d0", ColumnType.DOUBLE), + new DefaultDimensionSpec("dim1", "d1") + ) : dimensions( + new DefaultDimensionSpec("dim1", "d0"), + new DefaultDimensionSpec("m2", "d1", ColumnType.DOUBLE) + ) + ) .setDimFilter(new SelectorDimFilter("m1", "5.0", null)) .setAggregatorSpecs(aggregators(new LongMaxAggregatorFactory("a0", "__time"))) .setContext(QUERY_CONTEXT_DEFAULT) @@ -6862,7 +6857,7 @@ public void testNestedGroupBy() ) .setDimensions(dimensions( new DefaultDimensionSpec("v0", "_d0", ColumnType.LONG), - new DefaultDimensionSpec("d0", "_d1", ColumnType.STRING) + new DefaultDimensionSpec(useDefault ? "d1" : "d0", "_d1", ColumnType.STRING) )) .setAggregatorSpecs( aggregators( @@ -7204,8 +7199,7 @@ public void testMinMaxAvgDailyCountWithLimit() ) .setGranularity(Granularities.ALL) .setAggregatorSpecs( - useDefault - ? aggregators( + aggregators( new LongMaxAggregatorFactory("_a0", "a0"), new LongMinAggregatorFactory("_a1", "a0"), new LongSumAggregatorFactory("_a2:sum", "a0"), @@ -7213,17 +7207,6 @@ public void testMinMaxAvgDailyCountWithLimit() new LongMaxAggregatorFactory("_a3", "d0"), new CountAggregatorFactory("_a4") ) - : aggregators( - new LongMaxAggregatorFactory("_a0", "a0"), - new LongMinAggregatorFactory("_a1", "a0"), - new LongSumAggregatorFactory("_a2:sum", "a0"), - new FilteredAggregatorFactory( - new CountAggregatorFactory("_a2:count"), - not(selector("a0", null, null)) - ), - new LongMaxAggregatorFactory("_a3", "d0"), - new CountAggregatorFactory("_a4") - ) ) .setPostAggregatorSpecs( ImmutableList.of( @@ -9180,18 +9163,7 @@ public void testTimeseriesUsingTimeFloorWithTimeShift() ) .setDimensions(dimensions(new DefaultDimensionSpec("v0", "d0", ColumnType.LONG))) .setAggregatorSpecs(aggregators(new LongSumAggregatorFactory("a0", "cnt"))) - .setLimitSpec( - new DefaultLimitSpec( - ImmutableList.of( - new OrderByColumnSpec( - "d0", - OrderByColumnSpec.Direction.ASCENDING, - StringComparators.NUMERIC - ) - ), - Integer.MAX_VALUE - ) - ) + .setLimitSpec(NoopLimitSpec.instance()) .setContext(QUERY_CONTEXT_DEFAULT) .build() ), @@ -9229,18 +9201,7 @@ public void testTimeseriesUsingTimeFloorWithTimestampAdd() ) .setDimensions(dimensions(new DefaultDimensionSpec("v0", "d0", ColumnType.LONG))) .setAggregatorSpecs(aggregators(new LongSumAggregatorFactory("a0", "cnt"))) - .setLimitSpec( - new DefaultLimitSpec( - ImmutableList.of( - new OrderByColumnSpec( - "d0", - OrderByColumnSpec.Direction.ASCENDING, - StringComparators.NUMERIC - ) - ), - Integer.MAX_VALUE - ) - ) + .setLimitSpec(NoopLimitSpec.instance()) .setContext(QUERY_CONTEXT_DEFAULT) .build() ), @@ -10071,18 +10032,7 @@ public void testGroupByExtractYear() ) .setDimensions(dimensions(new DefaultDimensionSpec("v0", "d0", ColumnType.LONG))) .setAggregatorSpecs(aggregators(new LongSumAggregatorFactory("a0", "cnt"))) - .setLimitSpec( - new DefaultLimitSpec( - ImmutableList.of( - new OrderByColumnSpec( - "d0", - OrderByColumnSpec.Direction.ASCENDING, - StringComparators.NUMERIC - ) - ), - Integer.MAX_VALUE - ) - ) + .setLimitSpec(NoopLimitSpec.instance()) .setContext(QUERY_CONTEXT_DEFAULT) .build() ), @@ -10121,18 +10071,7 @@ public void testGroupByFormatYearAndMonth() ) .setDimensions(dimensions(new DefaultDimensionSpec("v0", "d0", ColumnType.STRING))) .setAggregatorSpecs(aggregators(new LongSumAggregatorFactory("a0", "cnt"))) - .setLimitSpec( - new DefaultLimitSpec( - ImmutableList.of( - new OrderByColumnSpec( - "d0", - OrderByColumnSpec.Direction.ASCENDING, - StringComparators.LEXICOGRAPHIC - ) - ), - Integer.MAX_VALUE - ) - ) + .setLimitSpec(NoopLimitSpec.instance()) .setContext(QUERY_CONTEXT_DEFAULT) .build() ), @@ -10372,19 +10311,7 @@ public void testGroupByTimeAndOtherDimension() ) ) .setAggregatorSpecs(aggregators(new LongSumAggregatorFactory("a0", "cnt"))) - .setLimitSpec( - new DefaultLimitSpec( - ImmutableList.of( - new OrderByColumnSpec("d0", OrderByColumnSpec.Direction.ASCENDING), - new OrderByColumnSpec( - "d1", - OrderByColumnSpec.Direction.ASCENDING, - StringComparators.NUMERIC - ) - ), - Integer.MAX_VALUE - ) - ) + .setLimitSpec(NoopLimitSpec.instance()) .setContext(withTimestampResultContext(QUERY_CONTEXT_DEFAULT, "d1", 1, Granularities.MONTH)) .build() ), @@ -11675,15 +11602,10 @@ public void testSortProjectAfterNestedGroupBy() .setInterval(querySegmentSpec(Filtration.eternity())) .setGranularity(Granularities.ALL) .setDimensions( - useDefault - ? dimensions( + dimensions( new DefaultDimensionSpec("__time", "d0", ColumnType.LONG), new DefaultDimensionSpec("m2", "d1", ColumnType.DOUBLE), new DefaultDimensionSpec("dim1", "d2") - ) : dimensions( - new DefaultDimensionSpec("__time", "d0", ColumnType.LONG), - new DefaultDimensionSpec("dim1", "d1"), - new DefaultDimensionSpec("m2", "d2", ColumnType.DOUBLE) ) ) .setContext(QUERY_CONTEXT_DEFAULT) @@ -11692,13 +11614,9 @@ public void testSortProjectAfterNestedGroupBy() .setInterval(querySegmentSpec(Filtration.eternity())) .setGranularity(Granularities.ALL) .setDimensions( - useDefault - ? dimensions( + dimensions( new DefaultDimensionSpec("d0", "_d0", ColumnType.LONG), new DefaultDimensionSpec("d2", "_d1", ColumnType.STRING) - ) : dimensions( - new DefaultDimensionSpec("d0", "_d0", ColumnType.LONG), - new DefaultDimensionSpec("d1", "_d1", ColumnType.STRING) ) ) .setAggregatorSpecs( @@ -11707,7 +11625,7 @@ public void testSortProjectAfterNestedGroupBy() ? new CountAggregatorFactory("a0") : new FilteredAggregatorFactory( new CountAggregatorFactory("a0"), - not(selector("d2", null, null)) + not(selector("d1", null, null)) ) ) ) diff --git a/sql/src/test/java/org/apache/druid/sql/http/SqlResourceTest.java b/sql/src/test/java/org/apache/druid/sql/http/SqlResourceTest.java index a9cf6779e162..ce84cb3f4b8b 100644 --- a/sql/src/test/java/org/apache/druid/sql/http/SqlResourceTest.java +++ b/sql/src/test/java/org/apache/druid/sql/http/SqlResourceTest.java @@ -1373,7 +1373,7 @@ public void testCannotConvert() throws Exception Assert.assertTrue( exception.getMessage() .contains("Query not supported. " + - "Possible error: SQL query requires order by non-time column [dim1 ASC] that is not supported.") + "Possible error: SQL query requires order by non-time column [dim1 ASC], which is not supported.") ); checkSqlRequestLog(false); Assert.assertTrue(lifecycleManager.getAll("id").isEmpty()); diff --git a/sql/src/test/resources/calcite/tests/window/wikipediaAggregationsMultipleOrdering.sqlTest b/sql/src/test/resources/calcite/tests/window/wikipediaAggregationsMultipleOrdering.sqlTest index 3ec4a47dbf00..b2b5aa49c611 100644 --- a/sql/src/test/resources/calcite/tests/window/wikipediaAggregationsMultipleOrdering.sqlTest +++ b/sql/src/test/resources/calcite/tests/window/wikipediaAggregationsMultipleOrdering.sqlTest @@ -43,13 +43,13 @@ expectedResults: - ["CL",1442019600000,-370,-154,1] - ["HK",1442019600000,-113,2090,2] - ["MY",1442019600000,-7,1018,3] - - ["SV",1442019600000,-1,114,4] - - ["MA",1442019600000,-1,-34,5] - - ["TW",1442019600000,0,869,6] - - ["BD",1442019600000,0,930,7] - - ["DE",1442019600000,0,604,8] - - ["PY",1442019600000,1,634,9] - - ["AR",1442019600000,1,3159,10] + - ["MA",1442019600000,-1,-34,4] + - ["SV",1442019600000,-1,114,5] + - ["BD",1442019600000,0,930,6] + - ["DE",1442019600000,0,604,7] + - ["TW",1442019600000,0,869,8] + - ["AR",1442019600000,1,3159,9] + - ["PY",1442019600000,1,634,10] - ["PH",1442019600000,6,1375,11] - ["RS",1442019600000,6,19,12] - ["CO",1442019600000,12,478,13] @@ -80,8 +80,8 @@ expectedResults: - ["GT",1442023200000,-167,7,1] - ["IN",1442023200000,-142,2319,2] - ["CN",1442023200000,-13,239,3] - - ["VN",1442023200000,-9,25,4] - - ["EC",1442023200000,-9,-346,5] + - ["EC",1442023200000,-9,-346,4] + - ["VN",1442023200000,-9,25,5] - ["ES",1442023200000,-5,49,6] - ["SE",1442023200000,3,233,7] - ["DO",1442023200000,8,243,8] @@ -117,8 +117,8 @@ expectedResults: - ["VE",1442026800000,-17,147,5] - ["PE",1442026800000,-12,362,6] - ["HN",1442026800000,-1,-1,7] - - ["PA",1442026800000,0,0,8] - - ["IR",1442026800000,0,367,9] + - ["IR",1442026800000,0,367,8] + - ["PA",1442026800000,0,0,9] - ["RU",1442026800000,0,3247,10] - ["IE",1442026800000,1,29,11] - ["EG",1442026800000,16,142,12] @@ -152,10 +152,10 @@ expectedResults: - ["IT",1442030400000,-17,1496,4] - ["AR",1442030400000,-3,3449,5] - ["MY",1442030400000,-3,1953,6] - - ["TW",1442030400000,0,1186,7] - - ["EC",1442030400000,0,222,8] - - ["SG",1442030400000,1,2821,9] - - ["IE",1442030400000,1,1091,10] + - ["EC",1442030400000,0,222,7] + - ["TW",1442030400000,0,1186,8] + - ["IE",1442030400000,1,1091,9] + - ["SG",1442030400000,1,2821,10] - ["PR",1442030400000,2,-6,11] - ["PH",1442030400000,26,1477,12] - ["BR",1442030400000,30,1620,13] @@ -185,8 +185,8 @@ expectedResults: - ["ZA",1442034000000,-3,126,5] - ["VE",1442034000000,-2,585,6] - ["CL",1442034000000,-1,-315,7] - - ["NL",1442034000000,0,1319,8] - - ["GR",1442034000000,0,63,9] + - ["GR",1442034000000,0,63,8] + - ["NL",1442034000000,0,1319,9] - ["TH",1442034000000,0,113,10] - ["ID",1442034000000,19,4,11] - ["BR",1442034000000,21,1251,12] @@ -217,13 +217,13 @@ expectedResults: - ["SA",1442037600000,-97,-72,3] - ["VN",1442037600000,-11,-1,4] - ["IT",1442037600000,-9,2705,5] - - ["UA",1442037600000,-1,3821,6] - - ["SK",1442037600000,-1,18,7] + - ["SK",1442037600000,-1,18,6] + - ["UA",1442037600000,-1,3821,7] - ["UY",1442037600000,1,913,8] - ["CL",1442037600000,2,445,9] - - ["SG",1442037600000,3,2898,10] - - ["AU",1442037600000,3,664,11] - - ["ES",1442037600000,3,-2,12] + - ["AU",1442037600000,3,664,10] + - ["ES",1442037600000,3,-2,11] + - ["SG",1442037600000,3,2898,12] - ["MX",1442037600000,4,4668,13] - ["DK",1442037600000,10,41,14] - ["FI",1442037600000,14,1703,15] @@ -241,8 +241,8 @@ expectedResults: - ["HU",1442037600000,197,881,27] - ["TW",1442037600000,266,1479,28] - ["BR",1442037600000,267,443,29] - - ["GB",1442037600000,544,3469,30] - - ["DE",1442037600000,544,2515,31] + - ["DE",1442037600000,544,2515,30] + - ["GB",1442037600000,544,3469,31] - ["HK",1442037600000,636,1725,32] - ["JP",1442037600000,2181,7873,33] - ["US",1442037600000,3675,12996,34] @@ -254,12 +254,12 @@ expectedResults: - ["HK",1442041200000,-15,1937,4] - ["CL",1442041200000,-1,418,5] - ["IQ",1442041200000,-1,5,6] - - ["VN",1442041200000,0,98,7] - - ["PH",1442041200000,0,219,8] + - ["PH",1442041200000,0,219,7] + - ["VN",1442041200000,0,98,8] - ["TR",1442041200000,1,436,9] - ["ID",1442041200000,2,-58,10] - - ["TH",1442041200000,3,91,11] - - ["BR",1442041200000,3,624,12] + - ["BR",1442041200000,3,624,11] + - ["TH",1442041200000,3,91,12] - ["CA",1442041200000,5,43,13] - ["GR",1442041200000,7,71,14] - ["BG",1442041200000,9,19136,15] @@ -274,8 +274,8 @@ expectedResults: - ["SG",1442041200000,59,2950,24] - ["UA",1442041200000,74,3823,25] - ["IN",1442041200000,80,5952,26] - - ["SE",1442041200000,91,89,27] - - ["HU",1442041200000,91,1380,28] + - ["HU",1442041200000,91,1380,27] + - ["SE",1442041200000,91,89,28] - ["ES",1442041200000,118,53,29] - ["ZM",1442041200000,133,133,30] - ["AU",1442041200000,194,611,31] @@ -383,13 +383,13 @@ expectedResults: - ["TH",1442052000000,-22,45,3] - ["AO",1442052000000,-18,740,4] - ["ES",1442052000000,-4,1684,5] - - ["KR",1442052000000,-3,4320,6] - - ["AE",1442052000000,-3,182,7] + - ["AE",1442052000000,-3,182,6] + - ["KR",1442052000000,-3,4320,7] - ["US",1442052000000,-2,1837,8] - ["BE",1442052000000,-1,279,9] - - ["OM",1442052000000,0,0,10] + - ["CN",1442052000000,0,622,10] - ["IQ",1442052000000,0,3,11] - - ["CN",1442052000000,0,622,12] + - ["OM",1442052000000,0,0,12] - ["SE",1442052000000,1,1448,13] - ["SK",1442052000000,13,464,14] - ["HK",1442052000000,15,828,15] @@ -431,11 +431,11 @@ expectedResults: - ["LB",1442055600000,-67,-67,3] - ["AR",1442055600000,-54,475,4] - ["SE",1442055600000,-5,1432,5] - - ["JO",1442055600000,-2,2,6] - - ["KW",1442055600000,-2,1811,7] - - ["HU",1442055600000,-2,1427,8] - - ["TH",1442055600000,0,11,9] - - ["CH",1442055600000,0,50,10] + - ["HU",1442055600000,-2,1427,6] + - ["JO",1442055600000,-2,2,7] + - ["KW",1442055600000,-2,1811,8] + - ["CH",1442055600000,0,50,9] + - ["TH",1442055600000,0,11,10] - ["BY",1442055600000,1,2061,11] - ["MY",1442055600000,1,1459,12] - ["IL",1442055600000,4,4377,13] @@ -478,13 +478,13 @@ expectedResults: - ["CL",1442059200000,-12,355,5] - ["AE",1442059200000,-11,6387,6] - ["UA",1442059200000,-2,15681,7] - - ["SA",1442059200000,0,1206,8] + - ["DK",1442059200000,0,490,8] - ["JO",1442059200000,0,2,9] - ["MY",1442059200000,0,525,10] - - ["DK",1442059200000,0,490,11] + - ["SA",1442059200000,0,1206,11] - ["HK",1442059200000,2,862,12] - - ["VN",1442059200000,8,1077,13] - - ["CN",1442059200000,8,345,14] + - ["CN",1442059200000,8,345,13] + - ["VN",1442059200000,8,1077,14] - ["US",1442059200000,11,518,15] - ["ID",1442059200000,17,-290,16] - ["CZ",1442059200000,21,1358,17] @@ -523,9 +523,9 @@ expectedResults: - ["TH",1442062800000,-46,8,6] - ["NL",1442062800000,-30,311,7] - ["PE",1442062800000,-12,360,8] - - ["MA",1442062800000,0,221,9] - - ["CZ",1442062800000,0,3331,10] - - ["KZ",1442062800000,0,191,11] + - ["CZ",1442062800000,0,3331,9] + - ["KZ",1442062800000,0,191,10] + - ["MA",1442062800000,0,221,11] - ["DK",1442062800000,1,445,12] - ["HK",1442062800000,1,1175,13] - ["SK",1442062800000,6,372,14] @@ -565,11 +565,11 @@ expectedResults: - ["CN",1442066400000,-15,51,4] - ["MX",1442066400000,-1,631,5] - ["AR",1442066400000,0,-29,6] - - ["SG",1442066400000,0,517,7] + - ["AT",1442066400000,0,4908,7] - ["KZ",1442066400000,0,-243,8] - - ["AT",1442066400000,0,4908,9] + - ["LU",1442066400000,0,606,9] - ["RS",1442066400000,0,832,10] - - ["LU",1442066400000,0,606,11] + - ["SG",1442066400000,0,517,11] - ["MY",1442066400000,1,642,12] - ["IL",1442066400000,3,1472,13] - ["PT",1442066400000,12,3692,14] @@ -611,8 +611,8 @@ expectedResults: - ["RO",1442070000000,-29,872,4] - ["AU",1442070000000,-12,1326,5] - ["MX",1442070000000,-1,3561,6] - - ["ZA",1442070000000,0,127,7] - - ["TH",1442070000000,0,-67,8] + - ["TH",1442070000000,0,-67,7] + - ["ZA",1442070000000,0,127,8] - ["UG",1442070000000,1,1,9] - ["GR",1442070000000,2,-235,10] - ["MM",1442070000000,3,28,11] @@ -662,10 +662,10 @@ expectedResults: - ["MX",1442073600000,-21,3181,5] - ["MV",1442073600000,-3,-3,6] - ["FI",1442073600000,-1,912,7] - - ["ME",1442073600000,0,0,8] - - ["HR",1442073600000,0,310,9] - - ["MY",1442073600000,1,732,10] - - ["EG",1442073600000,1,170,11] + - ["HR",1442073600000,0,310,8] + - ["ME",1442073600000,0,0,9] + - ["EG",1442073600000,1,170,10] + - ["MY",1442073600000,1,732,11] - ["SA",1442073600000,2,1697,12] - ["KG",1442073600000,6,6,13] - ["RO",1442073600000,15,1377,14] @@ -754,23 +754,23 @@ expectedResults: - ["BR",1442080800000,-267,5316,2] - ["PT",1442080800000,-79,3750,3] - ["SI",1442080800000,-45,-36,4] - - ["KW",1442080800000,-33,1778,5] - - ["KR",1442080800000,-33,4286,6] + - ["KR",1442080800000,-33,4286,5] + - ["KW",1442080800000,-33,1778,6] - ["CZ",1442080800000,-28,2308,7] - ["GE",1442080800000,-27,-140,8] - ["CN",1442080800000,-10,51,9] - ["PE",1442080800000,-2,-276,10] - - ["UA",1442080800000,-1,5776,11] - - ["TR",1442080800000,-1,2968,12] - - ["IN",1442080800000,0,19268,13] - - ["RS",1442080800000,0,900,14] - - ["HK",1442080800000,0,5894,15] + - ["TR",1442080800000,-1,2968,11] + - ["UA",1442080800000,-1,5776,12] + - ["HK",1442080800000,0,5894,13] + - ["IN",1442080800000,0,19268,14] + - ["RS",1442080800000,0,900,15] - ["AR",1442080800000,1,122,16] - ["BE",1442080800000,1,497,17] - ["BO",1442080800000,4,4,18] - ["JO",1442080800000,4,2,19] - - ["PY",1442080800000,5,634,20] - - ["MA",1442080800000,5,207,21] + - ["MA",1442080800000,5,207,20] + - ["PY",1442080800000,5,634,21] - ["PL",1442080800000,7,866,22] - ["MR",1442080800000,10,10,23] - ["LT",1442080800000,12,-12,24] @@ -805,8 +805,8 @@ expectedResults: - ["PE",1442084400000,-68,1597,4] - ["NZ",1442084400000,-52,1032,5] - ["KZ",1442084400000,-22,-248,6] - - ["VN",1442084400000,-10,1426,7] - - ["HR",1442084400000,-10,350,8] + - ["HR",1442084400000,-10,350,7] + - ["VN",1442084400000,-10,1426,8] - ["AR",1442084400000,-5,752,9] - ["LK",1442084400000,-3,131,10] - ["AT",1442084400000,-2,7254,11] @@ -817,9 +817,9 @@ expectedResults: - ["UA",1442084400000,5,3655,16] - ["DO",1442084400000,8,264,17] - ["CH",1442084400000,13,457,18] - - ["TH",1442084400000,13,-67,19] + - ["JP",1442084400000,13,1931,19] - ["PL",1442084400000,13,1622,20] - - ["JP",1442084400000,13,1931,21] + - ["TH",1442084400000,13,-67,21] - ["SE",1442084400000,37,278,22] - ["PH",1442084400000,39,670,23] - ["CA",1442084400000,44,3222,24] @@ -982,8 +982,8 @@ expectedResults: - ["SE",1442098800000,0,97,9] - ["GT",1442098800000,1,7,10] - ["CZ",1442098800000,2,2140,11] - - ["PT",1442098800000,2,345,12] - - ["NO",1442098800000,2,31,13] + - ["NO",1442098800000,2,31,12] + - ["PT",1442098800000,2,345,13] - ["IL",1442098800000,3,1847,14] - ["NL",1442098800000,4,105,15] - ["SK",1442098800000,7,367,16] @@ -1010,4 +1010,4 @@ expectedResults: - ["PE",1442098800000,1861,1772,37] - ["US",1442098800000,3575,8184,38] - ["RU",1442098800000,12098,18578,39] - - ["",1442098800000,276159,1468959,40] \ No newline at end of file + - ["",1442098800000,276159,1468959,40] diff --git a/sql/src/test/resources/calcite/tests/window/wikipediaScanWindow.sqlTest b/sql/src/test/resources/calcite/tests/window/wikipediaScanWindow.sqlTest new file mode 100644 index 000000000000..c37029850645 --- /dev/null +++ b/sql/src/test/resources/calcite/tests/window/wikipediaScanWindow.sqlTest @@ -0,0 +1,23 @@ +type: "failingTest" + +sql: | + SELECT + __time, + "user", + page, + LAG(page, 1) OVER (PARTITION BY "user" ORDER BY __time) as priorPage + FROM wikipedia + +expectedOperators: + - { type: "naiveSort", columns: [ { column: "user", direction: "ASC" }, { column: "__time", direction: "ASC" } ]} + - { type: "naivePartition", partitionColumns: [ "user" ] } + - type: "window" + processor: + type: "offset" + inputColumn: page + outputColumn: w0 + offset: -1 + +# Not correct: there should actually be results for this query. But when the query runs, at the time I write this, it +# does not return any results at all. Therefore, we leave expectedResults empty and mark the test as a failingTest. +expectedResults: [ [ "to be added later, when fixing this test" ] ] diff --git a/sql/src/test/resources/calcite/tests/window/wikipediaSimplePartitionInitialSort.sqlTest b/sql/src/test/resources/calcite/tests/window/wikipediaSimplePartitionInitialSort.sqlTest new file mode 100644 index 000000000000..d74e08d89284 --- /dev/null +++ b/sql/src/test/resources/calcite/tests/window/wikipediaSimplePartitionInitialSort.sqlTest @@ -0,0 +1,1024 @@ +type: "operatorValidation" + +# Like wikipediaSimplePartition, but requires re-sorting the input data because the order of the GROUP BY +# does not match the required order for window partitioning. ("t" and "countryIsoCode" are flipped.) + +sql: | + SELECT + FLOOR(__time TO HOUR) t, + countryIsoCode, + SUM(delta) delta, + SUM(SUM(delta)) OVER (PARTITION BY countryIsoCode) totalDelta, + LAG(FLOOR(__time TO HOUR), 2) OVER (PARTITION BY countryIsoCode) laggardTime, + LEAD(FLOOR(__time TO HOUR), 1) OVER (PARTITION BY countryIsoCode) leadTime, + FIRST_VALUE(SUM(delta)) OVER (PARTITION BY countryIsoCode) AS firstDelay, + LAST_VALUE(SUM(delta)) OVER (PARTITION BY countryIsoCode) AS lastDelay, + NTILE(3) OVER (PARTITION BY countryIsoCode) AS delayNTile + FROM wikipedia + GROUP BY 1, 2 + +expectedOperators: + - { type: "naiveSort", columns: [ { column: "d1", direction: "ASC" } ] } + - { type: "naivePartition", partitionColumns: [ "d1" ] } + - type: "window" + processor: + type: "composing" + processors: + - { "type": "offset", "inputColumn": "d0", "outputColumn": "w1", "offset": -2 } + - { "type": "offset", "inputColumn": "d0", "outputColumn": "w2", "offset": 1 } + - { "type": "first", "inputColumn": "a0", "outputColumn": "w3" } + - { "type": "last", "inputColumn": "a0", "outputColumn": "w4" } + - { "type": "percentile", "outputColumn": "w5", "numBuckets": 3 } + - type: "framedAgg" + frame: { peerType: "ROWS", lowUnbounded: true, lowOffset: 0, uppUnbounded: true, uppOffset: 0 } + aggregations: + - { "type": "longSum", "name": "w0", "fieldName": "a0" } + +expectedResults: + - [ 1442016000000, "", 29873, 8414700, null, 1442019600000, 29873, 276159, 1 ] + - [ 1442019600000, "", 173892, 8414700, null, 1442023200000, 29873, 276159, 1 ] + - [ 1442023200000, "", 399636, 8414700, 1442016000000, 1442026800000, 29873, 276159, 1 ] + - [ 1442026800000, "", 252626, 8414700, 1442019600000, 1442030400000, 29873, 276159, 1 ] + - [ 1442030400000, "", 166672, 8414700, 1442023200000, 1442034000000, 29873, 276159, 1 ] + - [ 1442034000000, "", 330957, 8414700, 1442026800000, 1442037600000, 29873, 276159, 1 ] + - [ 1442037600000, "", 200605, 8414700, 1442030400000, 1442041200000, 29873, 276159, 1 ] + - [ 1442041200000, "", 543450, 8414700, 1442034000000, 1442044800000, 29873, 276159, 1 ] + - [ 1442044800000, "", 316002, 8414700, 1442037600000, 1442048400000, 29873, 276159, 2 ] + - [ 1442048400000, "", 308316, 8414700, 1442041200000, 1442052000000, 29873, 276159, 2 ] + - [ 1442052000000, "", 787370, 8414700, 1442044800000, 1442055600000, 29873, 276159, 2 ] + - [ 1442055600000, "", 283958, 8414700, 1442048400000, 1442059200000, 29873, 276159, 2 ] + - [ 1442059200000, "", 459297, 8414700, 1442052000000, 1442062800000, 29873, 276159, 2 ] + - [ 1442062800000, "", 389465, 8414700, 1442055600000, 1442066400000, 29873, 276159, 2 ] + - [ 1442066400000, "", 351584, 8414700, 1442059200000, 1442070000000, 29873, 276159, 2 ] + - [ 1442070000000, "", 358515, 8414700, 1442062800000, 1442073600000, 29873, 276159, 2 ] + - [ 1442073600000, "", 375394, 8414700, 1442066400000, 1442077200000, 29873, 276159, 3 ] + - [ 1442077200000, "", 392483, 8414700, 1442070000000, 1442080800000, 29873, 276159, 3 ] + - [ 1442080800000, "", 453077, 8414700, 1442073600000, 1442084400000, 29873, 276159, 3 ] + - [ 1442084400000, "", 372569, 8414700, 1442077200000, 1442088000000, 29873, 276159, 3 ] + - [ 1442088000000, "", 303872, 8414700, 1442080800000, 1442091600000, 29873, 276159, 3 ] + - [ 1442091600000, "", 514427, 8414700, 1442084400000, 1442095200000, 29873, 276159, 3 ] + - [ 1442095200000, "", 374501, 8414700, 1442088000000, 1442098800000, 29873, 276159, 3 ] + - [ 1442098800000, "", 276159, 8414700, 1442091600000, null, 29873, 276159, 3 ] + - [ 1442030400000, "AE", 118, 6547, null, 1442044800000, 118, 42, 1 ] + - [ 1442044800000, "AE", -7, 6547, null, 1442048400000, 118, 42, 1 ] + - [ 1442048400000, "AE", 39, 6547, 1442030400000, 1442052000000, 118, 42, 1 ] + - [ 1442052000000, "AE", -3, 6547, 1442044800000, 1442059200000, 118, 42, 2 ] + - [ 1442059200000, "AE", -11, 6547, 1442048400000, 1442070000000, 118, 42, 2 ] + - [ 1442070000000, "AE", 46, 6547, 1442052000000, 1442077200000, 118, 42, 2 ] + - [ 1442077200000, "AE", 6323, 6547, 1442059200000, 1442080800000, 118, 42, 3 ] + - [ 1442080800000, "AE", 42, 6547, 1442070000000, null, 118, 42, 3 ] + - [ 1442077200000, "AL", 26, 80, null, 1442091600000, 26, 54, 1 ] + - [ 1442091600000, "AL", 54, 80, null, null, 26, 54, 2 ] + - [ 1442041200000, "AO", -26, 740, null, 1442052000000, -26, 722, 1 ] + - [ 1442052000000, "AO", -18, 740, null, 1442088000000, -26, 722, 1 ] + - [ 1442088000000, "AO", 62, 740, 1442041200000, 1442098800000, -26, 722, 2 ] + - [ 1442098800000, "AO", 722, 740, 1442052000000, null, -26, 722, 3 ] + - [ 1442019600000, "AR", 1, 4450, null, 1442023200000, 1, 64, 1 ] + - [ 1442023200000, "AR", 2514, 4450, null, 1442026800000, 1, 64, 1 ] + - [ 1442026800000, "AR", 644, 4450, 1442019600000, 1442030400000, 1, 64, 1 ] + - [ 1442030400000, "AR", -3, 4450, 1442023200000, 1442034000000, 1, 64, 1 ] + - [ 1442034000000, "AR", 212, 4450, 1442026800000, 1442037600000, 1, 64, 1 ] + - [ 1442037600000, "AR", 81, 4450, 1442030400000, 1442055600000, 1, 64, 1 ] + - [ 1442055600000, "AR", -54, 4450, 1442034000000, 1442059200000, 1, 64, 2 ] + - [ 1442059200000, "AR", 210, 4450, 1442037600000, 1442062800000, 1, 64, 2 ] + - [ 1442062800000, "AR", 29, 4450, 1442055600000, 1442066400000, 1, 64, 2 ] + - [ 1442066400000, "AR", 0, 4450, 1442059200000, 1442070000000, 1, 64, 2 ] + - [ 1442070000000, "AR", 377, 4450, 1442062800000, 1442077200000, 1, 64, 2 ] + - [ 1442077200000, "AR", -591, 4450, 1442066400000, 1442080800000, 1, 64, 2 ] + - [ 1442080800000, "AR", 1, 4450, 1442070000000, 1442084400000, 1, 64, 3 ] + - [ 1442084400000, "AR", -5, 4450, 1442077200000, 1442091600000, 1, 64, 3 ] + - [ 1442091600000, "AR", 340, 4450, 1442080800000, 1442095200000, 1, 64, 3 ] + - [ 1442095200000, "AR", 630, 4450, 1442084400000, 1442098800000, 1, 64, 3 ] + - [ 1442098800000, "AR", 64, 4450, 1442091600000, null, 1, 64, 3 ] + - [ 1442052000000, "AT", 4793, 12047, null, 1442062800000, 4793, 89, 1 ] + - [ 1442062800000, "AT", -155, 12047, null, 1442066400000, 4793, 89, 1 ] + - [ 1442066400000, "AT", 0, 12047, 1442052000000, 1442070000000, 4793, 89, 1 ] + - [ 1442070000000, "AT", 272, 12047, 1442062800000, 1442084400000, 4793, 89, 2 ] + - [ 1442084400000, "AT", -2, 12047, 1442066400000, 1442088000000, 4793, 89, 2 ] + - [ 1442088000000, "AT", 7050, 12047, 1442070000000, 1442091600000, 4793, 89, 3 ] + - [ 1442091600000, "AT", 89, 12047, 1442084400000, null, 4793, 89, 3 ] + - [ 1442016000000, "AU", 0, 2700, null, 1442019600000, 0, 518, 1 ] + - [ 1442019600000, "AU", 253, 2700, null, 1442023200000, 0, 518, 1 ] + - [ 1442023200000, "AU", 52, 2700, 1442016000000, 1442026800000, 0, 518, 1 ] + - [ 1442026800000, "AU", 188, 2700, 1442019600000, 1442030400000, 0, 518, 1 ] + - [ 1442030400000, "AU", -377, 2700, 1442023200000, 1442034000000, 0, 518, 1 ] + - [ 1442034000000, "AU", 283, 2700, 1442026800000, 1442037600000, 0, 518, 1 ] + - [ 1442037600000, "AU", 3, 2700, 1442030400000, 1442041200000, 0, 518, 1 ] + - [ 1442041200000, "AU", 194, 2700, 1442034000000, 1442044800000, 0, 518, 2 ] + - [ 1442044800000, "AU", 373, 2700, 1442037600000, 1442048400000, 0, 518, 2 ] + - [ 1442048400000, "AU", 135, 2700, 1442041200000, 1442052000000, 0, 518, 2 ] + - [ 1442052000000, "AU", -643, 2700, 1442044800000, 1442055600000, 0, 518, 2 ] + - [ 1442055600000, "AU", 182, 2700, 1442048400000, 1442059200000, 0, 518, 2 ] + - [ 1442059200000, "AU", 38, 2700, 1442052000000, 1442066400000, 0, 518, 2 ] + - [ 1442066400000, "AU", -21, 2700, 1442055600000, 1442070000000, 0, 518, 3 ] + - [ 1442070000000, "AU", -12, 2700, 1442059200000, 1442077200000, 0, 518, 3 ] + - [ 1442077200000, "AU", 1, 2700, 1442066400000, 1442091600000, 0, 518, 3 ] + - [ 1442091600000, "AU", 1138, 2700, 1442070000000, 1442095200000, 0, 518, 3 ] + - [ 1442095200000, "AU", 395, 2700, 1442077200000, 1442098800000, 0, 518, 3 ] + - [ 1442098800000, "AU", 518, 2700, 1442091600000, null, 0, 518, 3 ] + - [ 1442048400000, "BA", -13, -178, null, 1442052000000, -13, -1, 1 ] + - [ 1442052000000, "BA", 38, -178, null, 1442055600000, -13, -1, 1 ] + - [ 1442055600000, "BA", -202, -178, 1442048400000, 1442084400000, -13, -1, 2 ] + - [ 1442084400000, "BA", -1, -178, 1442052000000, null, -13, -1, 3 ] + - [ 1442019600000, "BD", 0, 1106, null, 1442041200000, 0, -2, 1 ] + - [ 1442041200000, "BD", 854, 1106, null, 1442066400000, 0, -2, 1 ] + - [ 1442066400000, "BD", 76, 1106, 1442019600000, 1442073600000, 0, -2, 2 ] + - [ 1442073600000, "BD", 103, 1106, 1442041200000, 1442077200000, 0, -2, 2 ] + - [ 1442077200000, "BD", 75, 1106, 1442066400000, 1442091600000, 0, -2, 3 ] + - [ 1442091600000, "BD", -2, 1106, 1442073600000, null, 0, -2, 3 ] + - [ 1442030400000, "BE", -103, 795, null, 1442048400000, -103, 9, 1 ] + - [ 1442048400000, "BE", 59, 795, null, 1442052000000, -103, 9, 1 ] + - [ 1442052000000, "BE", -1, 795, 1442030400000, 1442055600000, -103, 9, 1 ] + - [ 1442055600000, "BE", 233, 795, 1442048400000, 1442062800000, -103, 9, 1 ] + - [ 1442062800000, "BE", 91, 795, 1442052000000, 1442066400000, -103, 9, 2 ] + - [ 1442066400000, "BE", 136, 795, 1442055600000, 1442073600000, -103, 9, 2 ] + - [ 1442073600000, "BE", 19, 795, 1442062800000, 1442080800000, -103, 9, 2 ] + - [ 1442080800000, "BE", 1, 795, 1442066400000, 1442084400000, -103, 9, 2 ] + - [ 1442084400000, "BE", 183, 795, 1442073600000, 1442088000000, -103, 9, 3 ] + - [ 1442088000000, "BE", 67, 795, 1442080800000, 1442091600000, -103, 9, 3 ] + - [ 1442091600000, "BE", 101, 795, 1442084400000, 1442098800000, -103, 9, 3 ] + - [ 1442098800000, "BE", 9, 795, 1442088000000, null, -103, 9, 3 ] + - [ 1442041200000, "BG", 9, 19592, null, 1442052000000, 9, 401, 1 ] + - [ 1442052000000, "BG", 18936, 19592, null, 1442059200000, 9, 401, 1 ] + - [ 1442059200000, "BG", 191, 19592, 1442041200000, 1442070000000, 9, 401, 2 ] + - [ 1442070000000, "BG", 55, 19592, 1442052000000, 1442084400000, 9, 401, 2 ] + - [ 1442084400000, "BG", 401, 19592, 1442059200000, null, 9, 401, 3 ] + - [ 1442052000000, "BH", 44, 44, null, null, 44, 44, 1 ] + - [ 1442080800000, "BO", 4, 4, null, 1442088000000, 4, -4, 1 ] + - [ 1442088000000, "BO", 4, 4, null, 1442095200000, 4, -4, 2 ] + - [ 1442095200000, "BO", -4, 4, 1442080800000, null, 4, -4, 3 ] + - [ 1442016000000, "BR", -248, 8550, null, 1442019600000, -248, -645, 1 ] + - [ 1442019600000, "BR", 372, 8550, null, 1442023200000, -248, -645, 1 ] + - [ 1442023200000, "BR", 879, 8550, 1442016000000, 1442026800000, -248, -645, 1 ] + - [ 1442026800000, "BR", 51, 8550, 1442019600000, 1442030400000, -248, -645, 1 ] + - [ 1442030400000, "BR", 30, 8550, 1442023200000, 1442034000000, -248, -645, 1 ] + - [ 1442034000000, "BR", 21, 8550, 1442026800000, 1442037600000, -248, -645, 1 ] + - [ 1442037600000, "BR", 267, 8550, 1442030400000, 1442041200000, -248, -645, 1 ] + - [ 1442041200000, "BR", 3, 8550, 1442034000000, 1442044800000, -248, -645, 1 ] + - [ 1442044800000, "BR", 71, 8550, 1442037600000, 1442052000000, -248, -645, 2 ] + - [ 1442052000000, "BR", 232, 8550, 1442041200000, 1442055600000, -248, -645, 2 ] + - [ 1442055600000, "BR", 242, 8550, 1442044800000, 1442059200000, -248, -645, 2 ] + - [ 1442059200000, "BR", 73, 8550, 1442052000000, 1442062800000, -248, -645, 2 ] + - [ 1442062800000, "BR", 93, 8550, 1442055600000, 1442066400000, -248, -645, 2 ] + - [ 1442066400000, "BR", 1034, 8550, 1442059200000, 1442070000000, -248, -645, 2 ] + - [ 1442070000000, "BR", 536, 8550, 1442062800000, 1442073600000, -248, -645, 2 ] + - [ 1442073600000, "BR", 2087, 8550, 1442066400000, 1442077200000, -248, -645, 2 ] + - [ 1442077200000, "BR", 2253, 8550, 1442070000000, 1442080800000, -248, -645, 3 ] + - [ 1442080800000, "BR", -267, 8550, 1442073600000, 1442084400000, -248, -645, 3 ] + - [ 1442084400000, "BR", 492, 8550, 1442077200000, 1442088000000, -248, -645, 3 ] + - [ 1442088000000, "BR", 215, 8550, 1442080800000, 1442091600000, -248, -645, 3 ] + - [ 1442091600000, "BR", 11, 8550, 1442084400000, 1442095200000, -248, -645, 3 ] + - [ 1442095200000, "BR", 748, 8550, 1442088000000, 1442098800000, -248, -645, 3 ] + - [ 1442098800000, "BR", -645, 8550, 1442091600000, null, -248, -645, 3 ] + - [ 1442055600000, "BY", 1, 2153, null, 1442059200000, 1, 33, 1 ] + - [ 1442059200000, "BY", 1464, 2153, null, 1442073600000, 1, 33, 1 ] + - [ 1442073600000, "BY", 596, 2153, 1442055600000, 1442077200000, 1, 33, 1 ] + - [ 1442077200000, "BY", 30, 2153, 1442059200000, 1442080800000, 1, 33, 2 ] + - [ 1442080800000, "BY", 28, 2153, 1442073600000, 1442084400000, 1, 33, 2 ] + - [ 1442084400000, "BY", 1, 2153, 1442077200000, 1442088000000, 1, 33, 3 ] + - [ 1442088000000, "BY", 33, 2153, 1442080800000, null, 1, 33, 3 ] + - [ 1442016000000, "CA", -371, 8544, null, 1442019600000, -371, 164, 1 ] + - [ 1442019600000, "CA", 2184, 8544, null, 1442023200000, -371, 164, 1 ] + - [ 1442023200000, "CA", 286, 8544, 1442016000000, 1442026800000, -371, 164, 1 ] + - [ 1442026800000, "CA", 2216, 8544, 1442019600000, 1442030400000, -371, 164, 1 ] + - [ 1442030400000, "CA", -47, 8544, 1442023200000, 1442034000000, -371, 164, 1 ] + - [ 1442034000000, "CA", 178, 8544, 1442026800000, 1442037600000, -371, 164, 1 ] + - [ 1442037600000, "CA", -132, 8544, 1442030400000, 1442041200000, -371, 164, 1 ] + - [ 1442041200000, "CA", 5, 8544, 1442034000000, 1442044800000, -371, 164, 1 ] + - [ 1442044800000, "CA", 1, 8544, 1442037600000, 1442052000000, -371, 164, 2 ] + - [ 1442052000000, "CA", 38, 8544, 1442041200000, 1442059200000, -371, 164, 2 ] + - [ 1442059200000, "CA", 1036, 8544, 1442044800000, 1442062800000, -371, 164, 2 ] + - [ 1442062800000, "CA", -367, 8544, 1442052000000, 1442066400000, -371, 164, 2 ] + - [ 1442066400000, "CA", 307, 8544, 1442059200000, 1442070000000, -371, 164, 2 ] + - [ 1442070000000, "CA", 185, 8544, 1442062800000, 1442073600000, -371, 164, 2 ] + - [ 1442073600000, "CA", 86, 8544, 1442066400000, 1442077200000, -371, 164, 2 ] + - [ 1442077200000, "CA", -282, 8544, 1442070000000, 1442080800000, -371, 164, 3 ] + - [ 1442080800000, "CA", 481, 8544, 1442073600000, 1442084400000, -371, 164, 3 ] + - [ 1442084400000, "CA", 44, 8544, 1442077200000, 1442088000000, -371, 164, 3 ] + - [ 1442088000000, "CA", 35, 8544, 1442080800000, 1442091600000, -371, 164, 3 ] + - [ 1442091600000, "CA", 2858, 8544, 1442084400000, 1442095200000, -371, 164, 3 ] + - [ 1442095200000, "CA", -361, 8544, 1442088000000, 1442098800000, -371, 164, 3 ] + - [ 1442098800000, "CA", 164, 8544, 1442091600000, null, -371, 164, 3 ] + - [ 1442037600000, "CH", 59, 753, null, 1442041200000, 59, 67, 1 ] + - [ 1442041200000, "CH", 198, 753, null, 1442044800000, 59, 67, 1 ] + - [ 1442044800000, "CH", -54, 753, 1442037600000, 1442048400000, 59, 67, 1 ] + - [ 1442048400000, "CH", 24, 753, 1442041200000, 1442052000000, 59, 67, 1 ] + - [ 1442052000000, "CH", 47, 753, 1442044800000, 1442055600000, 59, 67, 2 ] + - [ 1442055600000, "CH", 0, 753, 1442048400000, 1442062800000, 59, 67, 2 ] + - [ 1442062800000, "CH", 22, 753, 1442052000000, 1442070000000, 59, 67, 2 ] + - [ 1442070000000, "CH", 11, 753, 1442055600000, 1442073600000, 59, 67, 2 ] + - [ 1442073600000, "CH", 360, 753, 1442062800000, 1442077200000, 59, 67, 3 ] + - [ 1442077200000, "CH", 6, 753, 1442070000000, 1442084400000, 59, 67, 3 ] + - [ 1442084400000, "CH", 13, 753, 1442073600000, 1442091600000, 59, 67, 3 ] + - [ 1442091600000, "CH", 67, 753, 1442077200000, null, 59, 67, 3 ] + - [ 1442016000000, "CL", 161, 533, null, 1442019600000, 161, 9, 1 ] + - [ 1442019600000, "CL", -370, 533, null, 1442023200000, 161, 9, 1 ] + - [ 1442023200000, "CL", 15, 533, 1442016000000, 1442030400000, 161, 9, 1 ] + - [ 1442030400000, "CL", 40, 533, 1442019600000, 1442034000000, 161, 9, 1 ] + - [ 1442034000000, "CL", -1, 533, 1442023200000, 1442037600000, 161, 9, 1 ] + - [ 1442037600000, "CL", 2, 533, 1442030400000, 1442041200000, 161, 9, 1 ] + - [ 1442041200000, "CL", -1, 533, 1442034000000, 1442052000000, 161, 9, 1 ] + - [ 1442052000000, "CL", 390, 533, 1442037600000, 1442059200000, 161, 9, 2 ] + - [ 1442059200000, "CL", -12, 533, 1442041200000, 1442062800000, 161, 9, 2 ] + - [ 1442062800000, "CL", 17, 533, 1442052000000, 1442066400000, 161, 9, 2 ] + - [ 1442066400000, "CL", -41, 533, 1442059200000, 1442070000000, 161, 9, 2 ] + - [ 1442070000000, "CL", 13, 533, 1442062800000, 1442073600000, 161, 9, 2 ] + - [ 1442073600000, "CL", 153, 533, 1442066400000, 1442077200000, 161, 9, 2 ] + - [ 1442077200000, "CL", -15, 533, 1442070000000, 1442080800000, 161, 9, 2 ] + - [ 1442080800000, "CL", 17, 533, 1442073600000, 1442084400000, 161, 9, 3 ] + - [ 1442084400000, "CL", 126, 533, 1442077200000, 1442088000000, 161, 9, 3 ] + - [ 1442088000000, "CL", 286, 533, 1442080800000, 1442091600000, 161, 9, 3 ] + - [ 1442091600000, "CL", 20, 533, 1442084400000, 1442095200000, 161, 9, 3 ] + - [ 1442095200000, "CL", -276, 533, 1442088000000, 1442098800000, 161, 9, 3 ] + - [ 1442098800000, "CL", 9, 533, 1442091600000, null, 161, 9, 3 ] + - [ 1442023200000, "CN", -13, 583, null, 1442026800000, -13, -1, 1 ] + - [ 1442026800000, "CN", 154, 583, null, 1442037600000, -13, -1, 1 ] + - [ 1442037600000, "CN", 98, 583, 1442023200000, 1442048400000, -13, -1, 1 ] + - [ 1442048400000, "CN", 293, 583, 1442026800000, 1442052000000, -13, -1, 1 ] + - [ 1442052000000, "CN", 0, 583, 1442037600000, 1442055600000, -13, -1, 2 ] + - [ 1442055600000, "CN", 69, 583, 1442048400000, 1442059200000, -13, -1, 2 ] + - [ 1442059200000, "CN", 8, 583, 1442052000000, 1442066400000, -13, -1, 2 ] + - [ 1442066400000, "CN", -15, 583, 1442055600000, 1442080800000, -13, -1, 3 ] + - [ 1442080800000, "CN", -10, 583, 1442059200000, 1442084400000, -13, -1, 3 ] + - [ 1442084400000, "CN", -1, 583, 1442066400000, null, -13, -1, 3 ] + - [ 1442016000000, "CO", 16, 59611, null, 1442019600000, 16, 83, 1 ] + - [ 1442019600000, "CO", 12, 59611, null, 1442023200000, 16, 83, 1 ] + - [ 1442023200000, "CO", 9, 59611, 1442016000000, 1442030400000, 16, 83, 1 ] + - [ 1442030400000, "CO", 441, 59611, 1442019600000, 1442059200000, 16, 83, 1 ] + - [ 1442059200000, "CO", 473, 59611, 1442023200000, 1442066400000, 16, 83, 1 ] + - [ 1442066400000, "CO", 288, 59611, 1442030400000, 1442070000000, 16, 83, 2 ] + - [ 1442070000000, "CO", -45, 59611, 1442059200000, 1442073600000, 16, 83, 2 ] + - [ 1442073600000, "CO", 39860, 59611, 1442066400000, 1442077200000, 16, 83, 2 ] + - [ 1442077200000, "CO", 581, 59611, 1442070000000, 1442080800000, 16, 83, 2 ] + - [ 1442080800000, "CO", 25, 59611, 1442073600000, 1442084400000, 16, 83, 2 ] + - [ 1442084400000, "CO", 51, 59611, 1442077200000, 1442088000000, 16, 83, 3 ] + - [ 1442088000000, "CO", 17150, 59611, 1442080800000, 1442091600000, 16, 83, 3 ] + - [ 1442091600000, "CO", 377, 59611, 1442084400000, 1442095200000, 16, 83, 3 ] + - [ 1442095200000, "CO", 290, 59611, 1442088000000, 1442098800000, 16, 83, 3 ] + - [ 1442098800000, "CO", 83, 59611, 1442091600000, null, 16, 83, 3 ] + - [ 1442019600000, "CR", 62, 3241, null, 1442023200000, 62, 72, 1 ] + - [ 1442023200000, "CR", 62, 3241, null, 1442026800000, 62, 72, 1 ] + - [ 1442026800000, "CR", 140, 3241, 1442019600000, 1442030400000, 62, 72, 1 ] + - [ 1442030400000, "CR", 2497, 3241, 1442023200000, 1442041200000, 62, 72, 2 ] + - [ 1442041200000, "CR", 51, 3241, 1442026800000, 1442044800000, 62, 72, 2 ] + - [ 1442044800000, "CR", 194, 3241, 1442030400000, 1442048400000, 62, 72, 2 ] + - [ 1442048400000, "CR", 163, 3241, 1442041200000, 1442088000000, 62, 72, 3 ] + - [ 1442088000000, "CR", 72, 3241, 1442044800000, null, 62, 72, 3 ] + - [ 1442026800000, "CZ", -19, 3479, null, 1442034000000, -19, 2, 1 ] + - [ 1442034000000, "CZ", 78, 3479, null, 1442037600000, -19, 2, 1 ] + - [ 1442037600000, "CZ", 18, 3479, 1442026800000, 1442055600000, -19, 2, 1 ] + - [ 1442055600000, "CZ", 1073, 3479, 1442034000000, 1442059200000, -19, 2, 1 ] + - [ 1442059200000, "CZ", 21, 3479, 1442037600000, 1442062800000, -19, 2, 2 ] + - [ 1442062800000, "CZ", 0, 3479, 1442055600000, 1442070000000, -19, 2, 2 ] + - [ 1442070000000, "CZ", 168, 3479, 1442059200000, 1442073600000, -19, 2, 2 ] + - [ 1442073600000, "CZ", 2051, 3479, 1442062800000, 1442077200000, -19, 2, 2 ] + - [ 1442077200000, "CZ", 115, 3479, 1442070000000, 1442080800000, -19, 2, 3 ] + - [ 1442080800000, "CZ", -28, 3479, 1442073600000, 1442098800000, -19, 2, 3 ] + - [ 1442098800000, "CZ", 2, 3479, 1442077200000, null, -19, 2, 3 ] + - [ 1442016000000, "DE", 167, 25583, null, 1442019600000, 167, 329, 1 ] + - [ 1442019600000, "DE", 0, 25583, null, 1442023200000, 167, 329, 1 ] + - [ 1442023200000, "DE", 64, 25583, 1442016000000, 1442030400000, 167, 329, 1 ] + - [ 1442030400000, "DE", 373, 25583, 1442019600000, 1442034000000, 167, 329, 1 ] + - [ 1442034000000, "DE", 358, 25583, 1442023200000, 1442037600000, 167, 329, 1 ] + - [ 1442037600000, "DE", 544, 25583, 1442030400000, 1442041200000, 167, 329, 1 ] + - [ 1442041200000, "DE", 197, 25583, 1442034000000, 1442044800000, 167, 329, 1 ] + - [ 1442044800000, "DE", 979, 25583, 1442037600000, 1442048400000, 167, 329, 1 ] + - [ 1442048400000, "DE", 811, 25583, 1442041200000, 1442052000000, 167, 329, 2 ] + - [ 1442052000000, "DE", 1600, 25583, 1442044800000, 1442055600000, 167, 329, 2 ] + - [ 1442055600000, "DE", 1523, 25583, 1442048400000, 1442059200000, 167, 329, 2 ] + - [ 1442059200000, "DE", 289, 25583, 1442052000000, 1442062800000, 167, 329, 2 ] + - [ 1442062800000, "DE", 283, 25583, 1442055600000, 1442066400000, 167, 329, 2 ] + - [ 1442066400000, "DE", 1577, 25583, 1442059200000, 1442070000000, 167, 329, 2 ] + - [ 1442070000000, "DE", 1666, 25583, 1442062800000, 1442073600000, 167, 329, 2 ] + - [ 1442073600000, "DE", 6075, 25583, 1442066400000, 1442077200000, 167, 329, 2 ] + - [ 1442077200000, "DE", 2188, 25583, 1442070000000, 1442080800000, 167, 329, 3 ] + - [ 1442080800000, "DE", 1133, 25583, 1442073600000, 1442084400000, 167, 329, 3 ] + - [ 1442084400000, "DE", -125, 25583, 1442077200000, 1442088000000, 167, 329, 3 ] + - [ 1442088000000, "DE", 190, 25583, 1442080800000, 1442091600000, 167, 329, 3 ] + - [ 1442091600000, "DE", 4355, 25583, 1442084400000, 1442095200000, 167, 329, 3 ] + - [ 1442095200000, "DE", 1007, 25583, 1442088000000, 1442098800000, 167, 329, 3 ] + - [ 1442098800000, "DE", 329, 25583, 1442091600000, null, 167, 329, 3 ] + - [ 1442037600000, "DK", 10, 594, null, 1442044800000, 10, 0, 1 ] + - [ 1442044800000, "DK", 36, 594, null, 1442048400000, 10, 0, 1 ] + - [ 1442048400000, "DK", -5, 594, 1442037600000, 1442055600000, 10, 0, 1 ] + - [ 1442055600000, "DK", 42, 594, 1442044800000, 1442059200000, 10, 0, 1 ] + - [ 1442059200000, "DK", 0, 594, 1442048400000, 1442062800000, 10, 0, 2 ] + - [ 1442062800000, "DK", 1, 594, 1442055600000, 1442066400000, 10, 0, 2 ] + - [ 1442066400000, "DK", 416, 594, 1442059200000, 1442077200000, 10, 0, 2 ] + - [ 1442077200000, "DK", -9, 594, 1442062800000, 1442080800000, 10, 0, 2 ] + - [ 1442080800000, "DK", 61, 594, 1442066400000, 1442084400000, 10, 0, 3 ] + - [ 1442084400000, "DK", -97, 594, 1442077200000, 1442091600000, 10, 0, 3 ] + - [ 1442091600000, "DK", 139, 594, 1442080800000, 1442095200000, 10, 0, 3 ] + - [ 1442095200000, "DK", 0, 594, 1442084400000, null, 10, 0, 3 ] + - [ 1442023200000, "DO", 8, 264, null, 1442066400000, 8, 13, 1 ] + - [ 1442066400000, "DO", 35, 264, null, 1442073600000, 8, 13, 1 ] + - [ 1442073600000, "DO", 200, 264, 1442023200000, 1442084400000, 8, 13, 2 ] + - [ 1442084400000, "DO", 8, 264, 1442066400000, 1442095200000, 8, 13, 2 ] + - [ 1442095200000, "DO", 13, 264, 1442073600000, null, 8, 13, 3 ] + - [ 1442077200000, "DZ", -1, -1, null, null, -1, -1, 1 ] + - [ 1442019600000, "EC", 29, 232, null, 1442023200000, 29, 10, 1 ] + - [ 1442023200000, "EC", -9, 232, null, 1442030400000, 29, 10, 1 ] + - [ 1442030400000, "EC", 0, 232, 1442019600000, 1442077200000, 29, 10, 2 ] + - [ 1442077200000, "EC", -366, 232, 1442023200000, 1442084400000, 29, 10, 2 ] + - [ 1442084400000, "EC", 568, 232, 1442030400000, 1442095200000, 29, 10, 3 ] + - [ 1442095200000, "EC", 10, 232, 1442077200000, null, 29, 10, 3 ] + - [ 1442041200000, "EE", 37, 18, null, 1442044800000, 37, -19, 1 ] + - [ 1442044800000, "EE", -19, 18, null, null, 37, -19, 2 ] + - [ 1442026800000, "EG", 16, 170, null, 1442055600000, 16, 27, 1 ] + - [ 1442055600000, "EG", 14, 170, null, 1442062800000, 16, 27, 1 ] + - [ 1442062800000, "EG", 112, 170, 1442026800000, 1442073600000, 16, 27, 2 ] + - [ 1442073600000, "EG", 1, 170, 1442055600000, 1442091600000, 16, 27, 2 ] + - [ 1442091600000, "EG", 27, 170, 1442062800000, null, 16, 27, 3 ] + - [ 1442019600000, "ES", 103, 7449, null, 1442023200000, 103, 458, 1 ] + - [ 1442023200000, "ES", -5, 7449, null, 1442034000000, 103, 458, 1 ] + - [ 1442034000000, "ES", -52, 7449, 1442019600000, 1442037600000, 103, 458, 1 ] + - [ 1442037600000, "ES", 3, 7449, 1442023200000, 1442041200000, 103, 458, 1 ] + - [ 1442041200000, "ES", 118, 7449, 1442034000000, 1442044800000, 103, 458, 1 ] + - [ 1442044800000, "ES", -169, 7449, 1442037600000, 1442048400000, 103, 458, 1 ] + - [ 1442048400000, "ES", 158, 7449, 1442041200000, 1442052000000, 103, 458, 1 ] + - [ 1442052000000, "ES", -4, 7449, 1442044800000, 1442055600000, 103, 458, 2 ] + - [ 1442055600000, "ES", 495, 7449, 1442048400000, 1442059200000, 103, 458, 2 ] + - [ 1442059200000, "ES", 1086, 7449, 1442052000000, 1442062800000, 103, 458, 2 ] + - [ 1442062800000, "ES", -71, 7449, 1442055600000, 1442066400000, 103, 458, 2 ] + - [ 1442066400000, "ES", 461, 7449, 1442059200000, 1442070000000, 103, 458, 2 ] + - [ 1442070000000, "ES", 61, 7449, 1442062800000, 1442073600000, 103, 458, 2 ] + - [ 1442073600000, "ES", 154, 7449, 1442066400000, 1442077200000, 103, 458, 2 ] + - [ 1442077200000, "ES", 1240, 7449, 1442070000000, 1442084400000, 103, 458, 3 ] + - [ 1442084400000, "ES", 337, 7449, 1442073600000, 1442088000000, 103, 458, 3 ] + - [ 1442088000000, "ES", -130, 7449, 1442077200000, 1442091600000, 103, 458, 3 ] + - [ 1442091600000, "ES", 700, 7449, 1442084400000, 1442095200000, 103, 458, 3 ] + - [ 1442095200000, "ES", 2506, 7449, 1442088000000, 1442098800000, 103, 458, 3 ] + - [ 1442098800000, "ES", 458, 7449, 1442091600000, null, 103, 458, 3 ] + - [ 1442030400000, "FI", 1491, 3579, null, 1442037600000, 1491, 69, 1 ] + - [ 1442037600000, "FI", 14, 3579, null, 1442048400000, 1491, 69, 1 ] + - [ 1442048400000, "FI", 12, 3579, 1442030400000, 1442052000000, 1491, 69, 1 ] + - [ 1442052000000, "FI", 186, 3579, 1442037600000, 1442059200000, 1491, 69, 1 ] + - [ 1442059200000, "FI", 407, 3579, 1442048400000, 1442062800000, 1491, 69, 2 ] + - [ 1442062800000, "FI", 19, 3579, 1442052000000, 1442066400000, 1491, 69, 2 ] + - [ 1442066400000, "FI", 183, 3579, 1442059200000, 1442073600000, 1491, 69, 2 ] + - [ 1442073600000, "FI", -1, 3579, 1442062800000, 1442077200000, 1491, 69, 2 ] + - [ 1442077200000, "FI", 200, 3579, 1442066400000, 1442080800000, 1491, 69, 3 ] + - [ 1442080800000, "FI", 104, 3579, 1442073600000, 1442084400000, 1491, 69, 3 ] + - [ 1442084400000, "FI", 895, 3579, 1442077200000, 1442095200000, 1491, 69, 3 ] + - [ 1442095200000, "FI", 69, 3579, 1442080800000, null, 1491, 69, 3 ] + - [ 1442016000000, "FR", -1, 37281, null, 1442019600000, -1, 136, 1 ] + - [ 1442019600000, "FR", 585, 37281, null, 1442023200000, -1, 136, 1 ] + - [ 1442023200000, "FR", 628, 37281, 1442016000000, 1442026800000, -1, 136, 1 ] + - [ 1442026800000, "FR", 86, 37281, 1442019600000, 1442034000000, -1, 136, 1 ] + - [ 1442034000000, "FR", 476, 37281, 1442023200000, 1442037600000, -1, 136, 1 ] + - [ 1442037600000, "FR", 4174, 37281, 1442026800000, 1442041200000, -1, 136, 1 ] + - [ 1442041200000, "FR", 604, 37281, 1442034000000, 1442044800000, -1, 136, 1 ] + - [ 1442044800000, "FR", 172, 37281, 1442037600000, 1442048400000, -1, 136, 1 ] + - [ 1442048400000, "FR", 3027, 37281, 1442041200000, 1442052000000, -1, 136, 2 ] + - [ 1442052000000, "FR", 637, 37281, 1442044800000, 1442055600000, -1, 136, 2 ] + - [ 1442055600000, "FR", 463, 37281, 1442048400000, 1442059200000, -1, 136, 2 ] + - [ 1442059200000, "FR", 4650, 37281, 1442052000000, 1442062800000, -1, 136, 2 ] + - [ 1442062800000, "FR", 5676, 37281, 1442055600000, 1442066400000, -1, 136, 2 ] + - [ 1442066400000, "FR", 2516, 37281, 1442059200000, 1442070000000, -1, 136, 2 ] + - [ 1442070000000, "FR", 474, 37281, 1442062800000, 1442073600000, -1, 136, 2 ] + - [ 1442073600000, "FR", 3522, 37281, 1442066400000, 1442077200000, -1, 136, 2 ] + - [ 1442077200000, "FR", -444, 37281, 1442070000000, 1442080800000, -1, 136, 3 ] + - [ 1442080800000, "FR", 557, 37281, 1442073600000, 1442084400000, -1, 136, 3 ] + - [ 1442084400000, "FR", 6643, 37281, 1442077200000, 1442088000000, -1, 136, 3 ] + - [ 1442088000000, "FR", 1872, 37281, 1442080800000, 1442091600000, -1, 136, 3 ] + - [ 1442091600000, "FR", 741, 37281, 1442084400000, 1442095200000, -1, 136, 3 ] + - [ 1442095200000, "FR", 87, 37281, 1442088000000, 1442098800000, -1, 136, 3 ] + - [ 1442098800000, "FR", 136, 37281, 1442091600000, null, -1, 136, 3 ] + - [ 1442016000000, "GB", -44, 35857, null, 1442019600000, -44, 49, 1 ] + - [ 1442019600000, "GB", 54, 35857, null, 1442023200000, -44, 49, 1 ] + - [ 1442023200000, "GB", 1816, 35857, 1442016000000, 1442026800000, -44, 49, 1 ] + - [ 1442026800000, "GB", 339, 35857, 1442019600000, 1442030400000, -44, 49, 1 ] + - [ 1442030400000, "GB", 2524, 35857, 1442023200000, 1442034000000, -44, 49, 1 ] + - [ 1442034000000, "GB", -12, 35857, 1442026800000, 1442037600000, -44, 49, 1 ] + - [ 1442037600000, "GB", 544, 35857, 1442030400000, 1442041200000, -44, 49, 1 ] + - [ 1442041200000, "GB", 42, 35857, 1442034000000, 1442044800000, -44, 49, 1 ] + - [ 1442044800000, "GB", 32, 35857, 1442037600000, 1442048400000, -44, 49, 2 ] + - [ 1442048400000, "GB", 740, 35857, 1442041200000, 1442052000000, -44, 49, 2 ] + - [ 1442052000000, "GB", 168, 35857, 1442044800000, 1442055600000, -44, 49, 2 ] + - [ 1442055600000, "GB", 453, 35857, 1442048400000, 1442059200000, -44, 49, 2 ] + - [ 1442059200000, "GB", 16111, 35857, 1442052000000, 1442062800000, -44, 49, 2 ] + - [ 1442062800000, "GB", 5743, 35857, 1442055600000, 1442066400000, -44, 49, 2 ] + - [ 1442066400000, "GB", 671, 35857, 1442059200000, 1442070000000, -44, 49, 2 ] + - [ 1442070000000, "GB", 374, 35857, 1442062800000, 1442073600000, -44, 49, 2 ] + - [ 1442073600000, "GB", 648, 35857, 1442066400000, 1442077200000, -44, 49, 3 ] + - [ 1442077200000, "GB", 1135, 35857, 1442070000000, 1442080800000, -44, 49, 3 ] + - [ 1442080800000, "GB", 1444, 35857, 1442073600000, 1442084400000, -44, 49, 3 ] + - [ 1442084400000, "GB", 384, 35857, 1442077200000, 1442088000000, -44, 49, 3 ] + - [ 1442088000000, "GB", 1593, 35857, 1442080800000, 1442091600000, -44, 49, 3 ] + - [ 1442091600000, "GB", 811, 35857, 1442084400000, 1442095200000, -44, 49, 3 ] + - [ 1442095200000, "GB", 238, 35857, 1442088000000, 1442098800000, -44, 49, 3 ] + - [ 1442098800000, "GB", 49, 35857, 1442091600000, null, -44, 49, 3 ] + - [ 1442044800000, "GE", -21, -140, null, 1442052000000, -21, -27, 1 ] + - [ 1442052000000, "GE", -108, -140, null, 1442062800000, -21, -27, 1 ] + - [ 1442062800000, "GE", 16, -140, 1442044800000, 1442080800000, -21, -27, 2 ] + - [ 1442080800000, "GE", -27, -140, 1442052000000, null, -21, -27, 3 ] + - [ 1442088000000, "GH", 0, 0, null, null, 0, 0, 1 ] + - [ 1442019600000, "GR", 82, 149, null, 1442034000000, 82, 123, 1 ] + - [ 1442034000000, "GR", 0, 149, null, 1442041200000, 82, 123, 1 ] + - [ 1442041200000, "GR", 7, 149, 1442019600000, 1442048400000, 82, 123, 1 ] + - [ 1442048400000, "GR", -26, 149, 1442034000000, 1442062800000, 82, 123, 1 ] + - [ 1442062800000, "GR", 8, 149, 1442041200000, 1442070000000, 82, 123, 2 ] + - [ 1442070000000, "GR", 2, 149, 1442048400000, 1442073600000, 82, 123, 2 ] + - [ 1442073600000, "GR", -314, 149, 1442062800000, 1442080800000, 82, 123, 2 ] + - [ 1442080800000, "GR", 88, 149, 1442070000000, 1442084400000, 82, 123, 3 ] + - [ 1442084400000, "GR", 179, 149, 1442073600000, 1442091600000, 82, 123, 3 ] + - [ 1442091600000, "GR", 123, 149, 1442080800000, null, 82, 123, 3 ] + - [ 1442023200000, "GT", -167, 7, null, 1442026800000, -167, 1, 1 ] + - [ 1442026800000, "GT", 173, 7, null, 1442098800000, -167, 1, 2 ] + - [ 1442098800000, "GT", 1, 7, 1442023200000, null, -167, 1, 3 ] + - [ 1442019600000, "HK", -113, 10743, null, 1442023200000, -113, -1, 1 ] + - [ 1442023200000, "HK", 2414, 10743, null, 1442026800000, -113, -1, 1 ] + - [ 1442026800000, "HK", -211, 10743, 1442019600000, 1442030400000, -113, -1, 1 ] + - [ 1442030400000, "HK", 157, 10743, 1442023200000, 1442034000000, -113, -1, 1 ] + - [ 1442034000000, "HK", 1137, 10743, 1442026800000, 1442037600000, -113, -1, 1 ] + - [ 1442037600000, "HK", 636, 10743, 1442030400000, 1442041200000, -113, -1, 1 ] + - [ 1442041200000, "HK", -15, 10743, 1442034000000, 1442044800000, -113, -1, 1 ] + - [ 1442044800000, "HK", 21, 10743, 1442037600000, 1442048400000, -113, -1, 2 ] + - [ 1442048400000, "HK", 1, 10743, 1442041200000, 1442052000000, -113, -1, 2 ] + - [ 1442052000000, "HK", 15, 10743, 1442044800000, 1442055600000, -113, -1, 2 ] + - [ 1442055600000, "HK", 804, 10743, 1442048400000, 1442059200000, -113, -1, 2 ] + - [ 1442059200000, "HK", 2, 10743, 1442052000000, 1442062800000, -113, -1, 2 ] + - [ 1442062800000, "HK", 1, 10743, 1442055600000, 1442066400000, -113, -1, 2 ] + - [ 1442066400000, "HK", 39, 10743, 1442059200000, 1442070000000, -113, -1, 3 ] + - [ 1442070000000, "HK", 314, 10743, 1442062800000, 1442073600000, -113, -1, 3 ] + - [ 1442073600000, "HK", 5545, 10743, 1442066400000, 1442080800000, -113, -1, 3 ] + - [ 1442080800000, "HK", 0, 10743, 1442070000000, 1442091600000, -113, -1, 3 ] + - [ 1442091600000, "HK", -3, 10743, 1442073600000, 1442095200000, -113, -1, 3 ] + - [ 1442095200000, "HK", -1, 10743, 1442080800000, null, -113, -1, 3 ] + - [ 1442026800000, "HN", -1, -1, null, null, -1, -1, 1 ] + - [ 1442070000000, "HR", 32, 382, null, 1442073600000, 32, 82, 1 ] + - [ 1442073600000, "HR", 0, 382, null, 1442077200000, 32, 82, 1 ] + - [ 1442077200000, "HR", 58, 382, 1442070000000, 1442080800000, 32, 82, 2 ] + - [ 1442080800000, "HR", 220, 382, 1442073600000, 1442084400000, 32, 82, 2 ] + - [ 1442084400000, "HR", -10, 382, 1442077200000, 1442088000000, 32, 82, 3 ] + - [ 1442088000000, "HR", 82, 382, 1442080800000, null, 32, 82, 3 ] + - [ 1442019600000, "HU", 46, 2116, null, 1442037600000, 46, 110, 1 ] + - [ 1442037600000, "HU", 197, 2116, null, 1442041200000, 46, 110, 1 ] + - [ 1442041200000, "HU", 91, 2116, 1442019600000, 1442044800000, 46, 110, 1 ] + - [ 1442044800000, "HU", 547, 2116, 1442037600000, 1442048400000, 46, 110, 1 ] + - [ 1442048400000, "HU", 499, 2116, 1442041200000, 1442055600000, 46, 110, 1 ] + - [ 1442055600000, "HU", -2, 2116, 1442044800000, 1442062800000, 46, 110, 2 ] + - [ 1442062800000, "HU", 50, 2116, 1442048400000, 1442080800000, 46, 110, 2 ] + - [ 1442080800000, "HU", 242, 2116, 1442055600000, 1442084400000, 46, 110, 2 ] + - [ 1442084400000, "HU", 141, 2116, 1442062800000, 1442088000000, 46, 110, 2 ] + - [ 1442088000000, "HU", -71, 2116, 1442080800000, 1442091600000, 46, 110, 3 ] + - [ 1442091600000, "HU", -5, 2116, 1442084400000, 1442095200000, 46, 110, 3 ] + - [ 1442095200000, "HU", 271, 2116, 1442088000000, 1442098800000, 46, 110, 3 ] + - [ 1442098800000, "HU", 110, 2116, 1442091600000, null, 46, 110, 3 ] + - [ 1442023200000, "ID", 106, -255, null, 1442026800000, 106, 13, 1 ] + - [ 1442026800000, "ID", -416, -255, null, 1442030400000, 106, 13, 1 ] + - [ 1442030400000, "ID", 279, -255, 1442023200000, 1442034000000, 106, 13, 1 ] + - [ 1442034000000, "ID", 19, -255, 1442026800000, 1442037600000, 106, 13, 1 ] + - [ 1442037600000, "ID", 14, -255, 1442030400000, 1442041200000, 106, 13, 1 ] + - [ 1442041200000, "ID", 2, -255, 1442034000000, 1442044800000, 106, 13, 2 ] + - [ 1442044800000, "ID", -388, -255, 1442037600000, 1442055600000, 106, 13, 2 ] + - [ 1442055600000, "ID", 16, -255, 1442041200000, 1442059200000, 106, 13, 2 ] + - [ 1442059200000, "ID", 17, -255, 1442044800000, 1442070000000, 106, 13, 2 ] + - [ 1442070000000, "ID", 42, -255, 1442055600000, 1442091600000, 106, 13, 3 ] + - [ 1442091600000, "ID", 21, -255, 1442059200000, 1442095200000, 106, 13, 3 ] + - [ 1442095200000, "ID", 20, -255, 1442070000000, 1442098800000, 106, 13, 3 ] + - [ 1442098800000, "ID", 13, -255, 1442091600000, null, 106, 13, 3 ] + - [ 1442026800000, "IE", 1, 2142, null, 1442030400000, 1, -71, 1 ] + - [ 1442030400000, "IE", 1, 2142, null, 1442048400000, 1, -71, 1 ] + - [ 1442048400000, "IE", 27, 2142, 1442026800000, 1442066400000, 1, -71, 1 ] + - [ 1442066400000, "IE", 1062, 2142, 1442030400000, 1442070000000, 1, -71, 2 ] + - [ 1442070000000, "IE", -100, 2142, 1442048400000, 1442077200000, 1, -71, 2 ] + - [ 1442077200000, "IE", 403, 2142, 1442066400000, 1442084400000, 1, -71, 2 ] + - [ 1442084400000, "IE", 819, 2142, 1442070000000, 1442091600000, 1, -71, 3 ] + - [ 1442091600000, "IE", -71, 2142, 1442077200000, null, 1, -71, 3 ] + - [ 1442041200000, "IL", 35, 6617, null, 1442044800000, 35, 3, 1 ] + - [ 1442044800000, "IL", 218, 6617, null, 1442048400000, 35, 3, 1 ] + - [ 1442048400000, "IL", 25, 6617, 1442041200000, 1442052000000, 35, 3, 1 ] + - [ 1442052000000, "IL", 2745, 6617, 1442044800000, 1442055600000, 35, 3, 1 ] + - [ 1442055600000, "IL", 4, 6617, 1442048400000, 1442059200000, 35, 3, 1 ] + - [ 1442059200000, "IL", 1205, 6617, 1442052000000, 1442062800000, 35, 3, 1 ] + - [ 1442062800000, "IL", 180, 6617, 1442055600000, 1442066400000, 35, 3, 2 ] + - [ 1442066400000, "IL", 3, 6617, 1442059200000, 1442070000000, 35, 3, 2 ] + - [ 1442070000000, "IL", 49, 6617, 1442062800000, 1442073600000, 35, 3, 2 ] + - [ 1442073600000, "IL", 31, 6617, 1442066400000, 1442077200000, 35, 3, 2 ] + - [ 1442077200000, "IL", 187, 6617, 1442070000000, 1442080800000, 35, 3, 2 ] + - [ 1442080800000, "IL", 88, 6617, 1442073600000, 1442084400000, 35, 3, 3 ] + - [ 1442084400000, "IL", 1137, 6617, 1442077200000, 1442091600000, 35, 3, 3 ] + - [ 1442091600000, "IL", 707, 6617, 1442080800000, 1442095200000, 35, 3, 3 ] + - [ 1442095200000, "IL", 0, 6617, 1442084400000, 1442098800000, 35, 3, 3 ] + - [ 1442098800000, "IL", 3, 6617, 1442091600000, null, 35, 3, 3 ] + - [ 1442016000000, "IN", 1, 29166, null, 1442019600000, 1, 4, 1 ] + - [ 1442019600000, "IN", 38, 29166, null, 1442023200000, 1, 4, 1 ] + - [ 1442023200000, "IN", -142, 29166, 1442016000000, 1442026800000, 1, 4, 1 ] + - [ 1442026800000, "IN", 974, 29166, 1442019600000, 1442030400000, 1, 4, 1 ] + - [ 1442030400000, "IN", 1448, 29166, 1442023200000, 1442034000000, 1, 4, 1 ] + - [ 1442034000000, "IN", 1350, 29166, 1442026800000, 1442037600000, 1, 4, 1 ] + - [ 1442037600000, "IN", 135, 29166, 1442030400000, 1442041200000, 1, 4, 1 ] + - [ 1442041200000, "IN", 80, 29166, 1442034000000, 1442044800000, 1, 4, 1 ] + - [ 1442044800000, "IN", 2677, 29166, 1442037600000, 1442048400000, 1, 4, 2 ] + - [ 1442048400000, "IN", 262, 29166, 1442041200000, 1442052000000, 1, 4, 2 ] + - [ 1442052000000, "IN", 534, 29166, 1442044800000, 1442055600000, 1, 4, 2 ] + - [ 1442055600000, "IN", 166, 29166, 1442048400000, 1442059200000, 1, 4, 2 ] + - [ 1442059200000, "IN", 708, 29166, 1442052000000, 1442062800000, 1, 4, 2 ] + - [ 1442062800000, "IN", 1547, 29166, 1442055600000, 1442066400000, 1, 4, 2 ] + - [ 1442066400000, "IN", 116, 29166, 1442059200000, 1442070000000, 1, 4, 2 ] + - [ 1442070000000, "IN", 12091, 29166, 1442062800000, 1442073600000, 1, 4, 3 ] + - [ 1442073600000, "IN", 1170, 29166, 1442066400000, 1442077200000, 1, 4, 3 ] + - [ 1442077200000, "IN", 5699, 29166, 1442070000000, 1442080800000, 1, 4, 3 ] + - [ 1442080800000, "IN", 0, 29166, 1442073600000, 1442084400000, 1, 4, 3 ] + - [ 1442084400000, "IN", 187, 29166, 1442077200000, 1442088000000, 1, 4, 3 ] + - [ 1442088000000, "IN", 121, 29166, 1442080800000, 1442095200000, 1, 4, 3 ] + - [ 1442095200000, "IN", 4, 29166, 1442084400000, null, 1, 4, 3 ] + - [ 1442041200000, "IQ", -1, 3, null, 1442044800000, -1, -2, 1 ] + - [ 1442044800000, "IQ", 6, 3, null, 1442052000000, -1, -2, 1 ] + - [ 1442052000000, "IQ", 0, 3, 1442041200000, 1442095200000, -1, -2, 2 ] + - [ 1442095200000, "IQ", -2, 3, 1442044800000, null, -1, -2, 3 ] + - [ 1442026800000, "IR", 0, 2698, null, 1442030400000, 0, 0, 1 ] + - [ 1442030400000, "IR", 375, 2698, null, 1442034000000, 0, 0, 1 ] + - [ 1442034000000, "IR", -8, 2698, 1442026800000, 1442041200000, 0, 0, 1 ] + - [ 1442041200000, "IR", -79, 2698, 1442030400000, 1442044800000, 0, 0, 1 ] + - [ 1442044800000, "IR", 306, 2698, 1442034000000, 1442052000000, 0, 0, 1 ] + - [ 1442052000000, "IR", 155, 2698, 1442041200000, 1442055600000, 0, 0, 2 ] + - [ 1442055600000, "IR", -124, 2698, 1442044800000, 1442059200000, 0, 0, 2 ] + - [ 1442059200000, "IR", 1455, 2698, 1442052000000, 1442073600000, 0, 0, 2 ] + - [ 1442073600000, "IR", -193, 2698, 1442055600000, 1442077200000, 0, 0, 2 ] + - [ 1442077200000, "IR", -34, 2698, 1442059200000, 1442080800000, 0, 0, 3 ] + - [ 1442080800000, "IR", 131, 2698, 1442073600000, 1442088000000, 0, 0, 3 ] + - [ 1442088000000, "IR", 714, 2698, 1442077200000, 1442091600000, 0, 0, 3 ] + - [ 1442091600000, "IR", 0, 2698, 1442080800000, null, 0, 0, 3 ] + - [ 1442016000000, "IT", 0, 39091, null, 1442019600000, 0, 565, 1 ] + - [ 1442019600000, "IT", 183, 39091, null, 1442023200000, 0, 565, 1 ] + - [ 1442023200000, "IT", 111, 39091, 1442016000000, 1442026800000, 0, 565, 1 ] + - [ 1442026800000, "IT", 222, 39091, 1442019600000, 1442030400000, 0, 565, 1 ] + - [ 1442030400000, "IT", -17, 39091, 1442023200000, 1442034000000, 0, 565, 1 ] + - [ 1442034000000, "IT", 1006, 39091, 1442026800000, 1442037600000, 0, 565, 1 ] + - [ 1442037600000, "IT", -9, 39091, 1442030400000, 1442041200000, 0, 565, 1 ] + - [ 1442041200000, "IT", 20, 39091, 1442034000000, 1442044800000, 0, 565, 1 ] + - [ 1442044800000, "IT", 1483, 39091, 1442037600000, 1442048400000, 0, 565, 2 ] + - [ 1442048400000, "IT", 676, 39091, 1442041200000, 1442052000000, 0, 565, 2 ] + - [ 1442052000000, "IT", 1880, 39091, 1442044800000, 1442055600000, 0, 565, 2 ] + - [ 1442055600000, "IT", 6240, 39091, 1442048400000, 1442059200000, 0, 565, 2 ] + - [ 1442059200000, "IT", 542, 39091, 1442052000000, 1442062800000, 0, 565, 2 ] + - [ 1442062800000, "IT", 1938, 39091, 1442055600000, 1442066400000, 0, 565, 2 ] + - [ 1442066400000, "IT", 4155, 39091, 1442059200000, 1442070000000, 0, 565, 2 ] + - [ 1442070000000, "IT", 81, 39091, 1442062800000, 1442073600000, 0, 565, 2 ] + - [ 1442073600000, "IT", 2586, 39091, 1442066400000, 1442077200000, 0, 565, 3 ] + - [ 1442077200000, "IT", 2188, 39091, 1442070000000, 1442080800000, 0, 565, 3 ] + - [ 1442080800000, "IT", 5544, 39091, 1442073600000, 1442084400000, 0, 565, 3 ] + - [ 1442084400000, "IT", 2660, 39091, 1442077200000, 1442088000000, 0, 565, 3 ] + - [ 1442088000000, "IT", 3746, 39091, 1442080800000, 1442091600000, 0, 565, 3 ] + - [ 1442091600000, "IT", 351, 39091, 1442084400000, 1442095200000, 0, 565, 3 ] + - [ 1442095200000, "IT", 2940, 39091, 1442088000000, 1442098800000, 0, 565, 3 ] + - [ 1442098800000, "IT", 565, 39091, 1442091600000, null, 0, 565, 3 ] + - [ 1442070000000, "JM", 30, 30, null, null, 30, 30, 1 ] + - [ 1442055600000, "JO", -2, 2, null, 1442059200000, -2, 4, 1 ] + - [ 1442059200000, "JO", 0, 2, null, 1442080800000, -2, 4, 2 ] + - [ 1442080800000, "JO", 4, 2, 1442055600000, null, -2, 4, 3 ] + - [ 1442016000000, "JP", -113, 20378, null, 1442019600000, -113, -6, 1 ] + - [ 1442019600000, "JP", 2002, 20378, null, 1442023200000, -113, -6, 1 ] + - [ 1442023200000, "JP", 1959, 20378, 1442016000000, 1442026800000, -113, -6, 1 ] + - [ 1442026800000, "JP", 1035, 20378, 1442019600000, 1442030400000, -113, -6, 1 ] + - [ 1442030400000, "JP", 805, 20378, 1442023200000, 1442034000000, -113, -6, 1 ] + - [ 1442034000000, "JP", 910, 20378, 1442026800000, 1442037600000, -113, -6, 1 ] + - [ 1442037600000, "JP", 2181, 20378, 1442030400000, 1442041200000, -113, -6, 1 ] + - [ 1442041200000, "JP", 1373, 20378, 1442034000000, 1442044800000, -113, -6, 1 ] + - [ 1442044800000, "JP", 1569, 20378, 1442037600000, 1442048400000, -113, -6, 2 ] + - [ 1442048400000, "JP", 1981, 20378, 1442041200000, 1442052000000, -113, -6, 2 ] + - [ 1442052000000, "JP", 2789, 20378, 1442044800000, 1442055600000, -113, -6, 2 ] + - [ 1442055600000, "JP", 998, 20378, 1442048400000, 1442059200000, -113, -6, 2 ] + - [ 1442059200000, "JP", -85, 20378, 1442052000000, 1442062800000, -113, -6, 2 ] + - [ 1442062800000, "JP", 803, 20378, 1442055600000, 1442066400000, -113, -6, 2 ] + - [ 1442066400000, "JP", 167, 20378, 1442059200000, 1442070000000, -113, -6, 2 ] + - [ 1442070000000, "JP", 79, 20378, 1442062800000, 1442073600000, -113, -6, 2 ] + - [ 1442073600000, "JP", 1162, 20378, 1442066400000, 1442077200000, -113, -6, 3 ] + - [ 1442077200000, "JP", 51, 20378, 1442070000000, 1442080800000, -113, -6, 3 ] + - [ 1442080800000, "JP", 420, 20378, 1442073600000, 1442084400000, -113, -6, 3 ] + - [ 1442084400000, "JP", 13, 20378, 1442077200000, 1442088000000, -113, -6, 3 ] + - [ 1442088000000, "JP", 57, 20378, 1442080800000, 1442091600000, -113, -6, 3 ] + - [ 1442091600000, "JP", 228, 20378, 1442084400000, 1442095200000, -113, -6, 3 ] + - [ 1442095200000, "JP", 0, 20378, 1442088000000, 1442098800000, -113, -6, 3 ] + - [ 1442098800000, "JP", -6, 20378, 1442091600000, null, -113, -6, 3 ] + - [ 1442044800000, "KE", -1, -1, null, null, -1, -1, 1 ] + - [ 1442073600000, "KG", 6, 6, null, null, 6, 6, 1 ] + - [ 1442016000000, "KR", 1024, 13597, null, 1442019600000, 1024, -36, 1 ] + - [ 1442019600000, "KR", 445, 13597, null, 1442023200000, 1024, -36, 1 ] + - [ 1442023200000, "KR", 319, 13597, 1442016000000, 1442026800000, 1024, -36, 1 ] + - [ 1442026800000, "KR", -179, 13597, 1442019600000, 1442030400000, 1024, -36, 1 ] + - [ 1442030400000, "KR", 1035, 13597, 1442023200000, 1442034000000, 1024, -36, 1 ] + - [ 1442034000000, "KR", 434, 13597, 1442026800000, 1442037600000, 1024, -36, 1 ] + - [ 1442037600000, "KR", 26, 13597, 1442030400000, 1442041200000, 1024, -36, 1 ] + - [ 1442041200000, "KR", 20, 13597, 1442034000000, 1442044800000, 1024, -36, 1 ] + - [ 1442044800000, "KR", 829, 13597, 1442037600000, 1442048400000, 1024, -36, 2 ] + - [ 1442048400000, "KR", -374, 13597, 1442041200000, 1442052000000, 1024, -36, 2 ] + - [ 1442052000000, "KR", -3, 13597, 1442044800000, 1442055600000, 1024, -36, 2 ] + - [ 1442055600000, "KR", 3640, 13597, 1442048400000, 1442059200000, 1024, -36, 2 ] + - [ 1442059200000, "KR", 208, 13597, 1442052000000, 1442062800000, 1024, -36, 2 ] + - [ 1442062800000, "KR", 1096, 13597, 1442055600000, 1442066400000, 1024, -36, 2 ] + - [ 1442066400000, "KR", 3299, 13597, 1442059200000, 1442070000000, 1024, -36, 2 ] + - [ 1442070000000, "KR", 222, 13597, 1442062800000, 1442077200000, 1024, -36, 3 ] + - [ 1442077200000, "KR", -40, 13597, 1442066400000, 1442080800000, 1024, -36, 3 ] + - [ 1442080800000, "KR", -33, 13597, 1442070000000, 1442084400000, 1024, -36, 3 ] + - [ 1442084400000, "KR", 314, 13597, 1442077200000, 1442088000000, 1024, -36, 3 ] + - [ 1442088000000, "KR", 524, 13597, 1442080800000, 1442095200000, 1024, -36, 3 ] + - [ 1442095200000, "KR", 827, 13597, 1442084400000, 1442098800000, 1024, -36, 3 ] + - [ 1442098800000, "KR", -36, 13597, 1442088000000, null, 1024, -36, 3 ] + - [ 1442055600000, "KW", -2, 1778, null, 1442070000000, -2, -33, 1 ] + - [ 1442070000000, "KW", 1815, 1778, null, 1442077200000, -2, -33, 1 ] + - [ 1442077200000, "KW", -2, 1778, 1442055600000, 1442080800000, -2, -33, 2 ] + - [ 1442080800000, "KW", -33, 1778, 1442070000000, null, -2, -33, 3 ] + - [ 1442034000000, "KZ", 161, 1261, null, 1442044800000, 161, 91, 1 ] + - [ 1442044800000, "KZ", 401, 1261, null, 1442048400000, 161, 91, 1 ] + - [ 1442048400000, "KZ", 439, 1261, 1442034000000, 1442052000000, 161, 91, 1 ] + - [ 1442052000000, "KZ", 412, 1261, 1442044800000, 1442055600000, 161, 91, 1 ] + - [ 1442055600000, "KZ", 63, 1261, 1442048400000, 1442059200000, 161, 91, 2 ] + - [ 1442059200000, "KZ", 33, 1261, 1442052000000, 1442062800000, 161, 91, 2 ] + - [ 1442062800000, "KZ", 0, 1261, 1442055600000, 1442066400000, 161, 91, 2 ] + - [ 1442066400000, "KZ", 0, 1261, 1442059200000, 1442077200000, 161, 91, 2 ] + - [ 1442077200000, "KZ", -317, 1261, 1442062800000, 1442084400000, 161, 91, 3 ] + - [ 1442084400000, "KZ", -22, 1261, 1442066400000, 1442095200000, 161, 91, 3 ] + - [ 1442095200000, "KZ", 91, 1261, 1442077200000, null, 161, 91, 3 ] + - [ 1442055600000, "LB", -67, -67, null, null, -67, -67, 1 ] + - [ 1442026800000, "LK", 79, 131, null, 1442048400000, 79, -3, 1 ] + - [ 1442048400000, "LK", 8, 131, null, 1442052000000, 79, -3, 1 ] + - [ 1442052000000, "LK", 47, 131, 1442026800000, 1442084400000, 79, -3, 2 ] + - [ 1442084400000, "LK", -3, 131, 1442048400000, null, 79, -3, 3 ] + - [ 1442080800000, "LT", 12, -12, null, 1442098800000, 12, -24, 1 ] + - [ 1442098800000, "LT", -24, -12, null, null, 12, -24, 2 ] + - [ 1442059200000, "LU", 79, 606, null, 1442066400000, 79, 2, 1 ] + - [ 1442066400000, "LU", 0, 606, null, 1442077200000, 79, 2, 1 ] + - [ 1442077200000, "LU", 525, 606, 1442059200000, 1442095200000, 79, 2, 2 ] + - [ 1442095200000, "LU", 2, 606, 1442066400000, null, 79, 2, 3 ] + - [ 1442095200000, "LV", 0, 0, null, null, 0, 0, 1 ] + - [ 1442019600000, "MA", -1, 229, null, 1442055600000, -1, 8, 1 ] + - [ 1442055600000, "MA", 23, 229, null, 1442059200000, -1, 8, 1 ] + - [ 1442059200000, "MA", -56, 229, 1442019600000, 1442062800000, -1, 8, 1 ] + - [ 1442062800000, "MA", 0, 229, 1442055600000, 1442077200000, -1, 8, 2 ] + - [ 1442077200000, "MA", 250, 229, 1442059200000, 1442080800000, -1, 8, 2 ] + - [ 1442080800000, "MA", 5, 229, 1442062800000, 1442098800000, -1, 8, 3 ] + - [ 1442098800000, "MA", 8, 229, 1442077200000, null, -1, 8, 3 ] + - [ 1442077200000, "MD", 6916, 6916, null, null, 6916, 6916, 1 ] + - [ 1442073600000, "ME", 0, 0, null, null, 0, 0, 1 ] + - [ 1442052000000, "MH", 40, 40, null, null, 40, 40, 1 ] + - [ 1442077200000, "MK", -72, -72, null, null, -72, -72, 1 ] + - [ 1442070000000, "MM", 3, 28, null, 1442073600000, 3, 25, 1 ] + - [ 1442073600000, "MM", 25, 28, null, null, 3, 25, 2 ] + - [ 1442034000000, "MO", 30, 48, null, 1442070000000, 30, 18, 1 ] + - [ 1442070000000, "MO", 18, 48, null, null, 30, 18, 2 ] + - [ 1442080800000, "MR", 10, 10, null, null, 10, 10, 1 ] + - [ 1442048400000, "MT", -1, -1, null, null, -1, -1, 1 ] + - [ 1442073600000, "MV", -3, -3, null, null, -3, -3, 1 ] + - [ 1442016000000, "MX", -67, 10472, null, 1442023200000, -67, 28, 1 ] + - [ 1442023200000, "MX", 549, 10472, null, 1442026800000, -67, 28, 1 ] + - [ 1442026800000, "MX", 3642, 10472, 1442016000000, 1442030400000, -67, 28, 1 ] + - [ 1442030400000, "MX", 373, 10472, 1442023200000, 1442034000000, -67, 28, 1 ] + - [ 1442034000000, "MX", 944, 10472, 1442026800000, 1442037600000, -67, 28, 1 ] + - [ 1442037600000, "MX", 4, 10472, 1442030400000, 1442041200000, -67, 28, 1 ] + - [ 1442041200000, "MX", -294, 10472, 1442034000000, 1442066400000, -67, 28, 2 ] + - [ 1442066400000, "MX", -1, 10472, 1442037600000, 1442070000000, -67, 28, 2 ] + - [ 1442070000000, "MX", -1, 10472, 1442041200000, 1442073600000, -67, 28, 2 ] + - [ 1442073600000, "MX", -21, 10472, 1442066400000, 1442077200000, -67, 28, 2 ] + - [ 1442077200000, "MX", 3874, 10472, 1442070000000, 1442080800000, -67, 28, 2 ] + - [ 1442080800000, "MX", -376, 10472, 1442073600000, 1442084400000, -67, 28, 2 ] + - [ 1442084400000, "MX", 981, 10472, 1442077200000, 1442088000000, -67, 28, 3 ] + - [ 1442088000000, "MX", 494, 10472, 1442080800000, 1442091600000, -67, 28, 3 ] + - [ 1442091600000, "MX", 799, 10472, 1442084400000, 1442095200000, -67, 28, 3 ] + - [ 1442095200000, "MX", -456, 10472, 1442088000000, 1442098800000, -67, 28, 3 ] + - [ 1442098800000, "MX", 28, 10472, 1442091600000, null, -67, 28, 3 ] + - [ 1442019600000, "MY", -7, 3207, null, 1442030400000, -7, 739, 1 ] + - [ 1442030400000, "MY", -3, 3207, null, 1442034000000, -7, 739, 1 ] + - [ 1442034000000, "MY", 1028, 3207, 1442019600000, 1442041200000, -7, 739, 1 ] + - [ 1442041200000, "MY", 935, 3207, 1442030400000, 1442044800000, -7, 739, 1 ] + - [ 1442044800000, "MY", -127, 3207, 1442034000000, 1442048400000, -7, 739, 2 ] + - [ 1442048400000, "MY", 649, 3207, 1442041200000, 1442055600000, -7, 739, 2 ] + - [ 1442055600000, "MY", 1, 3207, 1442044800000, 1442059200000, -7, 739, 2 ] + - [ 1442059200000, "MY", 0, 3207, 1442048400000, 1442066400000, -7, 739, 2 ] + - [ 1442066400000, "MY", 1, 3207, 1442055600000, 1442073600000, -7, 739, 3 ] + - [ 1442073600000, "MY", 1, 3207, 1442059200000, 1442077200000, -7, 739, 3 ] + - [ 1442077200000, "MY", -10, 3207, 1442066400000, 1442098800000, -7, 739, 3 ] + - [ 1442098800000, "MY", 739, 3207, 1442073600000, null, -7, 739, 3 ] + - [ 1442052000000, "NG", 208, 214, null, 1442070000000, 208, 6, 1 ] + - [ 1442070000000, "NG", 6, 214, null, null, 208, 6, 2 ] + - [ 1442034000000, "NL", 0, 12162, null, 1442044800000, 0, 4, 1 ] + - [ 1442044800000, "NL", 16, 12162, null, 1442048400000, 0, 4, 1 ] + - [ 1442048400000, "NL", 1303, 12162, 1442034000000, 1442052000000, 0, 4, 1 ] + - [ 1442052000000, "NL", 53, 12162, 1442044800000, 1442055600000, 0, 4, 1 ] + - [ 1442055600000, "NL", 105, 12162, 1442048400000, 1442059200000, 0, 4, 1 ] + - [ 1442059200000, "NL", 206, 12162, 1442052000000, 1442062800000, 0, 4, 1 ] + - [ 1442062800000, "NL", -30, 12162, 1442055600000, 1442066400000, 0, 4, 2 ] + - [ 1442066400000, "NL", 61, 12162, 1442059200000, 1442070000000, 0, 4, 2 ] + - [ 1442070000000, "NL", -84, 12162, 1442062800000, 1442073600000, 0, 4, 2 ] + - [ 1442073600000, "NL", 166, 12162, 1442066400000, 1442077200000, 0, 4, 2 ] + - [ 1442077200000, "NL", 878, 12162, 1442070000000, 1442080800000, 0, 4, 2 ] + - [ 1442080800000, "NL", 8947, 12162, 1442073600000, 1442084400000, 0, 4, 2 ] + - [ 1442084400000, "NL", 436, 12162, 1442077200000, 1442088000000, 0, 4, 3 ] + - [ 1442088000000, "NL", 12, 12162, 1442080800000, 1442091600000, 0, 4, 3 ] + - [ 1442091600000, "NL", 19, 12162, 1442084400000, 1442095200000, 0, 4, 3 ] + - [ 1442095200000, "NL", 70, 12162, 1442088000000, 1442098800000, 0, 4, 3 ] + - [ 1442098800000, "NL", 4, 12162, 1442091600000, null, 0, 4, 3 ] + - [ 1442019600000, "NO", 48, 432, null, 1442048400000, 48, 2, 1 ] + - [ 1442048400000, "NO", -447, 432, null, 1442052000000, 48, 2, 1 ] + - [ 1442052000000, "NO", 447, 432, 1442019600000, 1442055600000, 48, 2, 1 ] + - [ 1442055600000, "NO", 29, 432, 1442048400000, 1442066400000, 48, 2, 1 ] + - [ 1442066400000, "NO", 71, 432, 1442052000000, 1442073600000, 48, 2, 2 ] + - [ 1442073600000, "NO", 222, 432, 1442055600000, 1442080800000, 48, 2, 2 ] + - [ 1442080800000, "NO", 31, 432, 1442066400000, 1442088000000, 48, 2, 2 ] + - [ 1442088000000, "NO", 15, 432, 1442073600000, 1442091600000, 48, 2, 2 ] + - [ 1442091600000, "NO", 15, 432, 1442080800000, 1442095200000, 48, 2, 3 ] + - [ 1442095200000, "NO", -1, 432, 1442088000000, 1442098800000, 48, 2, 3 ] + - [ 1442098800000, "NO", 2, 432, 1442091600000, null, 48, 2, 3 ] + - [ 1442048400000, "NP", 61, 61, null, null, 61, 61, 1 ] + - [ 1442019600000, "NZ", 28, 1693, null, 1442026800000, 28, -2, 1 ] + - [ 1442026800000, "NZ", 635, 1693, null, 1442037600000, 28, -2, 1 ] + - [ 1442037600000, "NZ", 66, 1693, 1442019600000, 1442048400000, 28, -2, 1 ] + - [ 1442048400000, "NZ", 189, 1693, 1442026800000, 1442059200000, 28, -2, 2 ] + - [ 1442059200000, "NZ", 428, 1693, 1442037600000, 1442084400000, 28, -2, 2 ] + - [ 1442084400000, "NZ", -52, 1693, 1442048400000, 1442088000000, 28, -2, 2 ] + - [ 1442088000000, "NZ", 405, 1693, 1442059200000, 1442095200000, 28, -2, 3 ] + - [ 1442095200000, "NZ", -4, 1693, 1442084400000, 1442098800000, 28, -2, 3 ] + - [ 1442098800000, "NZ", -2, 1693, 1442088000000, null, 28, -2, 3 ] + - [ 1442052000000, "OM", 0, 0, null, null, 0, 0, 1 ] + - [ 1442026800000, "PA", 0, 0, null, null, 0, 0, 1 ] + - [ 1442019600000, "PE", 523, 2134, null, 1442023200000, 523, 1861, 1 ] + - [ 1442023200000, "PE", 26, 2134, null, 1442026800000, 523, 1861, 1 ] + - [ 1442026800000, "PE", -12, 2134, 1442019600000, 1442062800000, 523, 1861, 1 ] + - [ 1442062800000, "PE", -12, 2134, 1442023200000, 1442077200000, 523, 1861, 2 ] + - [ 1442077200000, "PE", -163, 2134, 1442026800000, 1442080800000, 523, 1861, 2 ] + - [ 1442080800000, "PE", -2, 2134, 1442062800000, 1442084400000, 523, 1861, 2 ] + - [ 1442084400000, "PE", -68, 2134, 1442077200000, 1442095200000, 523, 1861, 3 ] + - [ 1442095200000, "PE", -19, 2134, 1442080800000, 1442098800000, 523, 1861, 3 ] + - [ 1442098800000, "PE", 1861, 2134, 1442084400000, null, 523, 1861, 3 ] + - [ 1442019600000, "PH", 6, 6613, null, 1442023200000, 6, 8, 1 ] + - [ 1442023200000, "PH", 459, 6613, null, 1442026800000, 6, 8, 1 ] + - [ 1442026800000, "PH", 910, 6613, 1442019600000, 1442030400000, 6, 8, 1 ] + - [ 1442030400000, "PH", 26, 6613, 1442023200000, 1442034000000, 6, 8, 1 ] + - [ 1442034000000, "PH", 59, 6613, 1442026800000, 1442037600000, 6, 8, 1 ] + - [ 1442037600000, "PH", 17, 6613, 1442030400000, 1442041200000, 6, 8, 1 ] + - [ 1442041200000, "PH", 0, 6613, 1442034000000, 1442044800000, 6, 8, 1 ] + - [ 1442044800000, "PH", 55, 6613, 1442037600000, 1442048400000, 6, 8, 2 ] + - [ 1442048400000, "PH", 62, 6613, 1442041200000, 1442052000000, 6, 8, 2 ] + - [ 1442052000000, "PH", 22, 6613, 1442044800000, 1442055600000, 6, 8, 2 ] + - [ 1442055600000, "PH", 1969, 6613, 1442048400000, 1442059200000, 6, 8, 2 ] + - [ 1442059200000, "PH", 273, 6613, 1442052000000, 1442062800000, 6, 8, 2 ] + - [ 1442062800000, "PH", 171, 6613, 1442055600000, 1442066400000, 6, 8, 2 ] + - [ 1442066400000, "PH", 1880, 6613, 1442059200000, 1442070000000, 6, 8, 2 ] + - [ 1442070000000, "PH", 34, 6613, 1442062800000, 1442073600000, 6, 8, 3 ] + - [ 1442073600000, "PH", -227, 6613, 1442066400000, 1442077200000, 6, 8, 3 ] + - [ 1442077200000, "PH", 2, 6613, 1442070000000, 1442080800000, 6, 8, 3 ] + - [ 1442080800000, "PH", 32, 6613, 1442073600000, 1442084400000, 6, 8, 3 ] + - [ 1442084400000, "PH", 39, 6613, 1442077200000, 1442091600000, 6, 8, 3 ] + - [ 1442091600000, "PH", 816, 6613, 1442080800000, 1442098800000, 6, 8, 3 ] + - [ 1442098800000, "PH", 8, 6613, 1442084400000, null, 6, 8, 3 ] + - [ 1442019600000, "PK", 335, 641, null, 1442026800000, 335, 43, 1 ] + - [ 1442026800000, "PK", 101, 641, null, 1442037600000, 335, 43, 1 ] + - [ 1442037600000, "PK", 100, 641, 1442019600000, 1442041200000, 335, 43, 1 ] + - [ 1442041200000, "PK", 24, 641, 1442026800000, 1442048400000, 335, 43, 2 ] + - [ 1442048400000, "PK", 15, 641, 1442037600000, 1442062800000, 335, 43, 2 ] + - [ 1442062800000, "PK", 23, 641, 1442041200000, 1442070000000, 335, 43, 3 ] + - [ 1442070000000, "PK", 43, 641, 1442048400000, null, 335, 43, 3 ] + - [ 1442037600000, "PL", 95, 9815, null, 1442041200000, 95, -9, 1 ] + - [ 1442041200000, "PL", 281, 9815, null, 1442044800000, 95, -9, 1 ] + - [ 1442044800000, "PL", 319, 9815, 1442037600000, 1442048400000, 95, -9, 1 ] + - [ 1442048400000, "PL", 366, 9815, 1442041200000, 1442052000000, 95, -9, 1 ] + - [ 1442052000000, "PL", 330, 9815, 1442044800000, 1442055600000, 95, -9, 1 ] + - [ 1442055600000, "PL", 410, 9815, 1442048400000, 1442059200000, 95, -9, 1 ] + - [ 1442059200000, "PL", 199, 9815, 1442052000000, 1442062800000, 95, -9, 2 ] + - [ 1442062800000, "PL", 4171, 9815, 1442055600000, 1442066400000, 95, -9, 2 ] + - [ 1442066400000, "PL", 34, 9815, 1442059200000, 1442070000000, 95, -9, 2 ] + - [ 1442070000000, "PL", 146, 9815, 1442062800000, 1442073600000, 95, -9, 2 ] + - [ 1442073600000, "PL", 30, 9815, 1442066400000, 1442077200000, 95, -9, 2 ] + - [ 1442077200000, "PL", 324, 9815, 1442070000000, 1442080800000, 95, -9, 2 ] + - [ 1442080800000, "PL", 7, 9815, 1442073600000, 1442084400000, 95, -9, 3 ] + - [ 1442084400000, "PL", 13, 9815, 1442077200000, 1442088000000, 95, -9, 3 ] + - [ 1442088000000, "PL", 346, 9815, 1442080800000, 1442091600000, 95, -9, 3 ] + - [ 1442091600000, "PL", 902, 9815, 1442084400000, 1442095200000, 95, -9, 3 ] + - [ 1442095200000, "PL", 1851, 9815, 1442088000000, 1442098800000, 95, -9, 3 ] + - [ 1442098800000, "PL", -9, 9815, 1442091600000, null, 95, -9, 3 ] + - [ 1442026800000, "PR", 22, 23, null, 1442030400000, 22, 29, 1 ] + - [ 1442030400000, "PR", 2, 23, null, 1442059200000, 22, 29, 1 ] + - [ 1442059200000, "PR", -35, 23, 1442026800000, 1442077200000, 22, 29, 2 ] + - [ 1442077200000, "PR", 5, 23, 1442030400000, 1442095200000, 22, 29, 2 ] + - [ 1442095200000, "PR", 29, 23, 1442059200000, null, 22, 29, 3 ] + - [ 1442019600000, "PT", 172, 4037, null, 1442044800000, 172, 2, 1 ] + - [ 1442044800000, "PT", 11, 4037, null, 1442052000000, 172, 2, 1 ] + - [ 1442052000000, "PT", 102, 4037, 1442019600000, 1442066400000, 172, 2, 1 ] + - [ 1442066400000, "PT", 12, 4037, 1442044800000, 1442070000000, 172, 2, 1 ] + - [ 1442070000000, "PT", 3470, 4037, 1442052000000, 1442077200000, 172, 2, 2 ] + - [ 1442077200000, "PT", -75, 4037, 1442066400000, 1442080800000, 172, 2, 2 ] + - [ 1442080800000, "PT", -79, 4037, 1442070000000, 1442088000000, 172, 2, 2 ] + - [ 1442088000000, "PT", 403, 4037, 1442077200000, 1442095200000, 172, 2, 3 ] + - [ 1442095200000, "PT", 19, 4037, 1442080800000, 1442098800000, 172, 2, 3 ] + - [ 1442098800000, "PT", 2, 4037, 1442088000000, null, 172, 2, 3 ] + - [ 1442019600000, "PY", 1, 634, null, 1442080800000, 1, 628, 1 ] + - [ 1442080800000, "PY", 5, 634, null, 1442084400000, 1, 628, 2 ] + - [ 1442084400000, "PY", 628, 634, 1442019600000, null, 1, 628, 3 ] + - [ 1442041200000, "QA", 13, 13, null, null, 13, 13, 1 ] + - [ 1442034000000, "RO", 68, 2893, null, 1442041200000, 68, 824, 1 ] + - [ 1442041200000, "RO", 845, 2893, null, 1442044800000, 68, 824, 1 ] + - [ 1442044800000, "RO", 284, 2893, 1442034000000, 1442052000000, 68, 824, 1 ] + - [ 1442052000000, "RO", 319, 2893, 1442041200000, 1442055600000, 68, 824, 1 ] + - [ 1442055600000, "RO", 26, 2893, 1442044800000, 1442062800000, 68, 824, 2 ] + - [ 1442062800000, "RO", 541, 2893, 1442052000000, 1442070000000, 68, 824, 2 ] + - [ 1442070000000, "RO", -29, 2893, 1442055600000, 1442073600000, 68, 824, 2 ] + - [ 1442073600000, "RO", 15, 2893, 1442062800000, 1442091600000, 68, 824, 3 ] + - [ 1442091600000, "RO", 0, 2893, 1442070000000, 1442095200000, 68, 824, 3 ] + - [ 1442095200000, "RO", 824, 2893, 1442073600000, null, 68, 824, 3 ] + - [ 1442019600000, "RS", 6, 906, null, 1442062800000, 6, -15, 1 ] + - [ 1442062800000, "RS", 13, 906, null, 1442066400000, 6, -15, 1 ] + - [ 1442066400000, "RS", 0, 906, 1442019600000, 1442073600000, 6, -15, 1 ] + - [ 1442073600000, "RS", 813, 906, 1442062800000, 1442080800000, 6, -15, 2 ] + - [ 1442080800000, "RS", 0, 906, 1442066400000, 1442084400000, 6, -15, 2 ] + - [ 1442084400000, "RS", 89, 906, 1442073600000, 1442091600000, 6, -15, 3 ] + - [ 1442091600000, "RS", -15, 906, 1442080800000, null, 6, -15, 3 ] + - [ 1442019600000, "RU", 2214, 48104, null, 1442023200000, 2214, 12098, 1 ] + - [ 1442023200000, "RU", 299, 48104, null, 1442026800000, 2214, 12098, 1 ] + - [ 1442026800000, "RU", 0, 48104, 1442019600000, 1442030400000, 2214, 12098, 1 ] + - [ 1442030400000, "RU", 76, 48104, 1442023200000, 1442034000000, 2214, 12098, 1 ] + - [ 1442034000000, "RU", 658, 48104, 1442026800000, 1442037600000, 2214, 12098, 1 ] + - [ 1442037600000, "RU", -324, 48104, 1442030400000, 1442041200000, 2214, 12098, 1 ] + - [ 1442041200000, "RU", 580, 48104, 1442034000000, 1442044800000, 2214, 12098, 1 ] + - [ 1442044800000, "RU", 2564, 48104, 1442037600000, 1442048400000, 2214, 12098, 1 ] + - [ 1442048400000, "RU", 1027, 48104, 1442041200000, 1442052000000, 2214, 12098, 2 ] + - [ 1442052000000, "RU", 1214, 48104, 1442044800000, 1442055600000, 2214, 12098, 2 ] + - [ 1442055600000, "RU", 499, 48104, 1442048400000, 1442059200000, 2214, 12098, 2 ] + - [ 1442059200000, "RU", 3902, 48104, 1442052000000, 1442062800000, 2214, 12098, 2 ] + - [ 1442062800000, "RU", 168, 48104, 1442055600000, 1442066400000, 2214, 12098, 2 ] + - [ 1442066400000, "RU", 2047, 48104, 1442059200000, 1442070000000, 2214, 12098, 2 ] + - [ 1442070000000, "RU", 4706, 48104, 1442062800000, 1442073600000, 2214, 12098, 2 ] + - [ 1442073600000, "RU", 1618, 48104, 1442066400000, 1442077200000, 2214, 12098, 2 ] + - [ 1442077200000, "RU", 1162, 48104, 1442070000000, 1442080800000, 2214, 12098, 3 ] + - [ 1442080800000, "RU", 655, 48104, 1442073600000, 1442084400000, 2214, 12098, 3 ] + - [ 1442084400000, "RU", 6461, 48104, 1442077200000, 1442088000000, 2214, 12098, 3 ] + - [ 1442088000000, "RU", 2596, 48104, 1442080800000, 1442091600000, 2214, 12098, 3 ] + - [ 1442091600000, "RU", 3449, 48104, 1442084400000, 1442095200000, 2214, 12098, 3 ] + - [ 1442095200000, "RU", 435, 48104, 1442088000000, 1442098800000, 2214, 12098, 3 ] + - [ 1442098800000, "RU", 12098, 48104, 1442091600000, null, 2214, 12098, 3 ] + - [ 1442037600000, "SA", -97, 1614, null, 1442048400000, -97, 458, 1 ] + - [ 1442048400000, "SA", 14, 1614, null, 1442055600000, -97, 458, 1 ] + - [ 1442055600000, "SA", 11, 1614, 1442037600000, 1442059200000, -97, 458, 1 ] + - [ 1442059200000, "SA", 0, 1614, 1442048400000, 1442066400000, -97, 458, 2 ] + - [ 1442066400000, "SA", 1276, 1614, 1442055600000, 1442073600000, -97, 458, 2 ] + - [ 1442073600000, "SA", 2, 1614, 1442059200000, 1442077200000, -97, 458, 2 ] + - [ 1442077200000, "SA", -50, 1614, 1442066400000, 1442084400000, -97, 458, 3 ] + - [ 1442084400000, "SA", 458, 1614, 1442073600000, null, -97, 458, 3 ] + - [ 1442019600000, "SE", 109, 1838, null, 1442023200000, 109, 0, 1 ] + - [ 1442023200000, "SE", 3, 1838, null, 1442030400000, 109, 0, 1 ] + - [ 1442030400000, "SE", 30, 1838, 1442019600000, 1442041200000, 109, 0, 1 ] + - [ 1442041200000, "SE", 91, 1838, 1442023200000, 1442048400000, 109, 0, 1 ] + - [ 1442048400000, "SE", -145, 1838, 1442030400000, 1442052000000, 109, 0, 1 ] + - [ 1442052000000, "SE", 1, 1838, 1442041200000, 1442055600000, 109, 0, 2 ] + - [ 1442055600000, "SE", -5, 1838, 1442048400000, 1442059200000, 109, 0, 2 ] + - [ 1442059200000, "SE", 1476, 1838, 1442052000000, 1442066400000, 109, 0, 2 ] + - [ 1442066400000, "SE", 14, 1838, 1442055600000, 1442070000000, 109, 0, 2 ] + - [ 1442070000000, "SE", 78, 1838, 1442059200000, 1442080800000, 109, 0, 2 ] + - [ 1442080800000, "SE", 89, 1838, 1442066400000, 1442084400000, 109, 0, 3 ] + - [ 1442084400000, "SE", 37, 1838, 1442070000000, 1442091600000, 109, 0, 3 ] + - [ 1442091600000, "SE", -1, 1838, 1442080800000, 1442095200000, 109, 0, 3 ] + - [ 1442095200000, "SE", 61, 1838, 1442084400000, 1442098800000, 109, 0, 3 ] + - [ 1442098800000, "SE", 0, 1838, 1442091600000, null, 109, 0, 3 ] + - [ 1442026800000, "SG", 2758, 3338, null, 1442030400000, 2758, 0, 1 ] + - [ 1442030400000, "SG", 1, 3338, null, 1442037600000, 2758, 0, 1 ] + - [ 1442037600000, "SG", 3, 3338, 1442026800000, 1442041200000, 2758, 0, 1 ] + - [ 1442041200000, "SG", 59, 3338, 1442030400000, 1442044800000, 2758, 0, 2 ] + - [ 1442044800000, "SG", 77, 3338, 1442037600000, 1442048400000, 2758, 0, 2 ] + - [ 1442048400000, "SG", 52, 3338, 1442041200000, 1442062800000, 2758, 0, 2 ] + - [ 1442062800000, "SG", 388, 3338, 1442044800000, 1442066400000, 2758, 0, 3 ] + - [ 1442066400000, "SG", 0, 3338, 1442048400000, null, 2758, 0, 3 ] + - [ 1442080800000, "SI", -45, -36, null, 1442091600000, -45, 9, 1 ] + - [ 1442091600000, "SI", 9, -36, null, null, -45, 9, 2 ] + - [ 1442037600000, "SK", -1, 379, null, 1442052000000, -1, 7, 1 ] + - [ 1442052000000, "SK", 13, 379, null, 1442062800000, -1, 7, 1 ] + - [ 1442062800000, "SK", 6, 379, 1442037600000, 1442073600000, -1, 7, 2 ] + - [ 1442073600000, "SK", 446, 379, 1442052000000, 1442084400000, -1, 7, 2 ] + - [ 1442084400000, "SK", -92, 379, 1442062800000, 1442098800000, -1, 7, 3 ] + - [ 1442098800000, "SK", 7, 379, 1442073600000, null, -1, 7, 3 ] + - [ 1442019600000, "SV", -1, 114, null, 1442084400000, -1, 9, 1 ] + - [ 1442084400000, "SV", 106, 114, null, 1442088000000, -1, 9, 2 ] + - [ 1442088000000, "SV", 9, 114, 1442019600000, null, -1, 9, 3 ] + - [ 1442034000000, "TH", 0, 24, null, 1442041200000, 0, 13, 1 ] + - [ 1442041200000, "TH", 3, 24, null, 1442044800000, 0, 13, 1 ] + - [ 1442044800000, "TH", 110, 24, 1442034000000, 1442052000000, 0, 13, 1 ] + - [ 1442052000000, "TH", -22, 24, 1442041200000, 1442055600000, 0, 13, 2 ] + - [ 1442055600000, "TH", 0, 24, 1442044800000, 1442062800000, 0, 13, 2 ] + - [ 1442062800000, "TH", -46, 24, 1442052000000, 1442066400000, 0, 13, 2 ] + - [ 1442066400000, "TH", -34, 24, 1442055600000, 1442070000000, 0, 13, 3 ] + - [ 1442070000000, "TH", 0, 24, 1442062800000, 1442084400000, 0, 13, 3 ] + - [ 1442084400000, "TH", 13, 24, 1442066400000, null, 0, 13, 3 ] + - [ 1442048400000, "TJ", 1471, 1471, null, null, 1471, 1471, 1 ] + - [ 1442098800000, "TN", -9, -9, null, null, -9, -9, 1 ] + - [ 1442023200000, "TR", 306, 7078, null, 1442041200000, 306, -29, 1 ] + - [ 1442041200000, "TR", 1, 7078, null, 1442044800000, 306, -29, 1 ] + - [ 1442044800000, "TR", 41, 7078, 1442023200000, 1442048400000, 306, -29, 1 ] + - [ 1442048400000, "TR", 88, 7078, 1442041200000, 1442052000000, 306, -29, 1 ] + - [ 1442052000000, "TR", 41, 7078, 1442044800000, 1442055600000, 306, -29, 1 ] + - [ 1442055600000, "TR", 299, 7078, 1442048400000, 1442062800000, 306, -29, 2 ] + - [ 1442062800000, "TR", 315, 7078, 1442052000000, 1442066400000, 306, -29, 2 ] + - [ 1442066400000, "TR", 85, 7078, 1442055600000, 1442070000000, 306, -29, 2 ] + - [ 1442070000000, "TR", 236, 7078, 1442062800000, 1442077200000, 306, -29, 2 ] + - [ 1442077200000, "TR", 89, 7078, 1442066400000, 1442080800000, 306, -29, 2 ] + - [ 1442080800000, "TR", -1, 7078, 1442070000000, 1442084400000, 306, -29, 3 ] + - [ 1442084400000, "TR", 170, 7078, 1442077200000, 1442088000000, 306, -29, 3 ] + - [ 1442088000000, "TR", 2389, 7078, 1442080800000, 1442091600000, 306, -29, 3 ] + - [ 1442091600000, "TR", 3048, 7078, 1442084400000, 1442095200000, 306, -29, 3 ] + - [ 1442095200000, "TR", -29, 7078, 1442088000000, null, 306, -29, 3 ] + - [ 1442088000000, "TT", 9, 9, null, null, 9, 9, 1 ] + - [ 1442016000000, "TW", 92, 3656, null, 1442019600000, 92, -60, 1 ] + - [ 1442019600000, "TW", 0, 3656, null, 1442023200000, 92, -60, 1 ] + - [ 1442023200000, "TW", 97, 3656, 1442016000000, 1442026800000, 92, -60, 1 ] + - [ 1442026800000, "TW", 680, 3656, 1442019600000, 1442030400000, 92, -60, 1 ] + - [ 1442030400000, "TW", 0, 3656, 1442023200000, 1442034000000, 92, -60, 1 ] + - [ 1442034000000, "TW", 143, 3656, 1442026800000, 1442037600000, 92, -60, 1 ] + - [ 1442037600000, "TW", 266, 3656, 1442030400000, 1442041200000, 92, -60, 1 ] + - [ 1442041200000, "TW", 366, 3656, 1442034000000, 1442044800000, 92, -60, 1 ] + - [ 1442044800000, "TW", 24, 3656, 1442037600000, 1442048400000, 92, -60, 2 ] + - [ 1442048400000, "TW", 75, 3656, 1442041200000, 1442052000000, 92, -60, 2 ] + - [ 1442052000000, "TW", 24, 3656, 1442044800000, 1442055600000, 92, -60, 2 ] + - [ 1442055600000, "TW", 48, 3656, 1442048400000, 1442059200000, 92, -60, 2 ] + - [ 1442059200000, "TW", -157, 3656, 1442052000000, 1442062800000, 92, -60, 2 ] + - [ 1442062800000, "TW", -272, 3656, 1442055600000, 1442066400000, 92, -60, 2 ] + - [ 1442066400000, "TW", 624, 3656, 1442059200000, 1442070000000, 92, -60, 2 ] + - [ 1442070000000, "TW", 485, 3656, 1442062800000, 1442073600000, 92, -60, 3 ] + - [ 1442073600000, "TW", 772, 3656, 1442066400000, 1442077200000, 92, -60, 3 ] + - [ 1442077200000, "TW", 502, 3656, 1442070000000, 1442080800000, 92, -60, 3 ] + - [ 1442080800000, "TW", 24, 3656, 1442073600000, 1442084400000, 92, -60, 3 ] + - [ 1442084400000, "TW", 0, 3656, 1442077200000, 1442095200000, 92, -60, 3 ] + - [ 1442095200000, "TW", -77, 3656, 1442080800000, 1442098800000, 92, -60, 3 ] + - [ 1442098800000, "TW", -60, 3656, 1442084400000, null, 92, -60, 3 ] + - [ 1442034000000, "UA", 3468, 24898, null, 1442037600000, 3468, 38, 1 ] + - [ 1442037600000, "UA", -1, 24898, null, 1442041200000, 3468, 38, 1 ] + - [ 1442041200000, "UA", 74, 24898, 1442034000000, 1442044800000, 3468, 38, 1 ] + - [ 1442044800000, "UA", 280, 24898, 1442037600000, 1442048400000, 3468, 38, 1 ] + - [ 1442048400000, "UA", 2, 24898, 1442041200000, 1442052000000, 3468, 38, 1 ] + - [ 1442052000000, "UA", 410, 24898, 1442044800000, 1442055600000, 3468, 38, 1 ] + - [ 1442055600000, "UA", 14202, 24898, 1442048400000, 1442059200000, 3468, 38, 1 ] + - [ 1442059200000, "UA", -2, 24898, 1442052000000, 1442062800000, 3468, 38, 2 ] + - [ 1442062800000, "UA", 773, 24898, 1442055600000, 1442066400000, 3468, 38, 2 ] + - [ 1442066400000, "UA", 296, 24898, 1442059200000, 1442070000000, 3468, 38, 2 ] + - [ 1442070000000, "UA", 1733, 24898, 1442062800000, 1442073600000, 3468, 38, 2 ] + - [ 1442073600000, "UA", 4241, 24898, 1442066400000, 1442077200000, 3468, 38, 2 ] + - [ 1442077200000, "UA", -181, 24898, 1442070000000, 1442080800000, 3468, 38, 2 ] + - [ 1442080800000, "UA", -1, 24898, 1442073600000, 1442084400000, 3468, 38, 3 ] + - [ 1442084400000, "UA", 5, 24898, 1442077200000, 1442088000000, 3468, 38, 3 ] + - [ 1442088000000, "UA", -21, 24898, 1442080800000, 1442091600000, 3468, 38, 3 ] + - [ 1442091600000, "UA", -388, 24898, 1442084400000, 1442095200000, 3468, 38, 3 ] + - [ 1442095200000, "UA", -30, 24898, 1442088000000, 1442098800000, 3468, 38, 3 ] + - [ 1442098800000, "UA", 38, 24898, 1442091600000, null, 3468, 38, 3 ] + - [ 1442070000000, "UG", 1, 1, null, null, 1, 1, 1 ] + - [ 1442016000000, "US", 0, 38882, null, 1442019600000, 0, 3575, 1 ] + - [ 1442019600000, "US", 1043, 38882, null, 1442023200000, 0, 3575, 1 ] + - [ 1442023200000, "US", 2844, 38882, 1442016000000, 1442026800000, 0, 3575, 1 ] + - [ 1442026800000, "US", 1512, 38882, 1442019600000, 1442030400000, 0, 3575, 1 ] + - [ 1442030400000, "US", 2023, 38882, 1442023200000, 1442034000000, 0, 3575, 1 ] + - [ 1442034000000, "US", 3648, 38882, 1442026800000, 1442037600000, 0, 3575, 1 ] + - [ 1442037600000, "US", 3675, 38882, 1442030400000, 1442041200000, 0, 3575, 1 ] + - [ 1442041200000, "US", 1999, 38882, 1442034000000, 1442044800000, 0, 3575, 1 ] + - [ 1442044800000, "US", 139, 38882, 1442037600000, 1442048400000, 0, 3575, 2 ] + - [ 1442048400000, "US", -466, 38882, 1442041200000, 1442052000000, 0, 3575, 2 ] + - [ 1442052000000, "US", -2, 38882, 1442044800000, 1442055600000, 0, 3575, 2 ] + - [ 1442055600000, "US", 156, 38882, 1442048400000, 1442059200000, 0, 3575, 2 ] + - [ 1442059200000, "US", 11, 38882, 1442052000000, 1442062800000, 0, 3575, 2 ] + - [ 1442062800000, "US", 47, 38882, 1442055600000, 1442066400000, 0, 3575, 2 ] + - [ 1442066400000, "US", 772, 38882, 1442059200000, 1442070000000, 0, 3575, 2 ] + - [ 1442070000000, "US", 3505, 38882, 1442062800000, 1442073600000, 0, 3575, 2 ] + - [ 1442073600000, "US", 1100, 38882, 1442066400000, 1442077200000, 0, 3575, 3 ] + - [ 1442077200000, "US", 2168, 38882, 1442070000000, 1442080800000, 0, 3575, 3 ] + - [ 1442080800000, "US", 4001, 38882, 1442073600000, 1442084400000, 0, 3575, 3 ] + - [ 1442084400000, "US", 2523, 38882, 1442077200000, 1442088000000, 0, 3575, 3 ] + - [ 1442088000000, "US", 1691, 38882, 1442080800000, 1442091600000, 0, 3575, 3 ] + - [ 1442091600000, "US", 2502, 38882, 1442084400000, 1442095200000, 0, 3575, 3 ] + - [ 1442095200000, "US", 416, 38882, 1442088000000, 1442098800000, 0, 3575, 3 ] + - [ 1442098800000, "US", 3575, 38882, 1442091600000, null, 0, 3575, 3 ] + - [ 1442019600000, "UY", 77, 936, null, 1442023200000, 77, 23, 1 ] + - [ 1442023200000, "UY", 517, 936, null, 1442026800000, 77, 23, 1 ] + - [ 1442026800000, "UY", 76, 936, 1442019600000, 1442037600000, 77, 23, 1 ] + - [ 1442037600000, "UY", 1, 936, 1442023200000, 1442070000000, 77, 23, 2 ] + - [ 1442070000000, "UY", 284, 936, 1442026800000, 1442073600000, 77, 23, 2 ] + - [ 1442073600000, "UY", -42, 936, 1442037600000, 1442077200000, 77, 23, 3 ] + - [ 1442077200000, "UY", 23, 936, 1442070000000, null, 77, 23, 3 ] + - [ 1442044800000, "UZ", 1369, 1369, null, null, 1369, 1369, 1 ] + - [ 1442023200000, "VE", 115, 1101, null, 1442026800000, 115, 9, 1 ] + - [ 1442026800000, "VE", -17, 1101, null, 1442030400000, 115, 9, 1 ] + - [ 1442030400000, "VE", 51, 1101, 1442023200000, 1442034000000, 115, 9, 1 ] + - [ 1442034000000, "VE", -2, 1101, 1442026800000, 1442066400000, 115, 9, 1 ] + - [ 1442066400000, "VE", 18, 1101, 1442030400000, 1442070000000, 115, 9, 2 ] + - [ 1442070000000, "VE", 420, 1101, 1442034000000, 1442077200000, 115, 9, 2 ] + - [ 1442077200000, "VE", 412, 1101, 1442066400000, 1442084400000, 115, 9, 2 ] + - [ 1442084400000, "VE", 60, 1101, 1442070000000, 1442095200000, 115, 9, 3 ] + - [ 1442095200000, "VE", 35, 1101, 1442077200000, 1442098800000, 115, 9, 3 ] + - [ 1442098800000, "VE", 9, 1101, 1442084400000, null, 115, 9, 3 ] + - [ 1442062800000, "VG", -238, -238, null, null, -238, -238, 1 ] + - [ 1442023200000, "VN", -9, 1560, null, 1442026800000, -9, -10, 1 ] + - [ 1442026800000, "VN", 63, 1560, null, 1442034000000, -9, -10, 1 ] + - [ 1442034000000, "VN", -29, 1560, 1442023200000, 1442037600000, -9, -10, 1 ] + - [ 1442037600000, "VN", -11, 1560, 1442026800000, 1442041200000, -9, -10, 1 ] + - [ 1442041200000, "VN", 0, 1560, 1442034000000, 1442048400000, -9, -10, 1 ] + - [ 1442048400000, "VN", -15, 1560, 1442037600000, 1442052000000, -9, -10, 2 ] + - [ 1442052000000, "VN", 90, 1560, 1442041200000, 1442055600000, -9, -10, 2 ] + - [ 1442055600000, "VN", 37, 1560, 1442048400000, 1442059200000, -9, -10, 2 ] + - [ 1442059200000, "VN", 8, 1560, 1442052000000, 1442062800000, -9, -10, 2 ] + - [ 1442062800000, "VN", 146, 1560, 1442055600000, 1442066400000, -9, -10, 3 ] + - [ 1442066400000, "VN", 811, 1560, 1442059200000, 1442070000000, -9, -10, 3 ] + - [ 1442070000000, "VN", 479, 1560, 1442062800000, 1442084400000, -9, -10, 3 ] + - [ 1442084400000, "VN", -10, 1560, 1442066400000, null, -9, -10, 3 ] + - [ 1442034000000, "ZA", -3, 127, null, 1442048400000, -3, 1, 1 ] + - [ 1442048400000, "ZA", 79, 127, null, 1442059200000, -3, 1, 1 ] + - [ 1442059200000, "ZA", 50, 127, 1442034000000, 1442070000000, -3, 1, 2 ] + - [ 1442070000000, "ZA", 0, 127, 1442048400000, 1442091600000, -3, 1, 2 ] + - [ 1442091600000, "ZA", 1, 127, 1442059200000, null, -3, 1, 3 ] + - [ 1442041200000, "ZM", 133, 133, null, null, 133, 133, 1 ] + - [ 1442044800000, "ZW", 0, 254, null, 1442048400000, 0, 254, 1 ] + - [ 1442048400000, "ZW", 254, 254, null, null, 0, 254, 2 ] \ No newline at end of file