Fix non-sqlcompat validation in CalciteWindowQueryTest (#15086)

* fixes

* check for latest rewrite place

* Revert "check for latest rewrite place"

This reverts commit 5cf1e2c1ca.

* some stuff

(cherry picked from commit ab346d4373ea888eb8ef6115e018e7fb0d27407f)

* update test output

* updates to test ouptuts

* some stuff

* move validator

* cleanup

* fix

* change test slightly

* add apidoc cleanup warnings

* cleanup/etc

* instead of telling the story; add a fail with some reason whats the issue

* lead-lag fix

* add test

* remove unnecessary throw

* druidexception-trial

* Revert "druidexception-trial"

This reverts commit 8fa06644bc.

* undo changes to no_grouping; add no_grouping2

* add missing assert on resultcount

* rename method; update

* introduce enum/etc

* make resultmatchmode accessible from TestBuilder#expectedResults

* fix dump results to use log

* fix

* handle null correctly

* disable feature type based things for MSQ

* fix varianssqlaggtest

* use eps in other test

* fix intellij error

* add final

* addrss review

* update test/string/etc

* write concat in 3 lines :D
This commit is contained in:
Zoltan Haindrich 2023-10-11 21:34:31 +02:00 committed by GitHub
parent c6ca990f1f
commit ae88f2c0b6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 3699 additions and 3482 deletions

View File

@ -53,7 +53,6 @@ import org.apache.druid.sql.calcite.util.SpecificSegmentsQuerySegmentWalker;
import org.apache.druid.sql.calcite.util.TestDataBuilder;
import org.apache.druid.timeline.DataSegment;
import org.apache.druid.timeline.partition.LinearShardSpec;
import org.junit.Assert;
import org.junit.Test;
import java.io.IOException;
@ -130,6 +129,7 @@ public class TDigestSketchSqlAggregatorTest extends BaseCalciteQueryTest
.context(QUERY_CONTEXT_DEFAULT)
.build()
),
ResultMatchMode.EQUALS_EPS,
ImmutableList.of(
new String[]{
"\"AAAAAT/wAAAAAAAAQBgAAAAAAABAaQAAAAAAAAAAAAY/8AAAAAAAAD/wAAAAAAAAP/AAAAAAAABAAAAAAAAAAD/wAAAAAAAAQAgAAAAAAAA/8AAAAAAAAEAQAAAAAAAAP/AAAAAAAABAFAAAAAAAAD/wAAAAAAAAQBgAAAAAAAA=\""
@ -166,6 +166,7 @@ public class TDigestSketchSqlAggregatorTest extends BaseCalciteQueryTest
.context(QUERY_CONTEXT_DEFAULT)
.build()
),
ResultMatchMode.EQUALS_EPS,
ImmutableList.of(
NullHandling.replaceWithDefault()
? new String[]{
@ -198,6 +199,7 @@ public class TDigestSketchSqlAggregatorTest extends BaseCalciteQueryTest
.context(QUERY_CONTEXT_DEFAULT)
.build()
),
ResultMatchMode.EQUALS_EPS,
ImmutableList.of(
new Object[]{"\"AAAAAT/wAAAAAAAAQBgAAAAAAABAWQAAAAAAAAAAAAY/8AAAAAAAAD/wAAAAAAAAP/AAAAAAAABAAAAAAAAAAD/wAAAAAAAAQAgAAAAAAAA/8AAAAAAAAEAQAAAAAAAAP/AAAAAAAABAFAAAAAAAAD/wAAAAAAAAQBgAAAAAAAA=\""}
)
@ -242,6 +244,7 @@ public class TDigestSketchSqlAggregatorTest extends BaseCalciteQueryTest
.context(QUERY_CONTEXT_DEFAULT)
.build()
),
ResultMatchMode.EQUALS_EPS,
expectedResults
);
}
@ -297,6 +300,7 @@ public class TDigestSketchSqlAggregatorTest extends BaseCalciteQueryTest
.setContext(QUERY_CONTEXT_DEFAULT)
.build()
),
ResultMatchMode.EQUALS_EPS,
expectedResults
);
}
@ -334,6 +338,7 @@ public class TDigestSketchSqlAggregatorTest extends BaseCalciteQueryTest
.context(QUERY_CONTEXT_DEFAULT)
.build()
),
ResultMatchMode.EQUALS_EPS,
expectedResults
);
}
@ -370,6 +375,7 @@ public class TDigestSketchSqlAggregatorTest extends BaseCalciteQueryTest
.context(QUERY_CONTEXT_DEFAULT)
.build()
),
ResultMatchMode.EQUALS_EPS,
ImmutableList.of(
new Object[]{1.0, 3.5, 6.0}
)
@ -421,6 +427,7 @@ public class TDigestSketchSqlAggregatorTest extends BaseCalciteQueryTest
.context(QUERY_CONTEXT_DEFAULT)
.build()
),
ResultMatchMode.EQUALS_EPS,
ImmutableList.of(
NullHandling.replaceWithDefault()
? new Object[]{0.0, 0.5, 10.1}
@ -455,6 +462,7 @@ public class TDigestSketchSqlAggregatorTest extends BaseCalciteQueryTest
.context(QUERY_CONTEXT_DEFAULT)
.build()
),
ResultMatchMode.EQUALS_EPS,
ImmutableList.of(
new Object[]{"\"AAAAAX/wAAAAAAAA//AAAAAAAABAWQAAAAAAAAAAAAA=\"", Double.NaN}
)
@ -499,32 +507,13 @@ public class TDigestSketchSqlAggregatorTest extends BaseCalciteQueryTest
.setContext(QUERY_CONTEXT_DEFAULT)
.build()
),
ResultMatchMode.EQUALS_EPS,
ImmutableList.of(
new Object[]{"a", "\"AAAAAX/wAAAAAAAA//AAAAAAAABAWQAAAAAAAAAAAAA=\"", Double.NaN}
)
);
}
@Override
public void assertResultsEquals(String sql, List<Object[]> expectedResults, List<Object[]> results)
{
Assert.assertEquals(expectedResults.size(), results.size());
for (int i = 0; i < expectedResults.size(); i++) {
Object[] expectedResult = expectedResults.get(i);
Object[] result = results.get(i);
Assert.assertEquals(expectedResult.length, result.length);
for (int j = 0; j < expectedResult.length; j++) {
if (expectedResult[j] instanceof Float) {
Assert.assertEquals((Float) expectedResult[j], (Float) result[j], 0.000001);
} else if (expectedResult[j] instanceof Double) {
Assert.assertEquals((Double) expectedResult[j], (Double) result[j], 0.000001);
} else {
Assert.assertEquals(expectedResult[j], result[j]);
}
}
}
}
private static PostAggregator makeFieldAccessPostAgg(String name)
{
return new FieldAccessPostAggregator(name, name);

View File

@ -62,7 +62,6 @@ import org.apache.druid.sql.calcite.util.SpecificSegmentsQuerySegmentWalker;
import org.apache.druid.sql.calcite.util.TestDataBuilder;
import org.apache.druid.timeline.DataSegment;
import org.apache.druid.timeline.partition.LinearShardSpec;
import org.junit.Assert;
import org.junit.Test;
import java.io.IOException;
@ -196,6 +195,7 @@ public class VarianceSqlAggregatorTest extends BaseCalciteQueryTest
.context(BaseCalciteQueryTest.QUERY_CONTEXT_DEFAULT)
.build()
),
ResultMatchMode.EQUALS_EPS,
expectedResults
);
}
@ -243,6 +243,7 @@ public class VarianceSqlAggregatorTest extends BaseCalciteQueryTest
.context(BaseCalciteQueryTest.QUERY_CONTEXT_DEFAULT)
.build()
),
ResultMatchMode.EQUALS_EPS,
expectedResults
);
}
@ -298,6 +299,7 @@ public class VarianceSqlAggregatorTest extends BaseCalciteQueryTest
.context(BaseCalciteQueryTest.QUERY_CONTEXT_DEFAULT)
.build()
),
ResultMatchMode.EQUALS_EPS,
expectedResults
);
}
@ -351,6 +353,7 @@ public class VarianceSqlAggregatorTest extends BaseCalciteQueryTest
.context(BaseCalciteQueryTest.QUERY_CONTEXT_DEFAULT)
.build()
),
ResultMatchMode.EQUALS_EPS,
expectedResults
);
}
@ -409,6 +412,7 @@ public class VarianceSqlAggregatorTest extends BaseCalciteQueryTest
.context(BaseCalciteQueryTest.QUERY_CONTEXT_DEFAULT)
.build()
),
ResultMatchMode.EQUALS_EPS,
expectedResults
);
}
@ -455,6 +459,7 @@ public class VarianceSqlAggregatorTest extends BaseCalciteQueryTest
.setContext(BaseCalciteQueryTest.QUERY_CONTEXT_DEFAULT)
.build()
),
ResultMatchMode.EQUALS_EPS,
expectedResults
);
}
@ -491,6 +496,7 @@ public class VarianceSqlAggregatorTest extends BaseCalciteQueryTest
.context(BaseCalciteQueryTest.QUERY_CONTEXT_DEFAULT)
.build()
),
ResultMatchMode.EQUALS_EPS,
ImmutableList.of(
NullHandling.replaceWithDefault()
? new Object[]{3.61497656362466, 3.960008417499471, 3.960008417499471, 15.681666666666667}
@ -541,6 +547,7 @@ public class VarianceSqlAggregatorTest extends BaseCalciteQueryTest
.context(BaseCalciteQueryTest.QUERY_CONTEXT_DEFAULT)
.build()
),
ResultMatchMode.EQUALS_EPS,
ImmutableList.of(
NullHandling.replaceWithDefault()
? new Object[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}
@ -621,6 +628,7 @@ public class VarianceSqlAggregatorTest extends BaseCalciteQueryTest
.setContext(QUERY_CONTEXT_DEFAULT)
.build()
),
ResultMatchMode.EQUALS_EPS,
ImmutableList.of(
NullHandling.replaceWithDefault()
? new Object[]{"a", 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}
@ -674,27 +682,8 @@ public class VarianceSqlAggregatorTest extends BaseCalciteQueryTest
.context(BaseCalciteQueryTest.QUERY_CONTEXT_DEFAULT)
.build()
),
ResultMatchMode.EQUALS_EPS,
expectedResults
);
}
@Override
public void assertResultsEquals(String sql, List<Object[]> expectedResults, List<Object[]> results)
{
Assert.assertEquals(expectedResults.size(), results.size());
for (int i = 0; i < expectedResults.size(); i++) {
Object[] expectedResult = expectedResults.get(i);
Object[] result = results.get(i);
Assert.assertEquals(expectedResult.length, result.length);
for (int j = 0; j < expectedResult.length; j++) {
if (expectedResult[j] instanceof Float) {
Assert.assertEquals((Float) expectedResult[j], (Float) result[j], 1e-5);
} else if (expectedResult[j] instanceof Double) {
Assert.assertEquals((Double) expectedResult[j], (Double) result[j], 1e-5);
} else {
Assert.assertEquals(expectedResult[j], result[j]);
}
}
}
}
}

View File

@ -22,6 +22,7 @@ package org.apache.druid.common.config;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Strings;
import com.google.inject.Inject;
import org.apache.druid.segment.column.ValueType;
import org.apache.druid.segment.data.Indexed;
import javax.annotation.Nullable;
@ -161,6 +162,28 @@ public class NullHandling
}
}
/**
* Returns the default value for the given {@link ValueType}.
*
* May be null or non-null based on the current SQL-compatible null handling mode.
*/
@Nullable
@SuppressWarnings("unchecked")
public static Object defaultValueForType(ValueType type)
{
if (type == ValueType.FLOAT) {
return defaultFloatValue();
} else if (type == ValueType.DOUBLE) {
return defaultDoubleValue();
} else if (type == ValueType.LONG) {
return defaultLongValue();
} else if (type == ValueType.STRING) {
return defaultStringValue();
} else {
return null;
}
}
public static boolean isNullOrEquivalent(@Nullable String value)
{
return replaceWithDefault() ? Strings.isNullOrEmpty(value) : value == null;

View File

@ -20,6 +20,7 @@
package org.apache.druid.common.config;
import org.apache.druid.java.util.common.StringUtils;
import org.apache.druid.segment.column.ValueType;
import org.apache.druid.segment.data.ListIndexed;
import org.apache.druid.testing.InitializedNullHandlingTest;
import org.junit.Assert;
@ -27,6 +28,8 @@ import org.junit.Test;
import java.util.Collections;
import static org.apache.druid.common.config.NullHandling.defaultValueForClass;
import static org.apache.druid.common.config.NullHandling.defaultValueForType;
import static org.apache.druid.common.config.NullHandling.replaceWithDefault;
import static org.junit.Assert.assertEquals;
@ -89,6 +92,17 @@ public final class NullHandlingTest extends InitializedNullHandlingTest
Assert.assertNull(NullHandling.defaultValueForClass(Object.class));
}
@Test
public void test_defaultValueForType()
{
assertEquals(defaultValueForClass(Float.class), defaultValueForType(ValueType.FLOAT));
assertEquals(defaultValueForClass(Double.class), defaultValueForType(ValueType.DOUBLE));
assertEquals(defaultValueForClass(Long.class), defaultValueForType(ValueType.LONG));
assertEquals(defaultValueForClass(String.class), defaultValueForType(ValueType.STRING));
assertEquals(defaultValueForClass(Object.class), defaultValueForType(ValueType.COMPLEX));
assertEquals(defaultValueForClass(Object.class), defaultValueForType(ValueType.ARRAY));
}
@Test
public void test_ignoreNullsStrings()
{

View File

@ -77,6 +77,7 @@ import org.apache.druid.query.topn.TopNQueryConfig;
import org.apache.druid.segment.column.ColumnHolder;
import org.apache.druid.segment.column.ColumnType;
import org.apache.druid.segment.column.RowSignature;
import org.apache.druid.segment.column.ValueType;
import org.apache.druid.segment.join.JoinType;
import org.apache.druid.segment.join.JoinableFactoryWrapper;
import org.apache.druid.segment.virtual.ExpressionVirtualColumn;
@ -86,6 +87,7 @@ import org.apache.druid.server.security.AuthenticationResult;
import org.apache.druid.server.security.ForbiddenException;
import org.apache.druid.server.security.ResourceAction;
import org.apache.druid.sql.SqlStatementFactory;
import org.apache.druid.sql.calcite.QueryTestRunner.QueryResults;
import org.apache.druid.sql.calcite.expression.DruidExpression;
import org.apache.druid.sql.calcite.planner.Calcites;
import org.apache.druid.sql.calcite.planner.PlannerConfig;
@ -120,19 +122,22 @@ import org.junit.rules.ExpectedException;
import org.junit.rules.TemporaryFolder;
import javax.annotation.Nullable;
import java.io.IOException;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Optional;
import java.util.Properties;
import java.util.Set;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import static org.junit.Assert.assertEquals;
/**
* A base class for SQL query testing. It sets up query execution environment, provides useful helper methods,
* and populates data using {@link CalciteTests#createMockWalker}.
@ -140,6 +145,7 @@ import java.util.stream.Collectors;
public class BaseCalciteQueryTest extends CalciteTestBase
implements QueryComponentSupplier, PlannerComponentSupplier
{
public static final double ASSERTION_EPSILON = 1e-5;
public static String NULL_STRING;
public static Float NULL_FLOAT;
public static Long NULL_LONG;
@ -839,6 +845,20 @@ public class BaseCalciteQueryTest extends CalciteTestBase
.run();
}
public void testQuery(
final String sql,
final List<Query<?>> expectedQueries,
final ResultMatchMode resultsMatchMode,
final List<Object[]> expectedResults
)
{
testBuilder()
.sql(sql)
.expectedQueries(expectedQueries)
.expectedResults(resultsMatchMode, expectedResults)
.run();
}
public void testQuery(
final String sql,
final List<Query<?>> expectedQueries,
@ -1033,11 +1053,13 @@ public class BaseCalciteQueryTest extends CalciteTestBase
@Override
public ResultsVerifier defaultResultsVerifier(
List<Object[]> expectedResults,
ResultMatchMode expectedResultMatchMode,
RowSignature expectedResultSignature
)
{
return BaseCalciteQueryTest.this.defaultResultsVerifier(
expectedResults,
expectedResultMatchMode,
expectedResultSignature
);
}
@ -1055,6 +1077,114 @@ public class BaseCalciteQueryTest extends CalciteTestBase
}
}
public enum ResultMatchMode
{
EQUALS {
@Override
void validate(int row, int column, ValueType type, Object expectedCell, Object resultCell)
{
assertEquals(
mismatchMessage(row, column),
expectedCell,
resultCell);
}
},
RELAX_NULLS {
@Override
void validate(int row, int column, ValueType type, Object expectedCell, Object resultCell)
{
if (expectedCell == null) {
if (resultCell == null) {
return;
}
expectedCell = NullHandling.defaultValueForType(type);
}
EQUALS.validate(row, column, type, expectedCell, resultCell);
}
},
EQUALS_EPS {
@Override
void validate(int row, int column, ValueType type, Object expectedCell, Object resultCell)
{
if (expectedCell instanceof Float) {
assertEquals(
mismatchMessage(row, column),
(Float) expectedCell,
(Float) resultCell,
ASSERTION_EPSILON);
} else if (expectedCell instanceof Double) {
assertEquals(
mismatchMessage(row, column),
(Double) expectedCell,
(Double) resultCell,
ASSERTION_EPSILON);
} else {
EQUALS.validate(row, column, type, expectedCell, resultCell);
}
}
};
abstract void validate(int row, int column, ValueType type, Object expectedCell, Object resultCell);
private static String mismatchMessage(int row, int column)
{
return StringUtils.format("column content mismatch at %d,%d", row, column);
}
}
/**
* Validates the results with slight loosening in case {@link NullHandling} is not sql compatible.
*
* In case {@link NullHandling#replaceWithDefault()} is true, if the expected result is <code>null</code> it accepts
* both <code>null</code> and the default value for that column as actual result.
*/
public void assertResultsValid(final ResultMatchMode matchMode, final List<Object[]> expected, final QueryResults queryResults)
{
final List<Object[]> results = queryResults.results;
Assert.assertEquals("Result count mismatch", expected.size(), results.size());
final List<ValueType> types = new ArrayList<>();
final boolean isMSQ = isMSQRowType(queryResults.signature);
if (!isMSQ) {
for (int i = 0; i < queryResults.signature.getColumnNames().size(); i++) {
Optional<ColumnType> columnType = queryResults.signature.getColumnType(i);
if (columnType.isPresent()) {
types.add(columnType.get().getType());
} else {
types.add(null);
}
}
}
final int numRows = results.size();
for (int row = 0; row < numRows; row++) {
final Object[] expectedRow = expected.get(row);
final Object[] resultRow = results.get(row);
assertEquals("column count mismatch; at row#" + row, expectedRow.length, resultRow.length);
for (int i = 0; i < resultRow.length; i++) {
final Object resultCell = resultRow[i];
final Object expectedCell = expectedRow[i];
matchMode.validate(
row,
i,
isMSQ ? null : types.get(i),
expectedCell,
resultCell);
}
}
}
private boolean isMSQRowType(RowSignature signature)
{
List<String> colNames = signature.getColumnNames();
return colNames.size() == 1 && "TASK".equals(colNames.get(0));
}
public void assertResultsEquals(String sql, List<Object[]> expectedResults, List<Object[]> results)
{
int minSize = Math.min(results.size(), expectedResults.size());
@ -1331,15 +1461,16 @@ public class BaseCalciteQueryTest extends CalciteTestBase
// do nothing
}
void verify(String sql, List<Object[]> results);
void verify(String sql, QueryResults queryResults);
}
private ResultsVerifier defaultResultsVerifier(
final List<Object[]> expectedResults,
ResultMatchMode expectedResultMatchMode,
final RowSignature expectedSignature
)
{
return new DefaultResultsVerifier(expectedResults, expectedSignature);
return new DefaultResultsVerifier(expectedResults, expectedResultMatchMode, expectedSignature);
}
public class DefaultResultsVerifier implements ResultsVerifier
@ -1347,11 +1478,18 @@ public class BaseCalciteQueryTest extends CalciteTestBase
protected final List<Object[]> expectedResults;
@Nullable
protected final RowSignature expectedResultRowSignature;
protected final ResultMatchMode expectedResultMatchMode;
public DefaultResultsVerifier(List<Object[]> expectedResults, ResultMatchMode expectedResultMatchMode, RowSignature expectedSignature)
{
this.expectedResults = expectedResults;
this.expectedResultMatchMode = expectedResultMatchMode;
this.expectedResultRowSignature = expectedSignature;
}
public DefaultResultsVerifier(List<Object[]> expectedResults, RowSignature expectedSignature)
{
this.expectedResults = expectedResults;
this.expectedResultRowSignature = expectedSignature;
this(expectedResults, ResultMatchMode.EQUALS, expectedSignature);
}
@Override
@ -1363,17 +1501,18 @@ public class BaseCalciteQueryTest extends CalciteTestBase
}
@Override
public void verify(String sql, List<Object[]> results)
public void verify(String sql, QueryResults queryResults)
{
try {
Assert.assertEquals(StringUtils.format("result count: %s", sql), expectedResults.size(), results.size());
assertResultsEquals(sql, expectedResults, results);
assertResultsValid(expectedResultMatchMode, expectedResults, queryResults);
}
catch (AssertionError e) {
displayResults("Actual", results);
log.info("sql: %s", sql);
log.info(resultsToString("Actual", queryResults.results));
throw e;
}
}
}
/**
@ -1382,58 +1521,84 @@ public class BaseCalciteQueryTest extends CalciteTestBase
* expected results: let the test fail with empty results. The actual results
* are printed to the console. Copy them into the test.
*/
public static void displayResults(String name, List<Object[]> results)
public static String resultsToString(String name, List<Object[]> results)
{
PrintStream out = System.out;
out.printf(Locale.ENGLISH, "-- %s results --", name);
for (int rowIndex = 0; rowIndex < results.size(); rowIndex++) {
printArray(results.get(rowIndex), out);
if (rowIndex < results.size() - 1) {
out.print(",");
return new ResultsPrinter(name, results).getResult();
}
static class ResultsPrinter
{
private StringBuilder sb;
private ResultsPrinter(String name, List<Object[]> results)
{
sb = new StringBuilder();
sb.append("-- ");
sb.append(name);
sb.append(" results --\n");
for (int rowIndex = 0; rowIndex < results.size(); rowIndex++) {
printArray(results.get(rowIndex));
if (rowIndex < results.size() - 1) {
outprint(",");
}
sb.append('\n');
}
out.println();
sb.append("----");
}
out.println("----");
}
private static void printArray(final Object[] array, final PrintStream out)
{
printArrayImpl(array, out, "new Object[]{", "}");
}
private static void printList(final List<?> list, final PrintStream out)
{
printArrayImpl(list.toArray(new Object[0]), out, "ImmutableList.of(", ")");
}
private static void printArrayImpl(final Object[] array, final PrintStream out, final String pre, final String post)
{
out.print(pre);
for (int colIndex = 0; colIndex < array.length; colIndex++) {
Object col = array[colIndex];
if (colIndex > 0) {
out.print(", ");
}
if (col == null) {
out.print("null");
} else if (col instanceof String) {
out.print("\"");
out.print(StringEscapeUtils.escapeJava((String) col));
out.print("\"");
} else if (col instanceof Long) {
out.print(col);
out.print("L");
} else if (col instanceof Double) {
out.print(col);
out.print("D");
} else if (col instanceof Object[]) {
printArray(array, out);
} else if (col instanceof List) {
printList((List<?>) col, out);
} else {
out.print(col);
}
private String getResult()
{
return sb.toString();
}
private void printArray(final Object[] array)
{
printArrayImpl(array, "new Object[]{", "}");
}
private void printList(final List<?> list)
{
printArrayImpl(list.toArray(new Object[0]), "ImmutableList.of(", ")");
}
private void printArrayImpl(final Object[] array, final String pre, final String post)
{
sb.append(pre);
for (int colIndex = 0; colIndex < array.length; colIndex++) {
Object col = array[colIndex];
if (colIndex > 0) {
sb.append(", ");
}
if (col == null) {
sb.append("null");
} else if (col instanceof String) {
outprint("\"");
outprint(StringEscapeUtils.escapeJava((String) col));
outprint("\"");
} else if (col instanceof Long) {
outprint(col);
outprint("L");
} else if (col instanceof Double) {
outprint(col);
outprint("D");
} else if (col instanceof Float) {
outprint(col);
outprint("F");
} else if (col instanceof Object[]) {
printArray(array);
} else if (col instanceof List) {
printList((List<?>) col);
} else {
outprint(col);
}
}
outprint(post);
}
private void outprint(Object post)
{
sb.append(post);
}
out.print(post);
}
}

View File

@ -2667,7 +2667,7 @@ public class CalciteArraysQueryTest extends BaseCalciteQueryTest
.context(QUERY_CONTEXT_NO_STRINGIFY_ARRAY)
.build()
),
(sql, results) -> {
(sql, queryResults) -> {
// ordering is not stable in array_agg and array_concat_agg
List<Object[]> expected = ImmutableList.of(
useDefault ?
@ -2704,7 +2704,7 @@ public class CalciteArraysQueryTest extends BaseCalciteQueryTest
)
}
);
assertResultsDeepEquals(sql, expected, results);
assertResultsDeepEquals(sql, expected, queryResults.results);
}
);
}

