@Test public void testSearchSameValueInMultiDims() { SearchQuery searchQuery; Druids.SearchQueryBuilder builder = testBuilder() .dimensions(Arrays.asList(placementDimension, placementishDimension)); Map<String, Set<String>> expectedResults = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); searchQuery = builder.query("PREFERRED").build(); expectedResults.put(placementDimension, Sets.newHashSet("PREFERRED", "preferred", "PREFERRed")); expectedResults.put(placementishDimension, Sets.newHashSet("preferred", "Preferred")); checkSearchQuery(searchQuery, expectedResults); searchQuery = builder.query("preferred", true).build(); expectedResults.put(placementDimension, Sets.newHashSet("preferred")); expectedResults.put(placementishDimension, Sets.newHashSet("preferred")); checkSearchQuery(searchQuery, expectedResults); }
@Test public void testSearchNoOverrappingIntervals() { SearchQuery searchQuery; Druids.SearchQueryBuilder builder = testBuilder() .dimensions(Collections.singletonList(qualityDimension)) .intervals("2011-01-10T00:00:00.000Z/2011-01-11T00:00:00.000Z"); Map<String, Set<String>> expectedResults = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); searchQuery = builder.query("business").build(); expectedResults.put(qualityDimension, new HashSet<>()); checkSearchQuery(searchQuery, expectedResults); }
@Test public void testSearchIntervals() { SearchQuery searchQuery; Druids.SearchQueryBuilder builder = testBuilder() .dimensions(Collections.singletonList(qualityDimension)) .intervals("2011-01-12T00:00:00.000Z/2011-01-13T00:00:00.000Z"); Map<String, Set<String>> expectedResults = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); searchQuery = builder.query("otive").build(); expectedResults.put(qualityDimension, Sets.newHashSet("AutoMotive")); checkSearchQuery(searchQuery, expectedResults); }
@Test public void testSearchSameValueInMultiDims2() { SearchQuery searchQuery = Druids.newSearchQueryBuilder() .dataSource(QueryRunnerTestHelper.dataSource) .granularity(QueryRunnerTestHelper.allGran) .intervals(QueryRunnerTestHelper.fullOnIntervalSpec) .dimensions( Arrays.asList( QueryRunnerTestHelper.placementDimension, QueryRunnerTestHelper.placementishDimension ) ) .sortSpec(new SearchSortSpec(StringComparators.STRLEN)) .query("e") .build(); List<SearchHit> expectedHits = new ArrayList<>(); expectedHits.add(new SearchHit(QueryRunnerTestHelper.placementishDimension, "e", 93)); expectedHits.add(new SearchHit(QueryRunnerTestHelper.placementDimension, "preferred", 1209)); expectedHits.add(new SearchHit(QueryRunnerTestHelper.placementishDimension, "preferred", 1209)); checkSearchQuery(searchQuery, expectedHits); }
@Test public void testSearchOnLongColumnWithExFn() { String jsFn = "function(str) { return 'super-' + str; }"; ExtractionFn jsExtractionFn = new JavaScriptExtractionFn(jsFn, false, JavaScriptConfig.getEnabledInstance()); SearchQuery searchQuery = Druids.newSearchQueryBuilder() .dimensions( new ExtractionDimensionSpec( ColumnHolder.TIME_COLUMN_NAME, ColumnHolder.TIME_COLUMN_NAME, jsExtractionFn ) ) .dataSource(QueryRunnerTestHelper.dataSource) .granularity(QueryRunnerTestHelper.allGran) .intervals(QueryRunnerTestHelper.fullOnIntervalSpec) .query("1297123200000") .build(); List<SearchHit> expectedHits = new ArrayList<>(); expectedHits.add(new SearchHit(ColumnHolder.TIME_COLUMN_NAME, "super-1297123200000", 13)); checkSearchQuery(searchQuery, expectedHits); }
@Test public void testSerDe() throws IOException { Query query = Druids.newSearchQueryBuilder() .dataSource(QueryRunnerTestHelper.dataSource) .granularity(QueryRunnerTestHelper.allGran) .intervals(QueryRunnerTestHelper.fullOnIntervalSpec) .dimensions(new LegacyDimensionSpec(QueryRunnerTestHelper.qualityDimension)) .query("a") .build(); final String json = "{\"queryType\":\"search\",\"dataSource\":{\"type\":\"table\",\"name\":\"testing\"},\"filter\":null,\"granularity\":{\"type\":\"all\"},\"limit\":1000,\"intervals\":{\"type\":\"intervals\",\"intervals\":[\"1970-01-01T00:00:00.000Z/2020-01-01T00:00:00.000Z\"]},\"searchDimensions\":[\"" + QueryRunnerTestHelper.qualityDimension + "\"],\"query\":{\"type\":\"insensitive_contains\",\"value\":\"a\"},\"sort\":{\"type\":\"lexicographic\"},\"context\":null}"; final Query serdeQuery = jsonMapper.readValue(json, Query.class); Assert.assertEquals(query.toString(), serdeQuery.toString()); Assert.assertEquals(query, serdeQuery); final String json2 = "{\"queryType\":\"search\",\"dataSource\":{\"type\":\"table\",\"name\":\"testing\"},\"filter\":null,\"granularity\":{\"type\":\"all\"},\"limit\":1000,\"intervals\":{\"type\":\"intervals\",\"intervals\":[\"1970-01-01T00:00:00.000Z/2020-01-01T00:00:00.000Z\"]},\"searchDimensions\":[\"quality\"],\"query\":{\"type\":\"insensitive_contains\",\"value\":\"a\"},\"sort\":{\"type\":\"lexicographic\"},\"context\":null}"; final Query serdeQuery2 = jsonMapper.readValue(json2, Query.class); Assert.assertEquals(query.toString(), serdeQuery2.toString()); Assert.assertEquals(query, serdeQuery2); } }
@Test public void testSearchWithSingleFilter1() { List<SearchHit> expectedHits = new ArrayList<>(); expectedHits.add(new SearchHit(QueryRunnerTestHelper.qualityDimension, "mezzanine", 93)); checkSearchQuery( Druids.newSearchQueryBuilder() .dataSource(QueryRunnerTestHelper.dataSource) .granularity(QueryRunnerTestHelper.allGran) .filters( new AndDimFilter( Arrays.asList( new SelectorDimFilter(QueryRunnerTestHelper.marketDimension, "total_market", null), new SelectorDimFilter(QueryRunnerTestHelper.qualityDimension, "mezzanine", null) ))) .intervals(QueryRunnerTestHelper.fullOnIntervalSpec) .dimensions(QueryRunnerTestHelper.qualityDimension) .query("a") .build(), expectedHits ); }
@Test public void testSearchWithDimensionsQualityAndProvider() { List<SearchHit> expectedHits = new ArrayList<>(); expectedHits.add(new SearchHit(QueryRunnerTestHelper.qualityDimension, "automotive", 93)); expectedHits.add(new SearchHit(QueryRunnerTestHelper.qualityDimension, "mezzanine", 279)); expectedHits.add(new SearchHit(QueryRunnerTestHelper.qualityDimension, "travel", 93)); expectedHits.add(new SearchHit(QueryRunnerTestHelper.qualityDimension, "health", 93)); expectedHits.add(new SearchHit(QueryRunnerTestHelper.qualityDimension, "entertainment", 93)); expectedHits.add(new SearchHit(QueryRunnerTestHelper.marketDimension, "total_market", 186)); checkSearchQuery( Druids.newSearchQueryBuilder() .dataSource(QueryRunnerTestHelper.dataSource) .granularity(QueryRunnerTestHelper.allGran) .dimensions( Arrays.asList( QueryRunnerTestHelper.qualityDimension, QueryRunnerTestHelper.marketDimension ) ) .intervals(QueryRunnerTestHelper.fullOnIntervalSpec) .query("a") .build(), expectedHits ); }
@Test public void testSearchMultiAndFilter() { List<SearchHit> expectedHits = new ArrayList<>(); expectedHits.add(new SearchHit(QueryRunnerTestHelper.qualityDimension, "automotive", 93)); DimFilter filter = new AndDimFilter( new SelectorDimFilter(QueryRunnerTestHelper.marketDimension, "spot", null), new SelectorDimFilter(QueryRunnerTestHelper.qualityDimension, "automotive", null) ); checkSearchQuery( Druids.newSearchQueryBuilder() .dataSource(QueryRunnerTestHelper.dataSource) .granularity(QueryRunnerTestHelper.allGran) .filters(filter) .dimensions(QueryRunnerTestHelper.qualityDimension) .intervals(QueryRunnerTestHelper.fullOnIntervalSpec) .query("a") .build(), expectedHits ); }
@Test public void testSearchWithDimensionsPlacementAndProvider() { List<SearchHit> expectedHits = new ArrayList<>(); expectedHits.add(new SearchHit(QueryRunnerTestHelper.marketDimension, "total_market", 186)); checkSearchQuery( Druids.newSearchQueryBuilder() .dataSource(QueryRunnerTestHelper.dataSource) .granularity(QueryRunnerTestHelper.allGran) .dimensions( Arrays.asList( QueryRunnerTestHelper.placementishDimension, QueryRunnerTestHelper.marketDimension ) ) .intervals(QueryRunnerTestHelper.fullOnIntervalSpec) .query("mark") .build(), expectedHits ); }
@Test public void testSearchOnFloatColumn() { SearchQuery searchQuery = Druids.newSearchQueryBuilder() .dimensions( new DefaultDimensionSpec( QueryRunnerTestHelper.indexMetric, QueryRunnerTestHelper.indexMetric, ValueType.DOUBLE ) ) .dataSource(QueryRunnerTestHelper.dataSource) .granularity(QueryRunnerTestHelper.allGran) .intervals(QueryRunnerTestHelper.fullOnIntervalSpec) .query("100.7") .build(); List<SearchHit> expectedHits = new ArrayList<>(); expectedHits.add(new SearchHit(QueryRunnerTestHelper.indexMetric, "100.706057", 1)); expectedHits.add(new SearchHit(QueryRunnerTestHelper.indexMetric, "100.775597", 1)); checkSearchQuery(searchQuery, expectedHits); }
@Test public void testSearchWithDimensionQuality() { List<SearchHit> expectedHits = new ArrayList<>(); expectedHits.add(new SearchHit(QueryRunnerTestHelper.qualityDimension, "automotive", 93)); expectedHits.add(new SearchHit(QueryRunnerTestHelper.qualityDimension, "mezzanine", 279)); expectedHits.add(new SearchHit(QueryRunnerTestHelper.qualityDimension, "travel", 93)); expectedHits.add(new SearchHit(QueryRunnerTestHelper.qualityDimension, "health", 93)); expectedHits.add(new SearchHit(QueryRunnerTestHelper.qualityDimension, "entertainment", 93)); checkSearchQuery( Druids.newSearchQueryBuilder() .dataSource(QueryRunnerTestHelper.dataSource) .granularity(QueryRunnerTestHelper.allGran) .dimensions("quality") .intervals(QueryRunnerTestHelper.fullOnIntervalSpec) .query("a") .build(), expectedHits ); }
@Test public void testSearchOnLongColumn() { SearchQuery searchQuery = Druids.newSearchQueryBuilder() .dimensions( new DefaultDimensionSpec( ColumnHolder.TIME_COLUMN_NAME, ColumnHolder.TIME_COLUMN_NAME, ValueType.LONG ) ) .dataSource(QueryRunnerTestHelper.dataSource) .granularity(QueryRunnerTestHelper.allGran) .intervals(QueryRunnerTestHelper.fullOnIntervalSpec) .query("1297123200000") .build(); List<SearchHit> expectedHits = new ArrayList<>(); expectedHits.add(new SearchHit(ColumnHolder.TIME_COLUMN_NAME, "1297123200000", 13)); checkSearchQuery(searchQuery, expectedHits); }
@Test public void testSearchWithMultiOrFilter() { List<SearchHit> expectedHits = new ArrayList<>(); expectedHits.add(new SearchHit(QueryRunnerTestHelper.qualityDimension, "automotive", 93)); DimFilter filter = new OrDimFilter( new SelectorDimFilter(QueryRunnerTestHelper.qualityDimension, "total_market", null), new SelectorDimFilter(QueryRunnerTestHelper.qualityDimension, "automotive", null) ); checkSearchQuery( Druids.newSearchQueryBuilder() .dataSource(QueryRunnerTestHelper.dataSource) .granularity(QueryRunnerTestHelper.allGran) .dimensions(QueryRunnerTestHelper.qualityDimension) .filters(filter) .intervals(QueryRunnerTestHelper.fullOnIntervalSpec) .query("a") .build(), expectedHits ); }
@Test public void testSearchSameValueInMultiDims() { SearchQuery searchQuery = Druids.newSearchQueryBuilder() .dataSource(QueryRunnerTestHelper.dataSource) .granularity(QueryRunnerTestHelper.allGran) .intervals(QueryRunnerTestHelper.fullOnIntervalSpec) .dimensions( Arrays.asList( QueryRunnerTestHelper.placementDimension, QueryRunnerTestHelper.placementishDimension ) ) .query("e") .build(); List<SearchHit> expectedHits = new ArrayList<>(); expectedHits.add(new SearchHit(QueryRunnerTestHelper.placementDimension, "preferred", 1209)); expectedHits.add(new SearchHit(QueryRunnerTestHelper.placementishDimension, "e", 93)); expectedHits.add(new SearchHit(QueryRunnerTestHelper.placementishDimension, "preferred", 1209)); checkSearchQuery(searchQuery, expectedHits); }
@Test public void testSearchWithSingleFilter2() { List<SearchHit> expectedHits = new ArrayList<>(); expectedHits.add(new SearchHit(QueryRunnerTestHelper.marketDimension, "total_market", 186)); checkSearchQuery( Druids.newSearchQueryBuilder() .dataSource(QueryRunnerTestHelper.dataSource) .granularity(QueryRunnerTestHelper.allGran) .filters(QueryRunnerTestHelper.marketDimension, "total_market") .intervals(QueryRunnerTestHelper.fullOnIntervalSpec) .dimensions(QueryRunnerTestHelper.marketDimension) .query("a") .build(), expectedHits ); }
@Test public void testSearchWithDimensionProvider() { List<SearchHit> expectedHits = new ArrayList<>(); expectedHits.add(new SearchHit(QueryRunnerTestHelper.marketDimension, "total_market", 186)); checkSearchQuery( Druids.newSearchQueryBuilder() .dataSource(QueryRunnerTestHelper.dataSource) .granularity(QueryRunnerTestHelper.allGran) .dimensions("market") .intervals(QueryRunnerTestHelper.fullOnIntervalSpec) .query("a") .build(), expectedHits ); }
@Test public void testSearchNonExistingDimension() { List<SearchHit> expectedHits = new ArrayList<>(); checkSearchQuery( Druids.newSearchQueryBuilder() .dataSource(QueryRunnerTestHelper.dataSource) .granularity(QueryRunnerTestHelper.allGran) .intervals(QueryRunnerTestHelper.fullOnIntervalSpec) .dimensions("does_not_exist") .query("a") .build(), expectedHits ); }
@Test public void testSearchWithNotExistedDimension() { SearchQuery searchQuery = Druids.newSearchQueryBuilder() .dimensions( new DefaultDimensionSpec("asdf", "asdf") ) .dataSource(QueryRunnerTestHelper.dataSource) .granularity(QueryRunnerTestHelper.allGran) .intervals(QueryRunnerTestHelper.fullOnIntervalSpec) .build(); List<SearchHit> noHit = new ArrayList<>(); checkSearchQuery(searchQuery, noHit); }
public static SearchQueryBuilder copy(SearchQuery query) { return new SearchQueryBuilder() .dataSource(query.getDataSource()) .filters(query.getDimensionsFilter()) .granularity(query.getGranularity()) .limit(query.getLimit()) .intervals(query.getQuerySegmentSpec()) .dimensions(query.getDimensions()) .query(query.getQuery()) .sortSpec(query.getSort()) .context(query.getContext()); }