-
Notifications
You must be signed in to change notification settings - Fork 147
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Calcite Engine] Push down project and filter operator into index scan (
#3327) * Support Filter and Project pushdown Signed-off-by: Heng Qian <qianheng@amazon.com> * Support Filter and Project pushdown v2 Signed-off-by: Heng Qian <qianheng@amazon.com> * Address comments Signed-off-by: Heng Qian <qianheng@amazon.com> * Add original license for PredicateAnalyzer Signed-off-by: Heng Qian <qianheng@amazon.com> --------- Signed-off-by: Heng Qian <qianheng@amazon.com>
- Loading branch information
1 parent
e7188da
commit cb103d7
Showing
14 changed files
with
1,501 additions
and
104 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
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
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
71 changes: 71 additions & 0 deletions
71
...in/java/org/opensearch/sql/opensearch/planner/physical/OpenSearchFilterIndexScanRule.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,71 @@ | ||
/* | ||
* Copyright OpenSearch Contributors | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
package org.opensearch.sql.opensearch.planner.physical; | ||
|
||
import org.apache.calcite.plan.RelOptRuleCall; | ||
import org.apache.calcite.plan.RelOptTable; | ||
import org.apache.calcite.plan.RelRule; | ||
import org.apache.calcite.rel.core.Filter; | ||
import org.immutables.value.Value; | ||
import org.opensearch.sql.opensearch.storage.OpenSearchIndex; | ||
import org.opensearch.sql.opensearch.storage.scan.CalciteOpenSearchIndexScan; | ||
|
||
/** Planner rule that push a {@link Filter} down to {@link CalciteOpenSearchIndexScan} */ | ||
@Value.Enclosing | ||
public class OpenSearchFilterIndexScanRule extends RelRule<OpenSearchFilterIndexScanRule.Config> { | ||
|
||
/** Creates a OpenSearchFilterIndexScanRule. */ | ||
protected OpenSearchFilterIndexScanRule(Config config) { | ||
super(config); | ||
} | ||
|
||
protected static boolean test(CalciteOpenSearchIndexScan scan) { | ||
final RelOptTable table = scan.getTable(); | ||
return table.unwrap(OpenSearchIndex.class) != null; | ||
} | ||
|
||
@Override | ||
public void onMatch(RelOptRuleCall call) { | ||
if (call.rels.length == 2) { | ||
// the ordinary variant | ||
final Filter filter = call.rel(0); | ||
final CalciteOpenSearchIndexScan scan = call.rel(1); | ||
apply(call, filter, scan); | ||
} else { | ||
throw new AssertionError( | ||
String.format( | ||
"The length of rels should be %s but got %s", | ||
this.operands.size(), call.rels.length)); | ||
} | ||
} | ||
|
||
protected void apply(RelOptRuleCall call, Filter filter, CalciteOpenSearchIndexScan scan) { | ||
if (scan.pushDownFilter(filter)) { | ||
call.transformTo(scan); | ||
} | ||
} | ||
|
||
/** Rule configuration. */ | ||
@Value.Immutable | ||
public interface Config extends RelRule.Config { | ||
/** Config that matches Filter on CalciteOpenSearchIndexScan. */ | ||
Config DEFAULT = | ||
ImmutableOpenSearchFilterIndexScanRule.Config.builder() | ||
.build() | ||
.withOperandSupplier( | ||
b0 -> | ||
b0.operand(Filter.class) | ||
.oneInput( | ||
b1 -> | ||
b1.operand(CalciteOpenSearchIndexScan.class) | ||
.predicate(OpenSearchFilterIndexScanRule::test) | ||
.noInputs())); | ||
|
||
@Override | ||
default OpenSearchFilterIndexScanRule toRule() { | ||
return new OpenSearchFilterIndexScanRule(this); | ||
} | ||
} | ||
} |
23 changes: 23 additions & 0 deletions
23
...ch/src/main/java/org/opensearch/sql/opensearch/planner/physical/OpenSearchIndexRules.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,23 @@ | ||
/* | ||
* Copyright OpenSearch Contributors | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
package org.opensearch.sql.opensearch.planner.physical; | ||
|
||
import com.google.common.collect.ImmutableList; | ||
import java.util.List; | ||
import org.apache.calcite.plan.RelOptRule; | ||
|
||
public class OpenSearchIndexRules { | ||
private static final OpenSearchProjectIndexScanRule PROJECT_INDEX_SCAN = | ||
OpenSearchProjectIndexScanRule.Config.DEFAULT.toRule(); | ||
private static final OpenSearchFilterIndexScanRule FILTER_INDEX_SCAN = | ||
OpenSearchFilterIndexScanRule.Config.DEFAULT.toRule(); | ||
|
||
public static final List<RelOptRule> OPEN_SEARCH_INDEX_SCAN_RULES = | ||
ImmutableList.of(PROJECT_INDEX_SCAN, FILTER_INDEX_SCAN); | ||
|
||
// prevent instantiation | ||
private OpenSearchIndexRules() {} | ||
} |
Oops, something went wrong.