mirror of https://github.com/apache/druid.git
Fix non-sqlcompat validation in CalciteWindowQueryTest (#15086)
* fixes * check for latest rewrite place * Revert "check for latest rewrite place" This reverts commit5cf1e2c1ca
. * 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 commit8fa06644bc
. * 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:
parent
c6ca990f1f
commit
ae88f2c0b6
|
@ -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);
|
||||
|
|
|
@ -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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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()
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
|
|
@ -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}
|
||||
)
|
||||
)
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
type: "operatorValidation"
|
||||
type: "failingTest"
|
||||
|
||||
sql: |
|
||||
SELECT
|
||||
|
|
|
@ -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]
|
|
@ -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]
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -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 ]
|
||||
|
|
|
@ -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]
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue