-
Notifications
You must be signed in to change notification settings - Fork 3.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add native filters for "(filter) is true" and "(filter) is false" (#1…
…5182) * add native filters for "(filter) is true" and "(filter) is false" changes: * add IsTrueDimFilter, IsFalseDimFilter, and abstract IsBooleanDimFilter for native json filter implementations of `(filter) IS TRUE` and `(filter) IS FALSE` * add IsBooleanFilter for actual filtering logic for these filters, which ignore includeUnknown to always use matches with false for true and !matches with true for false * fix test incorrectly adjusted to wrong answer in #15058 * add tests for default value mode
- Loading branch information
1 parent
c58b7f4
commit 061cfee
Showing
17 changed files
with
763 additions
and
29 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
120 changes: 120 additions & 0 deletions
120
processing/src/main/java/org/apache/druid/query/filter/IsBooleanDimFilter.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,120 @@ | ||
/* | ||
* Licensed to the Apache Software Foundation (ASF) under one | ||
* or more contributor license agreements. See the NOTICE file | ||
* distributed with this work for additional information | ||
* regarding copyright ownership. The ASF licenses this file | ||
* to you under the Apache License, Version 2.0 (the | ||
* "License"); you may not use this file except in compliance | ||
* with the License. You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, | ||
* software distributed under the License is distributed on an | ||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
* KIND, either express or implied. See the License for the | ||
* specific language governing permissions and limitations | ||
* under the License. | ||
*/ | ||
|
||
package org.apache.druid.query.filter; | ||
|
||
import com.fasterxml.jackson.annotation.JsonProperty; | ||
import com.google.common.collect.RangeSet; | ||
import org.apache.druid.error.DruidException; | ||
import org.apache.druid.query.cache.CacheKeyBuilder; | ||
import org.apache.druid.segment.filter.IsBooleanFilter; | ||
|
||
import java.util.Objects; | ||
import java.util.Set; | ||
|
||
/** | ||
* Abstract SQL three-value logic wrapper for some child {@link DimFilter} to implement '{filter} IS TRUE' and | ||
* '{filter} IS FALSE'. | ||
* | ||
* @see IsTrueDimFilter - IS TRUE | ||
* @see IsFalseDimFilter - IS FALSE | ||
* @see IsBooleanFilter - actual filtering logic | ||
*/ | ||
public abstract class IsBooleanDimFilter extends AbstractOptimizableDimFilter | ||
{ | ||
private final DimFilter field; | ||
private final boolean isTrue; | ||
|
||
public IsBooleanDimFilter( | ||
DimFilter field, | ||
boolean isTrue | ||
) | ||
{ | ||
if (field == null) { | ||
throw DruidException.forPersona(DruidException.Persona.USER) | ||
.ofCategory(DruidException.Category.INVALID_INPUT) | ||
.build("IS %s operator requires a non-null filter for field", isTrue ? "TRUE" : "FALSE"); | ||
} | ||
this.field = field; | ||
this.isTrue = isTrue; | ||
} | ||
|
||
@JsonProperty("field") | ||
public DimFilter getField() | ||
{ | ||
return field; | ||
} | ||
|
||
@Override | ||
public byte[] getCacheKey() | ||
{ | ||
return new CacheKeyBuilder(DimFilterUtils.IS_FILTER_BOOLEAN_FILTER_CACHE_ID).appendBoolean(isTrue) | ||
.appendCacheable(field) | ||
.build(); | ||
} | ||
|
||
@Override | ||
public Filter toFilter() | ||
{ | ||
return new IsBooleanFilter(field.toFilter(), isTrue); | ||
} | ||
|
||
@Override | ||
public RangeSet<String> getDimensionRangeSet(String dimension) | ||
{ | ||
return null; | ||
} | ||
|
||
@Override | ||
public Set<String> getRequiredColumns() | ||
{ | ||
return field.getRequiredColumns(); | ||
} | ||
|
||
@Override | ||
public boolean equals(Object o) | ||
{ | ||
if (this == o) { | ||
return true; | ||
} | ||
if (o == null || getClass() != o.getClass()) { | ||
return false; | ||
} | ||
|
||
IsBooleanDimFilter that = (IsBooleanDimFilter) o; | ||
|
||
if (field != null ? !field.equals(that.field) : that.field != null) { | ||
return false; | ||
} | ||
|
||
return isTrue == that.isTrue; | ||
} | ||
|
||
@Override | ||
public int hashCode() | ||
{ | ||
return Objects.hash(field, isTrue); | ||
} | ||
|
||
@Override | ||
public String toString() | ||
{ | ||
return "(" + field + ") IS " + (isTrue ? "TRUE" : "FALSE"); | ||
} | ||
} |
45 changes: 45 additions & 0 deletions
45
processing/src/main/java/org/apache/druid/query/filter/IsFalseDimFilter.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
/* | ||
* Licensed to the Apache Software Foundation (ASF) under one | ||
* or more contributor license agreements. See the NOTICE file | ||
* distributed with this work for additional information | ||
* regarding copyright ownership. The ASF licenses this file | ||
* to you under the Apache License, Version 2.0 (the | ||
* "License"); you may not use this file except in compliance | ||
* with the License. You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, | ||
* software distributed under the License is distributed on an | ||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
* KIND, either express or implied. See the License for the | ||
* specific language governing permissions and limitations | ||
* under the License. | ||
*/ | ||
|
||
package org.apache.druid.query.filter; | ||
|
||
import com.fasterxml.jackson.annotation.JsonCreator; | ||
import com.fasterxml.jackson.annotation.JsonProperty; | ||
|
||
public class IsFalseDimFilter extends IsBooleanDimFilter | ||
{ | ||
public static IsFalseDimFilter of(DimFilter field) | ||
{ | ||
return new IsFalseDimFilter(field); | ||
} | ||
|
||
@JsonCreator | ||
public IsFalseDimFilter( | ||
@JsonProperty("field") DimFilter field | ||
) | ||
{ | ||
super(field, false); | ||
} | ||
|
||
@Override | ||
public DimFilter optimize() | ||
{ | ||
return new IsFalseDimFilter(getField().optimize()); | ||
} | ||
} |
45 changes: 45 additions & 0 deletions
45
processing/src/main/java/org/apache/druid/query/filter/IsTrueDimFilter.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
/* | ||
* Licensed to the Apache Software Foundation (ASF) under one | ||
* or more contributor license agreements. See the NOTICE file | ||
* distributed with this work for additional information | ||
* regarding copyright ownership. The ASF licenses this file | ||
* to you under the Apache License, Version 2.0 (the | ||
* "License"); you may not use this file except in compliance | ||
* with the License. You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, | ||
* software distributed under the License is distributed on an | ||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
* KIND, either express or implied. See the License for the | ||
* specific language governing permissions and limitations | ||
* under the License. | ||
*/ | ||
|
||
package org.apache.druid.query.filter; | ||
|
||
import com.fasterxml.jackson.annotation.JsonCreator; | ||
import com.fasterxml.jackson.annotation.JsonProperty; | ||
|
||
public class IsTrueDimFilter extends IsBooleanDimFilter | ||
{ | ||
public static IsTrueDimFilter of(DimFilter field) | ||
{ | ||
return new IsTrueDimFilter(field); | ||
} | ||
|
||
@JsonCreator | ||
public IsTrueDimFilter( | ||
@JsonProperty("field") DimFilter field | ||
) | ||
{ | ||
super(field, true); | ||
} | ||
|
||
@Override | ||
public DimFilter optimize() | ||
{ | ||
return new IsTrueDimFilter(getField().optimize()); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.