mirror of https://github.com/apache/druid.git
optimize single elemented and/or filter
This commit is contained in:
parent
451c0bc6d8
commit
91f6be4884
|
@ -21,13 +21,10 @@ package io.druid.query.filter;
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonCreator;
|
import com.fasterxml.jackson.annotation.JsonCreator;
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
import com.google.common.base.Function;
|
|
||||||
import com.google.common.base.Joiner;
|
import com.google.common.base.Joiner;
|
||||||
import com.google.common.base.Preconditions;
|
import com.google.common.base.Preconditions;
|
||||||
import com.google.common.collect.Lists;
|
|
||||||
import io.druid.query.Druids;
|
import io.druid.query.Druids;
|
||||||
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -43,7 +40,7 @@ public class AndDimFilter implements DimFilter
|
||||||
@JsonProperty("fields") List<DimFilter> fields
|
@JsonProperty("fields") List<DimFilter> fields
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
fields.removeAll(Collections.singletonList(null));
|
fields = DimFilters.filterNulls(fields);
|
||||||
Preconditions.checkArgument(fields.size() > 0, "AND operator requires at least one field");
|
Preconditions.checkArgument(fields.size() > 0, "AND operator requires at least one field");
|
||||||
this.fields = fields;
|
this.fields = fields;
|
||||||
}
|
}
|
||||||
|
@ -63,14 +60,8 @@ public class AndDimFilter implements DimFilter
|
||||||
@Override
|
@Override
|
||||||
public DimFilter optimize()
|
public DimFilter optimize()
|
||||||
{
|
{
|
||||||
return Druids.newAndDimFilterBuilder().fields(Lists.transform(this.getFields(), new Function<DimFilter, DimFilter>()
|
List<DimFilter> elements = DimFilters.optimize(fields);
|
||||||
{
|
return elements.size() == 1 ? elements.get(0) : Druids.newAndDimFilterBuilder().fields(elements).build();
|
||||||
@Override
|
|
||||||
public DimFilter apply(DimFilter input)
|
|
||||||
{
|
|
||||||
return input.optimize();
|
|
||||||
}
|
|
||||||
})).build();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -20,6 +20,9 @@
|
||||||
package io.druid.query.filter;
|
package io.druid.query.filter;
|
||||||
|
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
|
import com.google.common.base.Predicates;
|
||||||
|
import com.google.common.collect.Collections2;
|
||||||
|
import com.google.common.collect.Iterables;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
@ -80,4 +83,25 @@ public class DimFilters
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static List<DimFilter> optimize(List<DimFilter> filters)
|
||||||
|
{
|
||||||
|
return filterNulls(
|
||||||
|
Lists.transform(
|
||||||
|
filters, new Function<DimFilter, DimFilter>()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public DimFilter apply(DimFilter input)
|
||||||
|
{
|
||||||
|
return input.optimize();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<DimFilter> filterNulls(List<DimFilter> optimized)
|
||||||
|
{
|
||||||
|
return Lists.newArrayList(Iterables.filter(optimized, Predicates.notNull()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,13 +21,10 @@ package io.druid.query.filter;
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonCreator;
|
import com.fasterxml.jackson.annotation.JsonCreator;
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
import com.google.common.base.Function;
|
|
||||||
import com.google.common.base.Joiner;
|
import com.google.common.base.Joiner;
|
||||||
import com.google.common.base.Preconditions;
|
import com.google.common.base.Preconditions;
|
||||||
import com.google.common.collect.Lists;
|
|
||||||
import io.druid.query.Druids;
|
import io.druid.query.Druids;
|
||||||
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -43,7 +40,7 @@ public class OrDimFilter implements DimFilter
|
||||||
@JsonProperty("fields") List<DimFilter> fields
|
@JsonProperty("fields") List<DimFilter> fields
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
fields.removeAll(Collections.singletonList(null));
|
fields = DimFilters.filterNulls(fields);
|
||||||
Preconditions.checkArgument(fields.size() > 0, "OR operator requires at least one field");
|
Preconditions.checkArgument(fields.size() > 0, "OR operator requires at least one field");
|
||||||
this.fields = fields;
|
this.fields = fields;
|
||||||
}
|
}
|
||||||
|
@ -63,14 +60,8 @@ public class OrDimFilter implements DimFilter
|
||||||
@Override
|
@Override
|
||||||
public DimFilter optimize()
|
public DimFilter optimize()
|
||||||
{
|
{
|
||||||
return Druids.newOrDimFilterBuilder().fields(Lists.transform(this.getFields(), new Function<DimFilter, DimFilter>()
|
List<DimFilter> elements = DimFilters.optimize(fields);
|
||||||
{
|
return elements.size() == 1 ? elements.get(0) : Druids.newOrDimFilterBuilder().fields(elements).build();
|
||||||
@Override
|
|
||||||
public DimFilter apply(DimFilter input)
|
|
||||||
{
|
|
||||||
return input.optimize();
|
|
||||||
}
|
|
||||||
})).build();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -33,4 +33,20 @@ public class SelectorDimFilterTest
|
||||||
SelectorDimFilter selectorDimFilter2 = new SelectorDimFilter("ab", "cd");
|
SelectorDimFilter selectorDimFilter2 = new SelectorDimFilter("ab", "cd");
|
||||||
Assert.assertFalse(Arrays.equals(selectorDimFilter.getCacheKey(), selectorDimFilter2.getCacheKey()));
|
Assert.assertFalse(Arrays.equals(selectorDimFilter.getCacheKey(), selectorDimFilter2.getCacheKey()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSimpleOptimize()
|
||||||
|
{
|
||||||
|
SelectorDimFilter selectorDimFilter = new SelectorDimFilter("abc", "d");
|
||||||
|
DimFilter filter = new AndDimFilter(
|
||||||
|
Arrays.<DimFilter>asList(
|
||||||
|
new OrDimFilter(
|
||||||
|
Arrays.<DimFilter>asList(
|
||||||
|
new AndDimFilter(Arrays.<DimFilter>asList(selectorDimFilter, null))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
Assert.assertEquals(selectorDimFilter, filter.optimize());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue