提交 9c732e75 编写于 作者: E Eric Tschetter

1) Add new SearchQueryDimFilter/SearchQueryFilter that will do a filter using...

1) Add new SearchQueryDimFilter/SearchQueryFilter that will do a filter using the same queries that can be used for SearchQuery
上级 3a9591bd
......@@ -29,7 +29,6 @@ import java.util.List;
*/
public class AndDimFilter implements DimFilter
{
private static final byte CACHE_TYPE_ID = 0x1;
private static final Joiner AND_JOINER = Joiner.on(" && ");
final private List<DimFilter> fields;
......@@ -51,7 +50,7 @@ public class AndDimFilter implements DimFilter
@Override
public byte[] getCacheKey()
{
return DimFilterCacheHelper.computeCacheKey(CACHE_TYPE_ID, fields);
return DimFilterCacheHelper.computeCacheKey(DimFilterCacheHelper.AND_CACHE_ID, fields);
}
@Override
......
......@@ -26,6 +26,15 @@ import java.util.List;
*/
class DimFilterCacheHelper
{
static final byte NOOP_CACHE_ID = -0x4;
static final byte SELECTOR_CACHE_ID = 0x0;
static final byte AND_CACHE_ID = 0x1;
static final byte OR_CACHE_ID = 0x2;
static final byte NOT_CACHE_ID = 0x3;
static final byte EXTRACTION_CACHE_ID = 0x4;
static final byte REGEX_CACHE_ID = 0x5;
static final byte SEARCH_QUERY_TYPE_ID = 0x6;
static byte[] computeCacheKey(byte cacheIdKey, List<DimFilter> filters)
{
if (filters.size() == 1) {
......
......@@ -29,8 +29,6 @@ import java.nio.ByteBuffer;
*/
public class ExtractionDimFilter implements DimFilter
{
private static final byte CACHE_TYPE_ID = 0x4;
private final String dimension;
private final String value;
private final DimExtractionFn dimExtractionFn;
......@@ -72,7 +70,7 @@ public class ExtractionDimFilter implements DimFilter
byte[] valueBytes = value.getBytes();
return ByteBuffer.allocate(1 + dimensionBytes.length + valueBytes.length)
.put(CACHE_TYPE_ID)
.put(DimFilterCacheHelper.EXTRACTION_CACHE_ID)
.put(dimensionBytes)
.put(valueBytes)
.array();
......
......@@ -25,11 +25,9 @@ import java.nio.ByteBuffer;
*/
public class NoopDimFilter implements DimFilter
{
private static final byte CACHE_TYPE_ID = -0x4;
@Override
public byte[] getCacheKey()
{
return ByteBuffer.allocate(1).put(CACHE_TYPE_ID).array();
return ByteBuffer.allocate(1).put(DimFilterCacheHelper.NOOP_CACHE_ID).array();
}
}
......@@ -28,8 +28,6 @@ import java.nio.ByteBuffer;
*/
public class NotDimFilter implements DimFilter
{
private static final byte CACHE_TYPE_ID = 0x3;
final private DimFilter field;
@JsonCreator
......@@ -51,7 +49,7 @@ public class NotDimFilter implements DimFilter
{
byte[] subKey = field.getCacheKey();
return ByteBuffer.allocate(1 + subKey.length).put(CACHE_TYPE_ID).put(subKey).array();
return ByteBuffer.allocate(1 + subKey.length).put(DimFilterCacheHelper.NOT_CACHE_ID).put(subKey).array();
}
@Override
......
......@@ -29,7 +29,6 @@ import java.util.List;
*/
public class OrDimFilter implements DimFilter
{
private static final byte CACHE_TYPE_ID = 0x2;
private static final Joiner OR_JOINER = Joiner.on(" || ");
final private List<DimFilter> fields;
......@@ -51,7 +50,7 @@ public class OrDimFilter implements DimFilter
@Override
public byte[] getCacheKey()
{
return DimFilterCacheHelper.computeCacheKey(CACHE_TYPE_ID, fields);
return DimFilterCacheHelper.computeCacheKey(DimFilterCacheHelper.OR_CACHE_ID, fields);
}
@Override
......
......@@ -29,7 +29,6 @@ import java.nio.ByteBuffer;
*/
public class RegexDimFilter implements DimFilter
{
private static final byte CACHE_ID_KEY = 0x5;
private final String dimension;
private final String pattern;
......@@ -62,7 +61,7 @@ public class RegexDimFilter implements DimFilter
final byte[] patternBytes = pattern.getBytes(Charsets.UTF_8);
return ByteBuffer.allocate(1 + dimensionBytes.length + patternBytes.length)
.put(CACHE_ID_KEY)
.put(DimFilterCacheHelper.REGEX_CACHE_ID)
.put(dimensionBytes)
.put(patternBytes)
.array();
......
/*
* Druid - a distributed column store.
* Copyright (C) 2012 Metamarkets Group Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package com.metamx.druid.query.filter;
import com.google.common.base.Charsets;
import com.metamx.druid.query.search.SearchQuerySpec;
import org.codehaus.jackson.annotate.JsonProperty;
import java.nio.ByteBuffer;
/**
*/
public class SearchQueryDimFilter implements DimFilter
{
private final String dimension;
private final SearchQuerySpec query;
public SearchQueryDimFilter(
@JsonProperty("dimension") String dimension,
@JsonProperty("query")SearchQuerySpec query
)
{
this.dimension = dimension;
this.query = query;
}
@JsonProperty
public String getDimension()
{
return dimension;
}
@JsonProperty
public SearchQuerySpec getQuery()
{
return query;
}
@Override
public byte[] getCacheKey()
{
final byte[] dimensionBytes = dimension.getBytes(Charsets.UTF_8);
final byte[] queryBytes = query.getCacheKey();
return ByteBuffer.allocate(1 + dimensionBytes.length + queryBytes.length)
.put(DimFilterCacheHelper.SEARCH_QUERY_TYPE_ID)
.put(dimensionBytes)
.put(queryBytes)
.array();
}
}
......@@ -28,8 +28,6 @@ import java.nio.ByteBuffer;
*/
public class SelectorDimFilter implements DimFilter
{
private static final byte CACHE_TYPE_ID = 0x0;
private final String dimension;
private final String value;
......@@ -50,7 +48,7 @@ public class SelectorDimFilter implements DimFilter
byte[] valueBytes = value.getBytes();
return ByteBuffer.allocate(1 + dimensionBytes.length + valueBytes.length)
.put(CACHE_TYPE_ID)
.put(DimFilterCacheHelper.SELECTOR_CACHE_ID)
.put(dimensionBytes)
.put(valueBytes)
.array();
......
......@@ -41,6 +41,7 @@ import java.util.Map;
public class SearchQuery extends BaseQuery<Result<SearchResultValue>>
{
private final DimFilter dimFilter;
private final SearchSortSpec sortSpec;
private final QueryGranularity granularity;
private final List<String> dimensions;
private final SearchQuerySpec querySpec;
......@@ -55,11 +56,13 @@ public class SearchQuery extends BaseQuery<Result<SearchResultValue>>
@JsonProperty("intervals") QuerySegmentSpec querySegmentSpec,
@JsonProperty("searchDimensions") List<String> dimensions,
@JsonProperty("query") SearchQuerySpec querySpec,
@JsonProperty("sort") SearchSortSpec sortSpec,
@JsonProperty("context") Map<String, String> context
)
{
super(dataSource, querySegmentSpec, context);
this.dimFilter = dimFilter;
this.sortSpec = sortSpec;
this.granularity = granularity == null ? QueryGranularity.ALL : granularity;
this.limit = (limit == 0) ? 1000 : limit;
this.dimensions = (dimensions == null) ? null : Lists.transform(
......@@ -102,6 +105,7 @@ public class SearchQuery extends BaseQuery<Result<SearchResultValue>>
spec,
dimensions,
querySpec,
sortSpec,
getContext()
);
}
......@@ -117,6 +121,7 @@ public class SearchQuery extends BaseQuery<Result<SearchResultValue>>
getQuerySegmentSpec(),
dimensions,
querySpec,
sortSpec,
computeOverridenContext(contextOverrides)
);
}
......@@ -151,6 +156,12 @@ public class SearchQuery extends BaseQuery<Result<SearchResultValue>>
return querySpec;
}
@JsonProperty("sort")
public SearchSortSpec getSort()
{
return sortSpec == null ? querySpec.getSearchSortSpec() : sortSpec;
}
public SearchQuery withLimit(int newLimit)
{
return new SearchQuery(
......@@ -161,6 +172,7 @@ public class SearchQuery extends BaseQuery<Result<SearchResultValue>>
getQuerySegmentSpec(),
dimensions,
querySpec,
sortSpec,
getContext()
);
}
......
......@@ -101,7 +101,7 @@ public class SearchQueryQueryToolChest implements QueryToolChest<Result<SearchRe
)
{
SearchQuery query = (SearchQuery) input;
return new SearchBinaryFn(query.getQuery().getSearchSortSpec(), query.getGranularity());
return new SearchBinaryFn(query.getSort(), query.getGranularity());
}
};
}
......
......@@ -34,6 +34,16 @@ import java.util.List;
})
public interface SearchQuerySpec
{
/**
* Deprecated!
*
* This has been moved to the SearchQuery and is only still here for backwards compatibility purposes. Search
* queries should be adjusted to use the sort parameter on the SearchQuery object itself rather than on this
* object. This method will eventually go away.
*
* @return
*/
@Deprecated
public SearchSortSpec getSearchSortSpec();
public boolean accept(String dimVal);
......
......@@ -52,10 +52,7 @@ public abstract class BaseStorageAdapter implements StorageAdapter
final List<String> dimensions = query.getDimensions();
final SearchQuerySpec searchQuerySpec = query.getQuery();
final TreeSet<SearchHit> retVal = Sets.newTreeSet(
searchQuerySpec.getSearchSortSpec()
.getComparator()
);
final TreeSet<SearchHit> retVal = Sets.newTreeSet(query.getSort().getComparator());
Iterable<String> dimsToSearch;
if (dimensions == null || dimensions.isEmpty()) {
......
......@@ -27,6 +27,7 @@ import com.metamx.druid.query.filter.ExtractionDimFilter;
import com.metamx.druid.query.filter.NotDimFilter;
import com.metamx.druid.query.filter.OrDimFilter;
import com.metamx.druid.query.filter.RegexDimFilter;
import com.metamx.druid.query.filter.SearchQueryDimFilter;
import com.metamx.druid.query.filter.SelectorDimFilter;
import javax.annotation.Nullable;
......@@ -79,6 +80,10 @@ public class Filters
final RegexDimFilter regexDimFilter = (RegexDimFilter) dimFilter;
filter = new RegexFilter(regexDimFilter.getDimension(), regexDimFilter.getPattern());
} else if (dimFilter instanceof SearchQueryDimFilter) {
final SearchQueryDimFilter searchQueryFilter = (SearchQueryDimFilter) dimFilter;
filter = new SearchQueryFilter(searchQueryFilter.getDimension(), searchQueryFilter.getQuery());
}
return filter;
......
/*
* Druid - a distributed column store.
* Copyright (C) 2012 Metamarkets Group Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package com.metamx.druid.index.brita;
import com.google.common.base.Predicate;
import com.metamx.druid.query.search.SearchQuerySpec;
import org.codehaus.jackson.annotate.JsonCreator;
import org.codehaus.jackson.annotate.JsonProperty;
import javax.annotation.Nullable;
/**
*/
public class SearchQueryFilter extends DimensionPredicateFilter
{
@JsonCreator
public SearchQueryFilter(
@JsonProperty("dimension") String dimension,
@JsonProperty("query") final SearchQuerySpec query
)
{
super(
dimension,
new Predicate<String>()
{
@Override
public boolean apply(@Nullable String input)
{
return query.accept(input);
}
}
);
}
}
......@@ -419,7 +419,7 @@ public class IncrementalIndexStorageAdapter implements StorageAdapter
final EntryHolder holder = new EntryHolder();
final ValueMatcher theMatcher = makeFilterMatcher(filter, holder);
final SearchQuerySpec searchQuerySpec = query.getQuery();
final TreeSet<SearchHit> retVal = Sets.newTreeSet(searchQuerySpec.getSearchSortSpec().getComparator());
final TreeSet<SearchHit> retVal = Sets.newTreeSet(query.getSort().getComparator());
ConcurrentNavigableMap<IncrementalIndex.TimeAndDims, Aggregator[]> facts = index.getSubMap(
new IncrementalIndex.TimeAndDims(intervalStart, new String[][]{}),
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册