View File

@ -2292,8 +2292,9 @@ public class CalciteNestedDataQueryTest extends BaseCalciteQueryTest
)
)
.expectedResults(
ResultMatchMode.RELAX_NULLS,
ImmutableList.of(
new Object[]{NullHandling.defaultDoubleValue(), 12L},
new Object[]{null, 12L},
new Object[]{5.5, 2L}
)
)

View File

@ -20,7 +20,6 @@
package org.apache.druid.sql.calcite;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import com.google.common.collect.ImmutableMap;
@ -35,6 +34,8 @@ import org.apache.druid.query.operator.WindowOperatorQuery;
import org.apache.druid.segment.column.ColumnType;
import org.apache.druid.segment.column.RowSignature;
import org.apache.druid.sql.calcite.CalciteWindowQueryTest.WindowQueryTestInputClass.TestType;
import org.apache.druid.sql.calcite.QueryTestRunner.QueryResults;
import org.apache.druid.sql.calcite.QueryVerification.QueryResultsVerifier;
import org.apache.druid.sql.calcite.planner.PlannerContext;
import org.hamcrest.Matchers;
import org.junit.Assert;
@ -43,18 +44,16 @@ import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.Objects;
import java.util.function.Function;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.junit.Assume.assumeThat;
import static org.junit.Assume.assumeTrue;
/**
* These tests are file-based, look in resources -> calcite/tests/window for the set of test specifications.
@ -79,9 +78,7 @@ public class CalciteWindowQueryTest extends BaseCalciteQueryTest
final URL windowFolderUrl = ClassLoader.getSystemResource("calcite/tests/window");
File windowFolder = new File(windowFolderUrl.toURI());
final File[] listedFiles = windowFolder.listFiles(
pathname -> pathname.getName().toLowerCase(Locale.ROOT).endsWith(".sqltest")
);
final File[] listedFiles = windowFolder.listFiles(pathname -> pathname.getName().toLowerCase(Locale.ROOT).endsWith(".sqltest"));
return Arrays
.stream(Objects.requireNonNull(listedFiles))
@ -91,119 +88,123 @@ public class CalciteWindowQueryTest extends BaseCalciteQueryTest
private final String filename;
public CalciteWindowQueryTest(
String filename
)
public CalciteWindowQueryTest(String filename)
{
this.filename = filename;
}
@Test
@SuppressWarnings("unchecked")
public void windowQueryTest() throws IOException
class TestCase implements QueryResultsVerifier
{
assumeTrue("These tests are only run in sqlCompatible mode!", NullHandling.sqlCompatible());
final Function<String, String> stringManipulator;
if (NullHandling.sqlCompatible()) {
stringManipulator = s -> "".equals(s) ? null : s;
} else {
stringManipulator = Function.identity();
private WindowQueryTestInputClass input;
private ObjectMapper queryJackson;
public TestCase(String filename) throws Exception
{
final URL systemResource = ClassLoader.getSystemResource("calcite/tests/window/" + filename);
final Object objectFromYaml = YAML_JACKSON.readValue(systemResource, Object.class);
queryJackson = queryFramework().queryJsonMapper();
input = queryJackson.convertValue(objectFromYaml, WindowQueryTestInputClass.class);
}
final URL systemResource = ClassLoader.getSystemResource("calcite/tests/window/" + filename);
public TestType getType()
{
return input.type;
}
final Object objectFromYaml = YAML_JACKSON.readValue(systemResource, Object.class);
public String getSql()
{
return input.sql;
}
final ObjectMapper queryJackson = queryFramework().queryJsonMapper();
final WindowQueryTestInputClass input = queryJackson.convertValue(objectFromYaml, WindowQueryTestInputClass.class);
Function<Object, String> jacksonToString = value -> {
try {
return queryJackson.writeValueAsString(value);
@Override
public void verifyResults(QueryResults results) throws Exception
{
if (results.exception != null) {
throw new RE(results.exception, "Failed to execute because of exception.");
}
catch (JsonProcessingException e) {
throw new RE(e);
Assert.assertEquals(1, results.recordedQueries.size());
final WindowOperatorQuery query = getWindowOperatorQuery(results.recordedQueries);
for (int i = 0; i < input.expectedOperators.size(); ++i) {
final OperatorFactory expectedOperator = input.expectedOperators.get(i);
final OperatorFactory actualOperator = query.getOperators().get(i);
if (!expectedOperator.validateEquivalent(actualOperator)) {
assertEquals("Operator Mismatch, index[" + i + "]",
queryJackson.writeValueAsString(expectedOperator),
queryJackson.writeValueAsString(actualOperator));
fail("validateEquivalent failed; but textual comparision of operators didn't reported the mismatch!");
}
}
final RowSignature outputSignature = query.getRowSignature();
ColumnType[] types = new ColumnType[outputSignature.size()];
for (int i = 0; i < outputSignature.size(); ++i) {
types[i] = outputSignature.getColumnType(i).get();
Assert.assertEquals(types[i], results.signature.getColumnType(i).get());
}
};
assumeThat(input.type, Matchers.not(TestType.failingTest));
maybeDumpActualResults(results.results);
for (Object[] result : input.expectedResults) {
for (int i = 0; i < result.length; i++) {
// Jackson deserializes numbers as the minimum size required to
// store the value. This means that
// Longs can become Integer objects and then they fail equality
// checks. We read the expected
// results using Jackson, so, we coerce the expected results to the
// type expected.
if (result[i] != null) {
if (result[i] instanceof Number) {
switch (types[i].getType()) {
case LONG:
result[i] = ((Number) result[i]).longValue();
break;
case DOUBLE:
result[i] = ((Number) result[i]).doubleValue();
break;
case FLOAT:
result[i] = ((Number) result[i]).floatValue();
break;
default:
throw new ISE("result[%s] was type[%s]!? Expected it to be numerical", i, types[i].getType());
}
}
}
}
}
assertResultsValid(ResultMatchMode.RELAX_NULLS, input.expectedResults, results);
}
if (input.type == TestType.operatorValidation) {
private void maybeDumpActualResults(List<Object[]> results) throws Exception
{
if (DUMP_ACTUAL_RESULTS) {
StringBuilder sb = new StringBuilder();
for (Object[] row : results) {
sb.append(" - ");
sb.append(queryJackson.writeValueAsString(row));
sb.append("\n");
}
log.info("Actual results:\n%s", sb.toString());
}
}
}
@Test
@SuppressWarnings("unchecked")
public void windowQueryTest() throws Exception
{
TestCase testCase = new TestCase(filename);
assumeThat(testCase.getType(), Matchers.not(TestType.failingTest));
if (testCase.getType() == TestType.operatorValidation) {
testBuilder()
.skipVectorize(true)
.sql(input.sql)
.sql(testCase.getSql())
.queryContext(ImmutableMap.of(PlannerContext.CTX_ENABLE_WINDOW_FNS, true,
QueryContexts.ENABLE_DEBUG, true))
.addCustomVerification(QueryVerification.ofResults(results -> {
if (results.exception != null) {
throw new RE(results.exception, "Failed to execute because of exception.");
}
Assert.assertEquals(1, results.recordedQueries.size());
// 2 tests are failing at this moment on this check
// They are wikipediaFramedAggregations.sqlTest and wikipediaAggregationsMultipleOrdering.sqlTest
// Calcite 1.35 plans them as an external scan over a windowOperator
// with an additional COUNT(*) to replace intervals with no data
// and then adding a virtual column to filter it out
// For example, ExpressionVirtualColumn{name='v0', expression='case_searched(("w0" > 0),"w1",null
// and aggregations=[CountAggregatorFactory{name='w0'}, LongSumAggregatorFactory{fieldName='a0', expression='null', name='w1'}]}}]}
// These 2 tests are marked as failingTests to unblock testing at this moment
final WindowOperatorQuery query = getWindowOperatorQuery(results.recordedQueries);
for (int i = 0; i < input.expectedOperators.size(); ++i) {
final OperatorFactory expectedOperator = input.expectedOperators.get(i);
final OperatorFactory actualOperator = query.getOperators().get(i);
if (!expectedOperator.validateEquivalent(actualOperator)) {
// This assertion always fails because the validate equivalent failed, but we do it anyway
// so that we get values in the output of the failed test to make it easier to
// debug what happened. Note, we use the Jackson representation when showing the diff. There is
// a chance that this representation is exactly equivalent, but the validation call is still failing
// this is probably indicative of a bug where something that needs to be serialized by Jackson
// currently is not. Check your getters.
// prepend different values so that we are guaranteed that it is always different
String expected = "e " + jacksonToString.apply(expectedOperator);
String actual = "a " + jacksonToString.apply(actualOperator);
Assert.assertEquals("Operator Mismatch, index[" + i + "]", expected, actual);
}
}
final RowSignature outputSignature = query.getRowSignature();
ColumnType[] types = new ColumnType[outputSignature.size()];
for (int i = 0; i < outputSignature.size(); ++i) {
types[i] = outputSignature.getColumnType(i).get();
Assert.assertEquals(types[i], results.signature.getColumnType(i).get());
}
maybeDumpActualResults(jacksonToString, results.results);
for (Object[] result : input.expectedResults) {
for (int i = 0; i < result.length; i++) {
// Jackson deserializes numbers as the minimum size required to store the value. This means that
// Longs can become Integer objects and then they fail equality checks. We read the expected
// results using Jackson, so, we coerce the expected results to the type expected.
if (result[i] != null) {
if (result[i] instanceof Number) {
switch (types[i].getType()) {
case LONG:
result[i] = ((Number) result[i]).longValue();
break;
case DOUBLE:
result[i] = ((Number) result[i]).doubleValue();
break;
case FLOAT:
result[i] = ((Number) result[i]).floatValue();
break;
default:
throw new ISE("result[%s] was type[%s]!? Expected it to be numerical", i, types[i].getType());
}
} else if (result[i] instanceof String) {
result[i] = stringManipulator.apply((String) result[i]);
}
}
}
}
assertResultsEquals(filename, input.expectedResults, results.results);
}))
.addCustomVerification(QueryVerification.ofResults(testCase))
.run();
}
}
@ -216,16 +217,6 @@ public class CalciteWindowQueryTest extends BaseCalciteQueryTest
return (WindowOperatorQuery) query;
}
private void maybeDumpActualResults(
Function<Object, String> toStrFn, List<Object[]> results
)
{
if (DUMP_ACTUAL_RESULTS) {
for (Object[] result : results) {
System.out.println(" - " + toStrFn.apply(result));
}
}
}
public static class WindowQueryTestInputClass
{

View File

@ -51,6 +51,7 @@ import org.apache.druid.segment.join.JoinableFactoryWrapper;
import org.apache.druid.segment.writeout.OnHeapMemorySegmentWriteOutMediumFactory;
import org.apache.druid.sql.calcite.NotYetSupported.Modes;
import org.apache.druid.sql.calcite.NotYetSupported.NotYetSupportedProcessor;
import org.apache.druid.sql.calcite.QueryTestRunner.QueryResults;
import org.apache.druid.sql.calcite.planner.PlannerContext;
import org.apache.druid.sql.calcite.util.SpecificSegmentsQuerySegmentWalker;
import org.apache.druid.timeline.DataSegment;
@ -356,8 +357,9 @@ public class DrillWindowQueryTest extends BaseCalciteQueryTest
}
@Override
public void verify(String sql, List<Object[]> results)
public void verify(String sql, QueryResults queryResults)
{
List<Object[]> results = queryResults.results;
List<Object[]> expectedResults = parseResults(currentRowSignature, expectedResultsText);
try {
Assert.assertEquals(StringUtils.format("result count: %s", sql), expectedResultsText.size(), results.size());
@ -368,9 +370,9 @@ public class DrillWindowQueryTest extends BaseCalciteQueryTest
assertResultsEquals(sql, expectedResults, results);
}
catch (AssertionError e) {
System.out.println("query: " + sql);
displayResults("Expected", expectedResults);
displayResults("Actual", results);
log.info("query: %s", sql);
log.info(resultsToString("Expected", expectedResults));
log.info(resultsToString("Actual", results));
throw e;
}
}

View File

@ -27,6 +27,7 @@ import org.apache.druid.server.security.AuthConfig;
import org.apache.druid.server.security.AuthenticationResult;
import org.apache.druid.server.security.ResourceAction;
import org.apache.druid.sql.SqlStatementFactory;
import org.apache.druid.sql.calcite.BaseCalciteQueryTest.ResultMatchMode;
import org.apache.druid.sql.calcite.BaseCalciteQueryTest.ResultsVerifier;
import org.apache.druid.sql.calcite.QueryTestRunner.QueryResults;
import org.apache.druid.sql.calcite.planner.PlannerConfig;
@ -77,7 +78,7 @@ public class QueryTestBuilder
ObjectMapper jsonMapper();
PlannerFixture plannerFixture(PlannerConfig plannerConfig, AuthConfig authConfig);
ResultsVerifier defaultResultsVerifier(List<Object[]> expectedResults, RowSignature expectedResultSignature);
ResultsVerifier defaultResultsVerifier(List<Object[]> expectedResults, ResultMatchMode expectedResultMatchMode, RowSignature expectedResultSignature);
boolean isRunningMSQ();
@ -107,6 +108,7 @@ public class QueryTestBuilder
protected PlannerFixture plannerFixture;
protected String expectedLogicalPlan;
protected SqlSchema expectedSqlSchema;
protected ResultMatchMode expectedResultMatchMode;
public QueryTestBuilder(final QueryTestConfig config)
{
@ -167,6 +169,15 @@ public class QueryTestBuilder
final List<Object[]> expectedResults
)
{
return expectedResults(ResultMatchMode.EQUALS, expectedResults);
}
public QueryTestBuilder expectedResults(
ResultMatchMode expecteMatchMode,
final List<Object[]> expectedResults
)
{
this.expectedResultMatchMode = expecteMatchMode;
this.expectedResults = expectedResults;
return this;
}

View File

@ -354,7 +354,7 @@ public class QueryTestRunner
if (verifyRowSignature) {
builder.expectedResultsVerifier.verifyRowSignature(queryResults.signature);
}
builder.expectedResultsVerifier.verify(builder.sql, results);
builder.expectedResultsVerifier.verify(builder.sql, queryResults);
}
}
@ -631,6 +631,7 @@ public class QueryTestRunner
if (builder.expectedResultsVerifier == null && builder.expectedResults != null) {
builder.expectedResultsVerifier = config.defaultResultsVerifier(
builder.expectedResults,
builder.expectedResultMatchMode,
builder.expectedResultSignature
);
}

View File

@ -28,7 +28,7 @@ public class QueryVerification
public interface QueryResultsVerifier
{
void verifyResults(QueryTestRunner.QueryResults results);
void verifyResults(QueryTestRunner.QueryResults results) throws Exception;
}
public static class QueryResultsVerifierFactory implements QueryTestRunner.QueryVerifyStepFactory
@ -47,7 +47,12 @@ public class QueryVerification
{
return () -> {
for (QueryTestRunner.QueryResults queryResults : execStep.results()) {
verifier.verifyResults(queryResults);
try {
verifier.verifyResults(queryResults);
}
catch (Exception e) {
throw new RuntimeException("Exception during verification!", e);
}
}
};
}

View File

@ -1,4 +1,4 @@
type: "operatorValidation"
type: "failingTest"
sql: |
SELECT

View File

@ -0,0 +1,26 @@
type: "operatorValidation"
sql: |
SELECT
m1,
SUM(m1) OVER () cc
FROM druid.foo
expectedOperators:
- type: "naivePartition"
partitionColumns: []
- type: "window"
processor:
type: "framedAgg"
frame: { peerType: "ROWS", lowUnbounded: true, lowOffset: 0, uppUnbounded: true, uppOffset: 0 }
aggregations:
- type: "doubleSum"
name: "w0"
fieldName: "m1"
expectedResults:
- [1.0,21.0]
- [2.0,21.0]
- [3.0,21.0]
- [4.0,21.0]
- [5.0,21.0]
- [6.0,21.0]

View File

@ -39,7 +39,7 @@ expectedResults:
- ["CL",1442016000000,161,-194,13]
- ["DE",1442016000000,167,231,14]
- ["KR",1442016000000,1024,1788,15]
- ["",1442016000000,29873,603401,16]
- [null,1442016000000,29873,603401,16]
- ["CL",1442019600000,-370,-154,1]
- ["HK",1442019600000,-113,2090,2]
- ["MY",1442019600000,-7,1018,3]
@ -76,7 +76,7 @@ expectedResults:
- ["JP",1442019600000,2002,4883,34]
- ["CA",1442019600000,2184,4315,35]
- ["RU",1442019600000,2214,2513,36]
- ["",1442019600000,173892,856027,37]
- [null,1442019600000,173892,856027,37]
- ["GT",1442023200000,-167,7,1]
- ["IN",1442023200000,-142,2319,2]
- ["CN",1442023200000,-13,239,3]
@ -109,7 +109,7 @@ expectedResults:
- ["HK",1442023200000,2414,2247,30]
- ["AR",1442023200000,2514,3156,31]
- ["US",1442023200000,2844,7422,32]
- ["",1442023200000,399636,1022699,33]
- [null,1442023200000,399636,1022699,33]
- ["ID",1442026800000,-416,-12,1]
- ["HK",1442026800000,-211,3384,2]
- ["KR",1442026800000,-179,3078,3]
@ -145,7 +145,7 @@ expectedResults:
- ["CA",1442026800000,2216,4446,33]
- ["SG",1442026800000,2758,2762,34]
- ["MX",1442026800000,3642,5441,35]
- ["",1442026800000,252626,1353656,36]
- [null,1442026800000,252626,1353656,36]
- ["AU",1442030400000,-377,402,1]
- ["BE",1442030400000,-103,-45,2]
- ["CA",1442030400000,-47,4685,3]
@ -177,7 +177,7 @@ expectedResults:
- ["US",1442030400000,2023,14745,29]
- ["CR",1442030400000,2497,3006,30]
- ["GB",1442030400000,2524,5265,31]
- ["",1442030400000,166672,1524388,32]
- [null,1442030400000,166672,1524388,32]
- ["ES",1442034000000,-52,167,1]
- ["VN",1442034000000,-29,14,2]
- ["GB",1442034000000,-12,5253,3]
@ -211,7 +211,7 @@ expectedResults:
- ["IN",1442034000000,1350,3845,31]
- ["UA",1442034000000,3468,3541,32]
- ["US",1442034000000,3648,15701,33]
- ["",1442034000000,330957,1893946,34]
- [null,1442034000000,330957,1893946,34]
- ["RU",1442037600000,-324,3554,1]
- ["CA",1442037600000,-132,2221,2]
- ["SA",1442037600000,-97,-72,3]
@ -247,7 +247,7 @@ expectedResults:
- ["JP",1442037600000,2181,7873,33]
- ["US",1442037600000,3675,12996,34]
- ["FR",1442037600000,4174,6140,35]
- ["",1442037600000,200605,1810312,36]
- [null,1442037600000,200605,1810312,36]
- ["MX",1442041200000,-294,1025,1]
- ["IR",1442041200000,-79,749,2]
- ["AO",1442041200000,-26,18,3]
@ -290,7 +290,7 @@ expectedResults:
- ["MY",1442041200000,935,2475,40]
- ["JP",1442041200000,1373,8819,41]
- ["US",1442041200000,1999,11018,42]
- ["",1442041200000,543450,1866002,43]
- [null,1442041200000,543450,1866002,43]
- ["ID",1442044800000,-388,-320,1]
- ["ES",1442044800000,-169,54,2]
- ["MY",1442044800000,-127,2483,3]
@ -331,7 +331,7 @@ expectedResults:
- ["JP",1442044800000,1569,10803,38]
- ["RU",1442044800000,2564,5719,39]
- ["IN",1442044800000,2677,5038,40]
- ["",1442044800000,316002,2486700,41]
- [null,1442044800000,316002,2486700,41]
- ["US",1442048400000,-466,5501,1]
- ["NO",1442048400000,-447,77,2]
- ["KR",1442048400000,-374,4138,3]
@ -377,7 +377,7 @@ expectedResults:
- ["TJ",1442048400000,1471,1471,43]
- ["JP",1442048400000,1981,10891,44]
- ["FR",1442048400000,3027,9077,45]
- ["",1442048400000,308316,2439701,46]
- [null,1442048400000,308316,2439701,46]
- ["AU",1442052000000,-643,279,1]
- ["GE",1442052000000,-108,-140,2]
- ["TH",1442052000000,-22,45,3]
@ -425,7 +425,7 @@ expectedResults:
- ["JP",1442052000000,2789,8625,45]
- ["AT",1442052000000,4793,4638,46]
- ["BG",1442052000000,18936,19191,47]
- ["",1442052000000,787370,2698393,48]
- [null,1442052000000,787370,2698393,48]
- ["BA",1442055600000,-202,-178,1]
- ["IR",1442055600000,-124,1520,2]
- ["LB",1442055600000,-67,-67,3]
@ -470,7 +470,7 @@ expectedResults:
- ["KR",1442055600000,3640,5396,42]
- ["IT",1442055600000,6240,12759,43]
- ["UA",1442055600000,14202,15665,44]
- ["",1442055600000,283958,2544408,45]
- [null,1442055600000,283958,2544408,45]
- ["TW",1442059200000,-157,342,1]
- ["JP",1442059200000,-85,6653,2]
- ["MA",1442059200000,-56,216,3]
@ -514,7 +514,7 @@ expectedResults:
- ["RU",1442059200000,3902,8857,41]
- ["FR",1442059200000,4650,16969,42]
- ["GB",1442059200000,16111,23886,43]
- ["",1442059200000,459297,2579990,44]
- [null,1442059200000,459297,2579990,44]
- ["CA",1442062800000,-367,1200,1]
- ["TW",1442062800000,-272,752,2]
- ["VG",1442062800000,-238,-238,3]
@ -558,7 +558,7 @@ expectedResults:
- ["PL",1442062800000,4171,5290,41]
- ["FR",1442062800000,5676,14416,42]
- ["GB",1442062800000,5743,23520,43]
- ["",1442062800000,389465,2630189,44]
- [null,1442062800000,389465,2630189,44]
- ["CL",1442066400000,-41,520,1]
- ["TH",1442066400000,-34,-89,2]
- ["AU",1442066400000,-21,-455,3]
@ -604,7 +604,7 @@ expectedResults:
- ["FR",1442066400000,2516,17301,43]
- ["KR",1442066400000,3299,8425,44]
- ["IT",1442066400000,4155,15542,45]
- ["",1442066400000,351584,2218213,46]
- [null,1442066400000,351584,2218213,46]
- ["IE",1442070000000,-100,2212,1]
- ["NL",1442070000000,-84,1197,2]
- ["CO",1442070000000,-45,41598,3]
@ -654,7 +654,7 @@ expectedResults:
- ["US",1442070000000,3505,7603,47]
- ["RU",1442070000000,4706,13603,48]
- ["IN",1442070000000,12091,21331,49]
- ["",1442070000000,358515,2326738,50]
- [null,1442070000000,358515,2326738,50]
- ["GR",1442073600000,-314,-63,1]
- ["PH",1442073600000,-227,1892,2]
- ["IR",1442073600000,-193,1390,3]
@ -698,7 +698,7 @@ expectedResults:
- ["HK",1442073600000,5545,5896,41]
- ["DE",1442073600000,6075,12922,42]
- ["CO",1442073600000,39860,41182,43]
- ["",1442073600000,375394,2320518,44]
- [null,1442073600000,375394,2320518,44]
- ["AR",1442077200000,-591,-189,1]
- ["FR",1442077200000,-444,13268,2]
- ["EC",1442077200000,-366,232,3]
@ -749,7 +749,7 @@ expectedResults:
- ["IN",1442077200000,5699,19263,48]
- ["AE",1442077200000,6323,6397,49]
- ["MD",1442077200000,6916,6916,50]
- ["",1442077200000,392483,2303622,51]
- [null,1442077200000,392483,2303622,51]
- ["MX",1442080800000,-376,4951,1]
- ["BR",1442080800000,-267,5316,2]
- ["PT",1442080800000,-79,3750,3]
@ -798,7 +798,7 @@ expectedResults:
- ["US",1442080800000,4001,14988,46]
- ["IT",1442080800000,5544,16805,47]
- ["NL",1442080800000,8947,10355,48]
- ["",1442080800000,453077,2255910,49]
- [null,1442080800000,453077,2255910,49]
- ["DE",1442084400000,-125,13816,1]
- ["DK",1442084400000,-97,510,2]
- ["SK",1442084400000,-92,380,3]
@ -850,7 +850,7 @@ expectedResults:
- ["IT",1442084400000,2660,17075,49]
- ["RU",1442084400000,6461,15941,50]
- ["FR",1442084400000,6643,12891,51]
- ["",1442084400000,372569,2411822,52]
- [null,1442084400000,372569,2411822,52]
- ["ES",1442088000000,-130,4807,1]
- ["HU",1442088000000,-71,628,2]
- ["UA",1442088000000,-21,-616,3]
@ -885,7 +885,7 @@ expectedResults:
- ["IT",1442088000000,3746,17429,32]
- ["AT",1442088000000,7050,7409,33]
- ["CO",1442088000000,17150,18474,34]
- ["",1442088000000,303872,2410929,35]
- [null,1442088000000,303872,2410929,35]
- ["UA",1442091600000,-388,-397,1]
- ["IE",1442091600000,-71,1051,2]
- ["RS",1442091600000,-15,887,3]
@ -926,7 +926,7 @@ expectedResults:
- ["TR",1442091600000,3048,5577,38]
- ["RU",1442091600000,3449,25694,39]
- ["DE",1442091600000,4355,6889,40]
- ["",1442091600000,514427,2294605,41]
- [null,1442091600000,514427,2294605,41]
- ["MX",1442095200000,-456,1846,1]
- ["CA",1442095200000,-361,2740,2]
- ["CL",1442095200000,-276,165,3]
@ -970,7 +970,7 @@ expectedResults:
- ["PL",1442095200000,1851,3103,41]
- ["ES",1442095200000,2506,3871,42]
- ["IT",1442095200000,2940,10262,43]
- ["",1442095200000,374501,1841528,44]
- [null,1442095200000,374501,1841528,44]
- ["BR",1442098800000,-645,329,1]
- ["TW",1442098800000,-60,-113,2]
- ["KR",1442098800000,-36,1629,3]
@ -1010,4 +1010,4 @@ expectedResults:
- ["PE",1442098800000,1861,1772,37]
- ["US",1442098800000,3575,8184,38]
- ["RU",1442098800000,12098,18578,39]
- ["",1442098800000,276159,1468959,40]
- [null,1442098800000,276159,1468959,40]

View File

@ -19,30 +19,30 @@ expectedOperators:
- { type: "longSum", name: "w0", fieldName: "a0" }
expectedResults:
- [ "",1442016000000,29873,603401 ]
- [ "",1442019600000,173892,856027 ]
- [ "",1442023200000,399636,1022699 ]
- [ "",1442026800000,252626,1353656 ]
- [ "",1442030400000,166672,1524388 ]
- [ "",1442034000000,330957,1893946 ]
- [ "",1442037600000,200605,1810312 ]
- [ "",1442041200000,543450,1866002 ]
- [ "",1442044800000,316002,2486700 ]
- [ "",1442048400000,308316,2439701 ]
- [ "",1442052000000,787370,2698393 ]
- [ "",1442055600000,283958,2544408 ]
- [ "",1442059200000,459297,2579990 ]
- [ "",1442062800000,389465,2630189 ]
- [ "",1442066400000,351584,2218213 ]
- [ "",1442070000000,358515,2326738 ]
- [ "",1442073600000,375394,2320518 ]
- [ "",1442077200000,392483,2303622 ]
- [ "",1442080800000,453077,2255910 ]
- [ "",1442084400000,372569,2411822 ]
- [ "",1442088000000,303872,2410929 ]
- [ "",1442091600000,514427,2294605 ]
- [ "",1442095200000,374501,1841528 ]
- [ "",1442098800000,276159,1468959 ]
- [ null,1442016000000,29873,603401 ]
- [ null,1442019600000,173892,856027 ]
- [ null,1442023200000,399636,1022699 ]
- [ null,1442026800000,252626,1353656 ]
- [ null,1442030400000,166672,1524388 ]
- [ null,1442034000000,330957,1893946 ]
- [ null,1442037600000,200605,1810312 ]
- [ null,1442041200000,543450,1866002 ]
- [ null,1442044800000,316002,2486700 ]
- [ null,1442048400000,308316,2439701 ]
- [ null,1442052000000,787370,2698393 ]
- [ null,1442055600000,283958,2544408 ]
- [ null,1442059200000,459297,2579990 ]
- [ null,1442062800000,389465,2630189 ]
- [ null,1442066400000,351584,2218213 ]
- [ null,1442070000000,358515,2326738 ]
- [ null,1442073600000,375394,2320518 ]
- [ null,1442077200000,392483,2303622 ]
- [ null,1442080800000,453077,2255910 ]
- [ null,1442084400000,372569,2411822 ]
- [ null,1442088000000,303872,2410929 ]
- [ null,1442091600000,514427,2294605 ]
- [ null,1442095200000,374501,1841528 ]
- [ null,1442098800000,276159,1468959 ]
- [ "AE",1442030400000,118,150 ]
- [ "AE",1442044800000,-7,147 ]
- [ "AE",1442048400000,39,136 ]

View File

@ -20,251 +20,251 @@ expectedOperators:
offset: -1
expectedResults:
- [ 1442055495852,"1.121.160.49","Walker, Texas Ranger","" ]
- [ 1442056175946,"1.121.160.49","Walker, Texas Ranger","Walker, Texas Ranger" ]
- [ 1442062719426,"1.121.160.49","Richard Norton (actor)","Walker, Texas Ranger" ]
- [ 1442053449011,"1.123.133.249","Inside Out","" ]
- [ 1442030282870,"1.123.149.111","Christina Ricci","" ]
- [ 1442062306734,"1.129.96.160","Andrew Hastie (politician)","" ]
- [ 1442052408695,"1.129.96.219","Dorrigo Steam Railway and Museum","" ]
- [ 1442049229239,"1.129.96.242","Dorrigo Steam Railway and Museum","" ]
- [ 1442046541914,"1.152.96.170","Ayrton Senna","" ]
- [ 1442056892106,"101.128.232.140","清水浩","" ]
- [ 1442057005310,"101.128.232.140","清水浩","清水浩" ]
- [ 1442033283609,"101.140.3.146","水原茂","" ]
- [ 1442036282693,"101.162.15.184","The Biggest Loser (U.S. TV series)","" ]
- [ 1442036494525,"101.162.15.184","The Biggest Loser (U.S. TV series)","The Biggest Loser (U.S. TV series)" ]
- [ 1442053239190,"101.162.15.184","The Biggest Loser (season 3)","The Biggest Loser (U.S. TV series)" ]
- [ 1442094543511,"101.162.15.184","The Biggest Loser (season 3)","The Biggest Loser (season 3)" ]
- [ 1442054030928,"101.162.192.189","Second Keating Ministry","" ]
- [ 1442054439219,"101.162.192.189","Second Keating Ministry","Second Keating Ministry" ]
- [ 1442062617292,"101.180.202.153","2015 AFL season","" ]
- [ 1442042291553,"103.18.40.202","Wikipedia:Auskunft","" ]
- [ 1442030546957,"103.20.255.191","Same-sex marriage in New Zealand","" ]
- [ 1442028937717,"103.225.121.237","AKB48握手会傷害事件","" ]
- [ 1442025765045,"103.56.218.196","욱일기","" ]
- [ 1442018949298,"106.131.175.193","正岡大介","" ]
- [ 1442061568629,"106.132.207.6","白石涼子","" ]
- [ 1442074511372,"106.150.80.109","ノート:アズ熊谷","" ]
- [ 1442022640886,"106.161.56.138","山口敬之","" ]
- [ 1442061180690,"106.188.137.190","救急救命士養成所","" ]
- [ 1442061491224,"106.188.137.190","救急救命士","救急救命士養成所" ]
- [ 1442100695886,"106.188.187.22","Petronas Towers","" ]
- [ 1442033017165,"106.188.237.163","ダウンロード違法化","" ]
- [ 1442019638402,"110.1.177.43","ユーロビート","" ]
- [ 1442039765889,"110.1.177.43","虹の都へ","ユーロビート" ]
- [ 1442097432832,"110.20.158.121","Flavia Pennetta","" ]
- [ 1442097158335,"110.20.234.69","Yaoi","" ]
- [ 1442101346090,"110.20.234.69","Yaoi fandom","Yaoi" ]
- [ 1442022181729,"110.21.43.182","Planet Hollywood Resort & Casino","" ]
- [ 1442054156682,"110.22.186.92","Aris F.C. (Thessaloniki)","" ]
- [ 1442060921634,"110.32.28.203","Politics of Réunion","" ]
- [ 1442095172937,"110.67.252.181","Shinya","" ]
- [ 1442073188151,"111.216.35.85","うしおそうじ","" ]
- [ 1442070741096,"113.197.250.14","フィンテック","" ]
- [ 1442065282546,"113.36.127.77","福岡県立修猷館高等学校の人物一覧","" ]
- [ 1442020617093,"113.38.112.244","エフエム東京","" ]
- [ 1442043701284,"114.148.67.27","オウム真理教の修行","" ]
- [ 1442057752095,"114.149.159.81","鮎川誠","" ]
- [ 1442030463066,"114.149.98.37","2015年全米オープン (テニス)","" ]
- [ 1442036595334,"114.161.17.122","京都放送","" ]
- [ 1442085773238,"114.163.215.4","コンコルド墜落事故","" ]
- [ 1442019941523,"114.165.9.29","架空の乗り物一覧","" ]
- [ 1442073082802,"114.167.235.83","ランドール・パーク","" ]
- [ 1442036882364,"114.168.102.41","杉浦圭子","" ]
- [ 1442046282828,"114.186.112.218","オイルショック","" ]
- [ 1442030866019,"115.64.101.40","Snow leopard","" ]
- [ 1442030416128,"115.69.63.229","Ibrahim Sunday","" ]
- [ 1442046588882,"117.18.154.84","969運動","" ]
- [ 1442022015086,"117.55.68.51","セルゲーエフ","" ]
- [ 1442022520647,"117.55.68.51","セルゲーエワ","セルゲーエフ" ]
- [ 1442063719891,"117.74.50.110","ソード・ワールド2.0リプレイ from USA","" ]
- [ 1442039556838,"118.106.18.200","今夜もオトパラ!","" ]
- [ 1442049541582,"118.106.18.200","青森放送","今夜もオトパラ!" ]
- [ 1442047677181,"118.109.38.229","ケイゾク","" ]
- [ 1442049350391,"118.109.38.229","ケイゾク","ケイゾク" ]
- [ 1442063820782,"118.109.38.229","ケイゾク","ケイゾク" ]
- [ 1442080232899,"118.111.38.174","外傷初期診療ガイドライン日本版","" ]
- [ 1442033322693,"118.238.237.196","推理小説","" ]
- [ 1442090528892,"119.104.157.254","おかしな二人","" ]
- [ 1442075598708,"119.104.36.170","パスポート","" ]
- [ 1442038707947,"119.170.41.230","スーパーマン (1978年の映画)","" ]
- [ 1442031883720,"119.25.37.181","六甲人工島線","" ]
- [ 1442018890048,"119.26.148.34","青野武","" ]
- [ 1442046705300,"119.26.148.34","クッキングパパの登場人物","青野武" ]
- [ 1442058062503,"119.26.148.34","林先生が驚く初耳学!","クッキングパパの登場人物" ]
- [ 1442059524102,"119.26.148.34","エンジェル・ハート","林先生が驚く初耳学!" ]
- [ 1442065445099,"119.26.148.34","本田望結","エンジェル・ハート" ]
- [ 1442068465888,"119.63.112.86","DIABOLIK LOVERS","" ]
- [ 1442069164239,"119.63.112.86","GANGSTA.","DIABOLIK LOVERS" ]
- [ 1442091530861,"119.63.112.86","BS-TBS独占放送深夜アニメ枠","GANGSTA." ]
- [ 1442030131807,"119.72.245.161","The VISIONALUX","" ]
- [ 1442047214542,"120.147.6.7","African Union Mission to Somalia","" ]
- [ 1442032176994,"121.102.43.4","利用者‐会話:Yasuyuki Takeo","" ]
- [ 1442066932287,"121.117.180.156","Ulmendorf","" ]
- [ 1442023340480,"121.208.92.28","Moreton Bay","" ]
- [ 1442050348689,"121.211.56.55","Dominique Dunne","" ]
- [ 1442100154443,"121.211.82.121","List of Harry Potter characters","" ]
- [ 1442048444641,"121.223.129.191","List of dinosaur genera","" ]
- [ 1442027637932,"121.45.214.80","Total Drama Presents: The Ridonculous Race","" ]
- [ 1442054470231,"121.93.47.91","チキンハート","" ]
- [ 1442069124156,"121.93.97.147","機甲創世記モスピーダ","" ]
- [ 1442095062216,"122.108.156.100","United States presidential election, 1892","" ]
- [ 1442098671579,"122.108.156.100","United States presidential election, 1892","United States presidential election, 1892" ]
- [ 1442023533650,"122.25.10.78","星のカービィ! も〜れつプププアワー!","" ]
- [ 1442024788039,"122.25.10.78","陸上防衛隊まおちゃん","星のカービィ! も〜れつプププアワー!" ]
- [ 1442072416878,"122.25.10.78","黒鷺死体宅配便","陸上防衛隊まおちゃん" ]
- [ 1442074382146,"122.25.10.78","ロリコンフェニックス","黒鷺死体宅配便" ]
- [ 1442072607975,"123.100.63.20","User:MichelleFranklin/AustralianSkeptics","" ]
- [ 1442084541627,"123.217.1.75","JOIN ALIVE","" ]
- [ 1442056682107,"123.223.224.148","相馬康一","" ]
- [ 1442056818652,"123.223.224.148","杉崎亮","相馬康一" ]
- [ 1442057183557,"123.223.224.148","日高里菜","杉崎亮" ]
- [ 1442037245734,"124.148.87.34","List of Doctor Who audio plays by Big Finish","" ]
- [ 1442038279908,"124.148.87.34","List of Doctor Who audio plays by Big Finish","List of Doctor Who audio plays by Big Finish" ]
- [ 1442039505649,"124.148.87.34","List of Doctor Who audio plays by Big Finish","List of Doctor Who audio plays by Big Finish" ]
- [ 1442051202571,"124.148.87.34","List of Doctor Who audio plays by Big Finish","List of Doctor Who audio plays by Big Finish" ]
- [ 1442027954979,"124.169.165.146","Talk:Peter O'Toole","" ]
- [ 1442096498423,"124.169.17.234","Coca-Cola formula","" ]
- [ 1442046696410,"124.170.55.214","Northern Football League (Australia)","" ]
- [ 1442049310216,"124.171.44.159","Liberal Democratic Party (Australia)","" ]
- [ 1442035151510,"124.188.44.154","List of Doctor Who audio plays by Big Finish","" ]
- [ 1442092615464,"124.45.73.228","鹿児島県立加治木高等学校","" ]
- [ 1442023710710,"125.168.85.156","Beatrix Potter","" ]
- [ 1442050705594,"125.192.149.97","ドカチン","" ]
- [ 1442063450156,"125.198.182.94","交響曲第5番 (チャイコフスキー)","" ]
- [ 1442036586983,"125.2.29.54","バトルスピリッツ 烈火魂","" ]
- [ 1442020773422,"125.205.166.177","粉河町","" ]
- [ 1442070671364,"126.10.25.69","民王","" ]
- [ 1442065314043,"126.120.17.52","ガンズ・アンド・ローゼズ","" ]
- [ 1442057530890,"126.144.8.136","小柳友貴美","" ]
- [ 1442057729757,"126.144.8.136","張込み","小柳友貴美" ]
- [ 1442058237893,"126.144.8.136","篠原涼子","張込み" ]
- [ 1442058403152,"126.144.8.136","瀬戸朝香","篠原涼子" ]
- [ 1442058944024,"126.144.8.136","顔田顔彦","瀬戸朝香" ]
- [ 1442059192896,"126.144.8.136","山中聡","顔田顔彦" ]
- [ 1442064154338,"126.29.44.172","アンフェア the answer","" ]
- [ 1442046633404,"126.64.184.114","中山道","" ]
- [ 1442045829839,"130.54.130.227","静岡空港","" ]
- [ 1442056451492,"137.147.143.241","Royal Australian Air Force","" ]
- [ 1442020256428,"137.147.165.107","Michael Sharkey","" ]
- [ 1442045368765,"139.218.187.26","National Youth Competition (rugby league)","" ]
- [ 1442021132744,"14.201.22.221","2015 Roger Federer tennis season","" ]
- [ 1442078715198,"14.203.177.143","Captain (cricket)","" ]
- [ 1442063042912,"153.170.91.23","一色氏","" ]
- [ 1442040686108,"153.200.114.68","芋たこなんきん","" ]
- [ 1442042536291,"153.200.114.68","ごちそうさん (2013年のテレビドラマ)","芋たこなんきん" ]
- [ 1442042555091,"153.200.114.68","ごちそうさん (2013年のテレビドラマ)","ごちそうさん (2013年のテレビドラマ)" ]
- [ 1442024836364,"153.207.13.117","リーガ・エスパニョーラ","" ]
- [ 1442055615954,"153.230.62.16","刺客 聶隱娘","" ]
- [ 1442079228153,"161.202.72.168","Shaun King (activist)","" ]
- [ 1442080592078,"161.202.72.168","Talk:Shaun King (activist)","Shaun King (activist)" ]
- [ 1442082673917,"161.202.72.168","Talk:Shaun King (activist)","Talk:Shaun King (activist)" ]
- [ 1442054785180,"180.17.65.26","88式鉄帽","" ]
- [ 1442064037343,"180.27.228.108","虎ノ門事件","" ]
- [ 1442092840431,"180.54.251.210","鹿児島県立加治木高等学校","" ]
- [ 1442026399564,"182.168.99.4","ミャンマー","" ]
- [ 1442080053112,"182.173.142.88","ドクタースランプ","" ]
- [ 1442080079822,"182.173.142.88","ドクタースランプ","ドクタースランプ" ]
- [ 1442071861338,"188.23.31.111","Diskussion:Löwengrube (Serie)","" ]
- [ 1442041218594,"202.174.58.102","テッド (映画)","" ]
- [ 1442043359400,"202.174.58.102","立川流 (密教)","テッド (映画)" ]
- [ 1442050346906,"203.112.37.97","ABCフレッシュアップベースボール","" ]
- [ 1442037360618,"203.87.72.77","Hakoah Sydney City East FC","" ]
- [ 1442033433557,"210.128.82.94","列車種別","" ]
- [ 1442059451406,"210.132.145.235","キン肉マンスーパー・フェニックス","" ]
- [ 1442028766085,"210.145.159.111","小桜エツコ","" ]
- [ 1442047728381,"210.159.186.209","ハウス食品","" ]
- [ 1442073460368,"210.160.37.25","沖野晃司","" ]
- [ 1442073648703,"210.160.37.25","沖野晃司","沖野晃司" ]
- [ 1442025498133,"210.171.30.75","車塚 (伊丹市)","" ]
- [ 1442053077021,"210.194.52.87","小田急多摩線","" ]
- [ 1442079405551,"210.199.238.238","ズバリ!当てましょう","" ]
- [ 1442084605765,"210.199.238.238","インド","ズバリ!当てましょう" ]
- [ 1442048760081,"211.0.97.62","アフガニスタン紛争 (1978年-1989年)","" ]
- [ 1442058690158,"211.1.73.194","筑波山","" ]
- [ 1442066152552,"211.135.251.28","FNSスーパースペシャルテレビ夢列島","" ]
- [ 1442090789576,"212.95.7.43","Pamela (Vorname)","" ]
- [ 1442093822018,"212.95.7.57","Eşkıya Dünyaya Hükümdar Olmaz (dizi)","" ]
- [ 1442052594311,"213.102.112.181","Diskussion:Schlacht um die Krim","" ]
- [ 1442055194535,"213.102.112.181","Diskussion:Schlacht um die Krim","Diskussion:Schlacht um die Krim" ]
- [ 1442055264461,"213.102.112.181","Diskussion:Schlacht um die Krim","Diskussion:Schlacht um die Krim" ]
- [ 1442087241623,"213.240.105.56","16. Mai","" ]
- [ 1442073949064,"218.110.166.206","エゴグラム","" ]
- [ 1442048197658,"218.227.98.24","福岡空港","" ]
- [ 1442031289907,"218.45.13.57","サムライエッジ","" ]
- [ 1442043817524,"219.102.143.16","ヒルナンデス!","" ]
- [ 1442076175461,"219.106.24.95","中村れい子","" ]
- [ 1442076262194,"219.106.24.95","阿藤快","中村れい子" ]
- [ 1442076443347,"219.106.24.95","西岡善信","阿藤快" ]
- [ 1442067732777,"219.106.70.167","アンフェア the end","" ]
- [ 1442047016164,"219.110.114.95","永田久光","" ]
- [ 1442039078679,"219.110.28.111","こちら葛飾区亀有公園前派出所の登場人物","" ]
- [ 1442039059890,"219.112.132.106","野口茂樹","" ]
- [ 1442039204914,"219.112.132.106","野口茂樹","野口茂樹" ]
- [ 1442039593604,"219.112.132.106","井場友和","野口茂樹" ]
- [ 1442042116370,"219.112.132.106","高村祐","井場友和" ]
- [ 1442043631086,"219.112.132.106","岩本勉","高村祐" ]
- [ 1442033187371,"219.127.27.114","あんハピ♪","" ]
- [ 1442033425162,"219.127.27.114","林田理沙","あんハピ♪" ]
- [ 1442034666225,"219.127.27.114","八木沼純子","林田理沙" ]
- [ 1442026079559,"219.127.82.26","Wikipedia:サンドボックス","" ]
- [ 1442047519920,"219.161.34.177","小川虎之助","" ]
- [ 1442088730524,"219.171.105.167","2015 FIFA U-20ワールドカップ","" ]
- [ 1442090473730,"219.171.105.167","AFC U-19女子選手権2015","2015 FIFA U-20ワールドカップ" ]
- [ 1442098469728,"219.182.78.3","宮里久美","" ]
- [ 1442029124664,"219.198.137.251","逆転イッパツマン","" ]
- [ 1442048505685,"219.51.50.31","突撃!ナマイキTV","" ]
- [ 1442053430316,"219.51.50.31","突撃!ナマイキTV","突撃!ナマイキTV" ]
- [ 1442075782897,"219.67.166.28","オリンピア・ミラノ","" ]
- [ 1442035985727,"220.109.120.102","ワールドサッカー ウイニングイレブン 2016","" ]
- [ 1442036083342,"220.210.178.20","櫻井よしこ","" ]
- [ 1442024997507,"220.212.136.113","国際地学オリンピック","" ]
- [ 1442024799232,"220.213.14.136","甲府市中心市街地活性化基本計画","" ]
- [ 1442025695124,"220.213.14.136","放置自転車","甲府市中心市街地活性化基本計画" ]
- [ 1442026228735,"220.213.14.136","甲府市中心市街地活性化基本計画","放置自転車" ]
- [ 1442051686890,"220.62.54.3","坂上忍の成長マン!!","" ]
- [ 1442044538982,"221.170.137.161","週末キッズタイム","" ]
- [ 1442053936462,"221.77.244.149","ボーダーブレイク","" ]
- [ 1442101230028,"222.12.9.108","ネプリーグのクイズ・企画一覧","" ]
- [ 1442046505197,"222.148.228.64","おじゃる丸のエピソード一覧","" ]
- [ 1442046590842,"222.148.228.64","おじゃる丸","おじゃる丸のエピソード一覧" ]
- [ 1442051878307,"223.132.42.72","THE IDOLM@STER CINDERELLA GIRLS ANIMATION PROJECT","" ]
- [ 1442027068163,"49.128.148.160","パンク・ファッション","" ]
- [ 1442035102420,"49.181.161.0","Hazelbrook railway station","" ]
- [ 1442059510611,"49.183.149.106","2015 AFL finals series","" ]
- [ 1442045663055,"49.199.44.74","List of fictional European countries","" ]
- [ 1442047899247,"49.199.44.74","List of fictional European countries","List of fictional European countries" ]
- [ 1442051573911,"49.199.44.74","List of fictional European countries","List of fictional European countries" ]
- [ 1442051658029,"49.199.44.74","List of fictional European countries","List of fictional European countries" ]
- [ 1442055279567,"58.106.135.42","Newcastle Jets FC Youth","" ]
- [ 1442059004452,"58.111.155.139","Stadium Australia","" ]
- [ 1442048316558,"58.156.119.18","特盛!よしもと 今田・八光のおしゃべりジャングル","" ]
- [ 1442028373987,"58.156.158.18","ソーラーパネル","" ]
- [ 1442046515015,"58.174.137.134","Jarryd Hayne","" ]
- [ 1442055231108,"58.175.186.6","Animals in Islam","" ]
- [ 1442056110424,"58.175.59.60","Queer Lion","" ]
- [ 1442040037037,"58.183.124.153","ジュラシック・パークIII","" ]
- [ 1442046294050,"58.188.28.158","小山薫堂の“温故知新堂”","" ]
- [ 1442051739818,"58.188.28.158","平塚競技場","小山薫堂の“温故知新堂”" ]
- [ 1442058986459,"58.188.28.158","2015年ワールドカップバレーボール","平塚競技場" ]
- [ 1442065595186,"58.188.28.158","ザ・ラストヒロイン〜ワルキューレの審判〜","2015年ワールドカップバレーボール" ]
- [ 1442065723868,"58.188.28.158","癒し屋キリコの約束","ザ・ラストヒロイン〜ワルキューレの審判〜" ]
- [ 1442068144671,"58.188.28.158","地域発ドラマ","癒し屋キリコの約束" ]
- [ 1442068557997,"58.7.81.140","Nose gunner","" ]
- [ 1442056051721,"58.70.174.162","トヨタ・エスティマ","" ]
- [ 1442042617971,"58.89.8.10","津軽信枚","" ]
- [ 1442038469110,"58.93.38.113","ウエルシア薬局","" ]
- [ 1442072948002,"59.166.42.154","コミック乱ツインズ","" ]
- [ 1442034973871,"59.86.97.35","パズドラZ","" ]
- [ 1442071403042,"59.87.28.229","История создания сил специальных операций Армии США","" ]
- [ 1442072375155,"59.87.28.229","Армия США","История создания сил специальных операций Армии США" ]
- [ 1442027556018,"60.224.133.167","Torres Strait Islanders","" ]
- [ 1442018825474,"60.225.66.142","Peremptory norm","" ]
- [ 1442043839445,"61.200.121.189","コズミックフロント","" ]
- [ 1442036042205,"61.245.69.54","テレビ朝日系列日曜昼前の情報番組枠","" ]
- [ 1442063039021,"62.178.213.52","Cimburgis von Masowien","" ]
- [ 1442068687074,"77.80.5.199","Santiago Niño Becerra","" ]
- [ 1442088415400,"83.65.220.213","Philomena Höltkemeier Story Consulting","" ]
- [ 1442093778448,"90.146.48.55","Z Nation","" ]
- [ 1442088395645,"91.115.65.157","Al-Masdschid al-Harām","" ]
- [1442055495852,"1.121.160.49","Walker, Texas Ranger",null]
- [1442056175946,"1.121.160.49","Walker, Texas Ranger","Walker, Texas Ranger"]
- [1442062719426,"1.121.160.49","Richard Norton (actor)","Walker, Texas Ranger"]
- [1442053449011,"1.123.133.249","Inside Out",null]
- [1442030282870,"1.123.149.111","Christina Ricci",null]
- [1442062306734,"1.129.96.160","Andrew Hastie (politician)",null]
- [1442052408695,"1.129.96.219","Dorrigo Steam Railway and Museum",null]
- [1442049229239,"1.129.96.242","Dorrigo Steam Railway and Museum",null]
- [1442046541914,"1.152.96.170","Ayrton Senna",null]
- [1442056892106,"101.128.232.140","清水浩",null]
- [1442057005310,"101.128.232.140","清水浩","清水浩"]
- [1442033283609,"101.140.3.146","水原茂",null]
- [1442036282693,"101.162.15.184","The Biggest Loser (U.S. TV series)",null]
- [1442036494525,"101.162.15.184","The Biggest Loser (U.S. TV series)","The Biggest Loser (U.S. TV series)"]
- [1442053239190,"101.162.15.184","The Biggest Loser (season 3)","The Biggest Loser (U.S. TV series)"]
- [1442094543511,"101.162.15.184","The Biggest Loser (season 3)","The Biggest Loser (season 3)"]
- [1442054030928,"101.162.192.189","Second Keating Ministry",null]
- [1442054439219,"101.162.192.189","Second Keating Ministry","Second Keating Ministry"]
- [1442062617292,"101.180.202.153","2015 AFL season",null]
- [1442042291553,"103.18.40.202","Wikipedia:Auskunft",null]
- [1442030546957,"103.20.255.191","Same-sex marriage in New Zealand",null]
- [1442028937717,"103.225.121.237","AKB48握手会傷害事件",null]
- [1442025765045,"103.56.218.196","욱일기",null]
- [1442018949298,"106.131.175.193","正岡大介",null]
- [1442061568629,"106.132.207.6","白石涼子",null]
- [1442074511372,"106.150.80.109","ノート:アズ熊谷",null]
- [1442022640886,"106.161.56.138","山口敬之",null]
- [1442061180690,"106.188.137.190","救急救命士養成所",null]
- [1442061491224,"106.188.137.190","救急救命士","救急救命士養成所"]
- [1442100695886,"106.188.187.22","Petronas Towers",null]
- [1442033017165,"106.188.237.163","ダウンロード違法化",null]
- [1442019638402,"110.1.177.43","ユーロビート",null]
- [1442039765889,"110.1.177.43","虹の都へ","ユーロビート"]
- [1442097432832,"110.20.158.121","Flavia Pennetta",null]
- [1442097158335,"110.20.234.69","Yaoi",null]
- [1442101346090,"110.20.234.69","Yaoi fandom","Yaoi"]
- [1442022181729,"110.21.43.182","Planet Hollywood Resort & Casino",null]
- [1442054156682,"110.22.186.92","Aris F.C. (Thessaloniki)",null]
- [1442060921634,"110.32.28.203","Politics of Réunion",null]
- [1442095172937,"110.67.252.181","Shinya",null]
- [1442073188151,"111.216.35.85","うしおそうじ",null]
- [1442070741096,"113.197.250.14","フィンテック",null]
- [1442065282546,"113.36.127.77","福岡県立修猷館高等学校の人物一覧",null]
- [1442020617093,"113.38.112.244","エフエム東京",null]
- [1442043701284,"114.148.67.27","オウム真理教の修行",null]
- [1442057752095,"114.149.159.81","鮎川誠",null]
- [1442030463066,"114.149.98.37","2015年全米オープン (テニス)",null]
- [1442036595334,"114.161.17.122","京都放送",null]
- [1442085773238,"114.163.215.4","コンコルド墜落事故",null]
- [1442019941523,"114.165.9.29","架空の乗り物一覧",null]
- [1442073082802,"114.167.235.83","ランドール・パーク",null]
- [1442036882364,"114.168.102.41","杉浦圭子",null]
- [1442046282828,"114.186.112.218","オイルショック",null]
- [1442030866019,"115.64.101.40","Snow leopard",null]
- [1442030416128,"115.69.63.229","Ibrahim Sunday",null]
- [1442046588882,"117.18.154.84","969運動",null]
- [1442022015086,"117.55.68.51","セルゲーエフ",null]
- [1442022520647,"117.55.68.51","セルゲーエワ","セルゲーエフ"]
- [1442063719891,"117.74.50.110","ソード・ワールド2.0リプレイ from USA",null]
- [1442039556838,"118.106.18.200","今夜もオトパラ!",null]
- [1442049541582,"118.106.18.200","青森放送","今夜もオトパラ!"]
- [1442047677181,"118.109.38.229","ケイゾク",null]
- [1442049350391,"118.109.38.229","ケイゾク","ケイゾク"]
- [1442063820782,"118.109.38.229","ケイゾク","ケイゾク"]
- [1442080232899,"118.111.38.174","外傷初期診療ガイドライン日本版",null]
- [1442033322693,"118.238.237.196","推理小説",null]
- [1442090528892,"119.104.157.254","おかしな二人",null]
- [1442075598708,"119.104.36.170","パスポート",null]
- [1442038707947,"119.170.41.230","スーパーマン (1978年の映画)",null]
- [1442031883720,"119.25.37.181","六甲人工島線",null]
- [1442018890048,"119.26.148.34","青野武",null]
- [1442046705300,"119.26.148.34","クッキングパパの登場人物","青野武"]
- [1442058062503,"119.26.148.34","林先生が驚く初耳学!","クッキングパパの登場人物"]
- [1442059524102,"119.26.148.34","エンジェル・ハート","林先生が驚く初耳学!"]
- [1442065445099,"119.26.148.34","本田望結","エンジェル・ハート"]
- [1442068465888,"119.63.112.86","DIABOLIK LOVERS",null]
- [1442069164239,"119.63.112.86","GANGSTA.","DIABOLIK LOVERS"]
- [1442091530861,"119.63.112.86","BS-TBS独占放送深夜アニメ枠","GANGSTA."]
- [1442030131807,"119.72.245.161","The VISIONALUX",null]
- [1442047214542,"120.147.6.7","African Union Mission to Somalia",null]
- [1442032176994,"121.102.43.4","利用者‐会話:Yasuyuki Takeo",null]
- [1442066932287,"121.117.180.156","Ulmendorf",null]
- [1442023340480,"121.208.92.28","Moreton Bay",null]
- [1442050348689,"121.211.56.55","Dominique Dunne",null]
- [1442100154443,"121.211.82.121","List of Harry Potter characters",null]
- [1442048444641,"121.223.129.191","List of dinosaur genera",null]
- [1442027637932,"121.45.214.80","Total Drama Presents: The Ridonculous Race",null]
- [1442054470231,"121.93.47.91","チキンハート",null]
- [1442069124156,"121.93.97.147","機甲創世記モスピーダ",null]
- [1442095062216,"122.108.156.100","United States presidential election, 1892",null]
- [1442098671579,"122.108.156.100","United States presidential election, 1892","United States presidential election, 1892"]
- [1442023533650,"122.25.10.78","星のカービィ! も〜れつプププアワー!",null]
- [1442024788039,"122.25.10.78","陸上防衛隊まおちゃん","星のカービィ! も〜れつプププアワー!"]
- [1442072416878,"122.25.10.78","黒鷺死体宅配便","陸上防衛隊まおちゃん"]
- [1442074382146,"122.25.10.78","ロリコンフェニックス","黒鷺死体宅配便"]
- [1442072607975,"123.100.63.20","User:MichelleFranklin/AustralianSkeptics",null]
- [1442084541627,"123.217.1.75","JOIN ALIVE",null]
- [1442056682107,"123.223.224.148","相馬康一",null]
- [1442056818652,"123.223.224.148","杉崎亮","相馬康一"]
- [1442057183557,"123.223.224.148","日高里菜","杉崎亮"]
- [1442037245734,"124.148.87.34","List of Doctor Who audio plays by Big Finish",null]
- [1442038279908,"124.148.87.34","List of Doctor Who audio plays by Big Finish","List of Doctor Who audio plays by Big Finish"]
- [1442039505649,"124.148.87.34","List of Doctor Who audio plays by Big Finish","List of Doctor Who audio plays by Big Finish"]
- [1442051202571,"124.148.87.34","List of Doctor Who audio plays by Big Finish","List of Doctor Who audio plays by Big Finish"]
- [1442027954979,"124.169.165.146","Talk:Peter O'Toole",null]
- [1442096498423,"124.169.17.234","Coca-Cola formula",null]
- [1442046696410,"124.170.55.214","Northern Football League (Australia)",null]
- [1442049310216,"124.171.44.159","Liberal Democratic Party (Australia)",null]
- [1442035151510,"124.188.44.154","List of Doctor Who audio plays by Big Finish",null]
- [1442092615464,"124.45.73.228","鹿児島県立加治木高等学校",null]
- [1442023710710,"125.168.85.156","Beatrix Potter",null]
- [1442050705594,"125.192.149.97","ドカチン",null]
- [1442063450156,"125.198.182.94","交響曲第5番 (チャイコフスキー)",null]
- [1442036586983,"125.2.29.54","バトルスピリッツ 烈火魂",null]
- [1442020773422,"125.205.166.177","粉河町",null]
- [1442070671364,"126.10.25.69","民王",null]
- [1442065314043,"126.120.17.52","ガンズ・アンド・ローゼズ",null]
- [1442057530890,"126.144.8.136","小柳友貴美",null]
- [1442057729757,"126.144.8.136","張込み","小柳友貴美"]
- [1442058237893,"126.144.8.136","篠原涼子","張込み"]
- [1442058403152,"126.144.8.136","瀬戸朝香","篠原涼子"]
- [1442058944024,"126.144.8.136","顔田顔彦","瀬戸朝香"]
- [1442059192896,"126.144.8.136","山中聡","顔田顔彦"]
- [1442064154338,"126.29.44.172","アンフェア the answer",null]
- [1442046633404,"126.64.184.114","中山道",null]
- [1442045829839,"130.54.130.227","静岡空港",null]
- [1442056451492,"137.147.143.241","Royal Australian Air Force",null]
- [1442020256428,"137.147.165.107","Michael Sharkey",null]
- [1442045368765,"139.218.187.26","National Youth Competition (rugby league)",null]
- [1442021132744,"14.201.22.221","2015 Roger Federer tennis season",null]
- [1442078715198,"14.203.177.143","Captain (cricket)",null]
- [1442063042912,"153.170.91.23","一色氏",null]
- [1442040686108,"153.200.114.68","芋たこなんきん",null]
- [1442042536291,"153.200.114.68","ごちそうさん (2013年のテレビドラマ)","芋たこなんきん"]
- [1442042555091,"153.200.114.68","ごちそうさん (2013年のテレビドラマ)","ごちそうさん (2013年のテレビドラマ)"]
- [1442024836364,"153.207.13.117","リーガ・エスパニョーラ",null]
- [1442055615954,"153.230.62.16","刺客 聶隱娘",null]
- [1442079228153,"161.202.72.168","Shaun King (activist)",null]
- [1442080592078,"161.202.72.168","Talk:Shaun King (activist)","Shaun King (activist)"]
- [1442082673917,"161.202.72.168","Talk:Shaun King (activist)","Talk:Shaun King (activist)"]
- [1442054785180,"180.17.65.26","88式鉄帽",null]
- [1442064037343,"180.27.228.108","虎ノ門事件",null]
- [1442092840431,"180.54.251.210","鹿児島県立加治木高等学校",null]
- [1442026399564,"182.168.99.4","ミャンマー",null]
- [1442080053112,"182.173.142.88","ドクタースランプ",null]
- [1442080079822,"182.173.142.88","ドクタースランプ","ドクタースランプ"]
- [1442071861338,"188.23.31.111","Diskussion:Löwengrube (Serie)",null]
- [1442041218594,"202.174.58.102","テッド (映画)",null]
- [1442043359400,"202.174.58.102","立川流 (密教)","テッド (映画)"]
- [1442050346906,"203.112.37.97","ABCフレッシュアップベースボール",null]
- [1442037360618,"203.87.72.77","Hakoah Sydney City East FC",null]
- [1442033433557,"210.128.82.94","列車種別",null]
- [1442059451406,"210.132.145.235","キン肉マンスーパー・フェニックス",null]
- [1442028766085,"210.145.159.111","小桜エツコ",null]
- [1442047728381,"210.159.186.209","ハウス食品",null]
- [1442073460368,"210.160.37.25","沖野晃司",null]
- [1442073648703,"210.160.37.25","沖野晃司","沖野晃司"]
- [1442025498133,"210.171.30.75","車塚 (伊丹市)",null]
- [1442053077021,"210.194.52.87","小田急多摩線",null]
- [1442079405551,"210.199.238.238","ズバリ!当てましょう",null]
- [1442084605765,"210.199.238.238","インド","ズバリ!当てましょう"]
- [1442048760081,"211.0.97.62","アフガニスタン紛争 (1978年-1989年)",null]
- [1442058690158,"211.1.73.194","筑波山",null]
- [1442066152552,"211.135.251.28","FNSスーパースペシャルテレビ夢列島",null]
- [1442090789576,"212.95.7.43","Pamela (Vorname)",null]
- [1442093822018,"212.95.7.57","Eşkıya Dünyaya Hükümdar Olmaz (dizi)",null]
- [1442052594311,"213.102.112.181","Diskussion:Schlacht um die Krim",null]
- [1442055194535,"213.102.112.181","Diskussion:Schlacht um die Krim","Diskussion:Schlacht um die Krim"]
- [1442055264461,"213.102.112.181","Diskussion:Schlacht um die Krim","Diskussion:Schlacht um die Krim"]
- [1442087241623,"213.240.105.56","16. Mai",null]
- [1442073949064,"218.110.166.206","エゴグラム",null]
- [1442048197658,"218.227.98.24","福岡空港",null]
- [1442031289907,"218.45.13.57","サムライエッジ",null]
- [1442043817524,"219.102.143.16","ヒルナンデス!",null]
- [1442076175461,"219.106.24.95","中村れい子",null]
- [1442076262194,"219.106.24.95","阿藤快","中村れい子"]
- [1442076443347,"219.106.24.95","西岡善信","阿藤快"]
- [1442067732777,"219.106.70.167","アンフェア the end",null]
- [1442047016164,"219.110.114.95","永田久光",null]
- [1442039078679,"219.110.28.111","こちら葛飾区亀有公園前派出所の登場人物",null]
- [1442039059890,"219.112.132.106","野口茂樹",null]
- [1442039204914,"219.112.132.106","野口茂樹","野口茂樹"]
- [1442039593604,"219.112.132.106","井場友和","野口茂樹"]
- [1442042116370,"219.112.132.106","高村祐","井場友和"]
- [1442043631086,"219.112.132.106","岩本勉","高村祐"]
- [1442033187371,"219.127.27.114","あんハピ♪",null]
- [1442033425162,"219.127.27.114","林田理沙","あんハピ♪"]
- [1442034666225,"219.127.27.114","八木沼純子","林田理沙"]
- [1442026079559,"219.127.82.26","Wikipedia:サンドボックス",null]
- [1442047519920,"219.161.34.177","小川虎之助",null]
- [1442088730524,"219.171.105.167","2015 FIFA U-20ワールドカップ",null]
- [1442090473730,"219.171.105.167","AFC U-19女子選手権2015","2015 FIFA U-20ワールドカップ"]
- [1442098469728,"219.182.78.3","宮里久美",null]
- [1442029124664,"219.198.137.251","逆転イッパツマン",null]
- [1442048505685,"219.51.50.31","突撃!ナマイキTV",null]
- [1442053430316,"219.51.50.31","突撃!ナマイキTV","突撃!ナマイキTV"]
- [1442075782897,"219.67.166.28","オリンピア・ミラノ",null]
- [1442035985727,"220.109.120.102","ワールドサッカー ウイニングイレブン 2016",null]
- [1442036083342,"220.210.178.20","櫻井よしこ",null]
- [1442024997507,"220.212.136.113","国際地学オリンピック",null]
- [1442024799232,"220.213.14.136","甲府市中心市街地活性化基本計画",null]
- [1442025695124,"220.213.14.136","放置自転車","甲府市中心市街地活性化基本計画"]
- [1442026228735,"220.213.14.136","甲府市中心市街地活性化基本計画","放置自転車"]
- [1442051686890,"220.62.54.3","坂上忍の成長マン!!",null]
- [1442044538982,"221.170.137.161","週末キッズタイム",null]
- [1442053936462,"221.77.244.149","ボーダーブレイク",null]
- [1442101230028,"222.12.9.108","ネプリーグのクイズ・企画一覧",null]
- [1442046505197,"222.148.228.64","おじゃる丸のエピソード一覧",null]
- [1442046590842,"222.148.228.64","おじゃる丸","おじゃる丸のエピソード一覧"]
- [1442051878307,"223.132.42.72","THE IDOLM@STER CINDERELLA GIRLS ANIMATION PROJECT",null]
- [1442027068163,"49.128.148.160","パンク・ファッション",null]
- [1442035102420,"49.181.161.0","Hazelbrook railway station",null]
- [1442059510611,"49.183.149.106","2015 AFL finals series",null]
- [1442045663055,"49.199.44.74","List of fictional European countries",null]
- [1442047899247,"49.199.44.74","List of fictional European countries","List of fictional European countries"]
- [1442051573911,"49.199.44.74","List of fictional European countries","List of fictional European countries"]
- [1442051658029,"49.199.44.74","List of fictional European countries","List of fictional European countries"]
- [1442055279567,"58.106.135.42","Newcastle Jets FC Youth",null]
- [1442059004452,"58.111.155.139","Stadium Australia",null]
- [1442048316558,"58.156.119.18","特盛!よしもと 今田・八光のおしゃべりジャングル",null]
- [1442028373987,"58.156.158.18","ソーラーパネル",null]
- [1442046515015,"58.174.137.134","Jarryd Hayne",null]
- [1442055231108,"58.175.186.6","Animals in Islam",null]
- [1442056110424,"58.175.59.60","Queer Lion",null]
- [1442040037037,"58.183.124.153","ジュラシック・パークIII",null]
- [1442046294050,"58.188.28.158","小山薫堂の“温故知新堂”",null]
- [1442051739818,"58.188.28.158","平塚競技場","小山薫堂の“温故知新堂”"]
- [1442058986459,"58.188.28.158","2015年ワールドカップバレーボール","平塚競技場"]
- [1442065595186,"58.188.28.158","ザ・ラストヒロイン〜ワルキューレの審判〜","2015年ワールドカップバレーボール"]
- [1442065723868,"58.188.28.158","癒し屋キリコの約束","ザ・ラストヒロイン〜ワルキューレの審判〜"]
- [1442068144671,"58.188.28.158","地域発ドラマ","癒し屋キリコの約束"]
- [1442068557997,"58.7.81.140","Nose gunner",null]
- [1442056051721,"58.70.174.162","トヨタ・エスティマ",null]
- [1442042617971,"58.89.8.10","津軽信枚",null]
- [1442038469110,"58.93.38.113","ウエルシア薬局",null]
- [1442072948002,"59.166.42.154","コミック乱ツインズ",null]
- [1442034973871,"59.86.97.35","パズドラZ",null]
- [1442071403042,"59.87.28.229","История создания сил специальных операций Армии США",null]
- [1442072375155,"59.87.28.229","Армия США","История создания сил специальных операций Армии США"]
- [1442027556018,"60.224.133.167","Torres Strait Islanders",null]
- [1442018825474,"60.225.66.142","Peremptory norm",null]
- [1442043839445,"61.200.121.189","コズミックフロント",null]
- [1442036042205,"61.245.69.54","テレビ朝日系列日曜昼前の情報番組枠",null]
- [1442063039021,"62.178.213.52","Cimburgis von Masowien",null]
- [1442068687074,"77.80.5.199","Santiago Niño Becerra",null]
- [1442088415400,"83.65.220.213","Philomena Höltkemeier Story Consulting",null]
- [1442093778448,"90.146.48.55","Z Nation",null]
- [1442088395645,"91.115.65.157","Al-Masdschid al-Harām",null]