Moved the skip secondary index search hint closer to the predicates.
diff --git a/asterix-algebra/src/main/java/edu/uci/ics/asterix/algebra/base/AsterixOperatorAnnotations.java b/asterix-algebra/src/main/java/edu/uci/ics/asterix/algebra/base/AsterixOperatorAnnotations.java
index 3ed2783..68f231e 100644
--- a/asterix-algebra/src/main/java/edu/uci/ics/asterix/algebra/base/AsterixOperatorAnnotations.java
+++ b/asterix-algebra/src/main/java/edu/uci/ics/asterix/algebra/base/AsterixOperatorAnnotations.java
@@ -19,5 +19,4 @@
public static final String PUSHED_FIELD_ACCESS = "PUSHED_FIELD_ACCESS";
public static final String PUSHED_RUNNABLE_FIELD_ACCESS = "PUSHED_RUNNABLE_FIELD_ACCESS";
public static final String FIELD_TYPE = "FIELD_TYPE";
- public static final String SKIP_SECONDARY_INDEX_SEARCH_HINT = "SKIP_SECONDARY_INDEX_SEARCH_HINT";
-}
+}
\ No newline at end of file
diff --git a/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/am/BTreeAccessMethod.java b/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/am/BTreeAccessMethod.java
index 5bd9dfc..7a15c32 100644
--- a/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/am/BTreeAccessMethod.java
+++ b/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/am/BTreeAccessMethod.java
@@ -28,6 +28,7 @@
import org.apache.commons.lang3.mutable.MutableObject;
import edu.uci.ics.asterix.aql.util.FunctionUtils;
+import edu.uci.ics.asterix.common.annotations.SkipSecondaryIndexSearchExpressionAnnotation;
import edu.uci.ics.asterix.common.config.DatasetConfig.IndexType;
import edu.uci.ics.asterix.metadata.entities.Dataset;
import edu.uci.ics.asterix.metadata.entities.Index;
@@ -579,6 +580,11 @@
return false;
}
}
+ if (!index.isPrimaryIndex()
+ && optFuncExpr.getFuncExpr().getAnnotations()
+ .containsKey(SkipSecondaryIndexSearchExpressionAnnotation.INSTANCE)) {
+ return false;
+ }
// No additional analysis required for BTrees.
return true;
}
diff --git a/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/am/IntroduceSelectAccessMethodRule.java b/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/am/IntroduceSelectAccessMethodRule.java
index effbaff..47efeb0 100644
--- a/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/am/IntroduceSelectAccessMethodRule.java
+++ b/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/am/IntroduceSelectAccessMethodRule.java
@@ -20,7 +20,6 @@
import org.apache.commons.lang3.mutable.Mutable;
-import edu.uci.ics.asterix.algebra.base.AsterixOperatorAnnotations;
import edu.uci.ics.asterix.metadata.declared.AqlMetadataProvider;
import edu.uci.ics.asterix.metadata.entities.Index;
import edu.uci.ics.hyracks.algebricks.common.exceptions.AlgebricksException;
@@ -104,12 +103,7 @@
// Choose index to be applied.
Pair<IAccessMethod, Index> chosenIndex = chooseIndex(analyzedAMs);
- if (chosenIndex != null && chosenIndex.second.isPrimaryIndex()) {
- System.out.println();
- }
- if (chosenIndex == null
- || (select.getAnnotations().containsKey(AsterixOperatorAnnotations.SKIP_SECONDARY_INDEX_SEARCH_HINT) && !chosenIndex.second
- .isPrimaryIndex())) {
+ if (chosenIndex == null) {
context.addToDontApplySet(this, select);
return false;
}
@@ -137,7 +131,6 @@
// Set and analyze select.
selectRef = opRef;
select = (SelectOperator) op1;
-
// Check that the select's condition is a function call.
ILogicalExpression condExpr = select.getCondition().getValue();
if (condExpr.getExpressionTag() != LogicalExpressionTag.FUNCTION_CALL) {
@@ -157,4 +150,4 @@
select = null;
selectCond = null;
}
-}
+}
\ No newline at end of file
diff --git a/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/am/InvertedIndexAccessMethod.java b/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/am/InvertedIndexAccessMethod.java
index fb8becc..6636d07 100644
--- a/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/am/InvertedIndexAccessMethod.java
+++ b/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/am/InvertedIndexAccessMethod.java
@@ -25,6 +25,7 @@
import edu.uci.ics.asterix.algebra.base.LogicalOperatorDeepCopyVisitor;
import edu.uci.ics.asterix.aql.util.FunctionUtils;
+import edu.uci.ics.asterix.common.annotations.SkipSecondaryIndexSearchExpressionAnnotation;
import edu.uci.ics.asterix.common.config.DatasetConfig.IndexType;
import edu.uci.ics.asterix.formats.nontagged.AqlBinaryTokenizerFactoryProvider;
import edu.uci.ics.asterix.metadata.entities.Dataset;
@@ -766,6 +767,10 @@
@Override
public boolean exprIsOptimizable(Index index, IOptimizableFuncExpr optFuncExpr) {
+ if (optFuncExpr.getFuncExpr().getAnnotations()
+ .containsKey(SkipSecondaryIndexSearchExpressionAnnotation.INSTANCE)) {
+ return false;
+ }
if (optFuncExpr.getFuncExpr().getFunctionIdentifier() == AsterixBuiltinFunctions.EDIT_DISTANCE_CHECK) {
// Must be for a join query.
if (optFuncExpr.getNumConstantVals() == 1) {
diff --git a/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/am/RTreeAccessMethod.java b/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/am/RTreeAccessMethod.java
index b8125aa..c714aa9 100644
--- a/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/am/RTreeAccessMethod.java
+++ b/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/am/RTreeAccessMethod.java
@@ -21,6 +21,7 @@
import org.apache.commons.lang3.mutable.MutableObject;
import edu.uci.ics.asterix.aql.util.FunctionUtils;
+import edu.uci.ics.asterix.common.annotations.SkipSecondaryIndexSearchExpressionAnnotation;
import edu.uci.ics.asterix.common.config.DatasetConfig.IndexType;
import edu.uci.ics.asterix.metadata.entities.Dataset;
import edu.uci.ics.asterix.metadata.entities.Index;
@@ -204,6 +205,10 @@
@Override
public boolean exprIsOptimizable(Index index, IOptimizableFuncExpr optFuncExpr) {
+ if (optFuncExpr.getFuncExpr().getAnnotations()
+ .containsKey(SkipSecondaryIndexSearchExpressionAnnotation.INSTANCE)) {
+ return false;
+ }
// No additional analysis required.
return true;
}
diff --git a/asterix-algebra/src/main/java/edu/uci/ics/asterix/translator/AqlExpressionToPlanTranslator.java b/asterix-algebra/src/main/java/edu/uci/ics/asterix/translator/AqlExpressionToPlanTranslator.java
index 9ac5558..4e82d1c 100644
--- a/asterix-algebra/src/main/java/edu/uci/ics/asterix/translator/AqlExpressionToPlanTranslator.java
+++ b/asterix-algebra/src/main/java/edu/uci/ics/asterix/translator/AqlExpressionToPlanTranslator.java
@@ -23,7 +23,6 @@
import org.apache.commons.lang3.mutable.Mutable;
import org.apache.commons.lang3.mutable.MutableObject;
-import edu.uci.ics.asterix.algebra.base.AsterixOperatorAnnotations;
import edu.uci.ics.asterix.aql.base.Clause;
import edu.uci.ics.asterix.aql.base.Expression;
import edu.uci.ics.asterix.aql.base.Expression.Kind;
@@ -927,9 +926,6 @@
SelectOperator s = new SelectOperator(new MutableObject<ILogicalExpression>(p.first));
s.getInputs().add(p.second);
- if (w.hasSkipSecondaryIndexSearchHint()) {
- s.getAnnotations().put(AsterixOperatorAnnotations.SKIP_SECONDARY_INDEX_SEARCH_HINT, true);
- }
return new Pair<ILogicalOperator, LogicalVariable>(s, null);
}
@@ -1463,4 +1459,4 @@
// TODO Auto-generated method stub
return null;
}
-}
+}
\ No newline at end of file
diff --git a/asterix-algebra/src/main/java/edu/uci/ics/asterix/translator/CompiledStatements.java b/asterix-algebra/src/main/java/edu/uci/ics/asterix/translator/CompiledStatements.java
index edd0d9b..e403cce 100644
--- a/asterix-algebra/src/main/java/edu/uci/ics/asterix/translator/CompiledStatements.java
+++ b/asterix-algebra/src/main/java/edu/uci/ics/asterix/translator/CompiledStatements.java
@@ -423,17 +423,15 @@
private Expression condition;
private int varCounter;
private AqlMetadataProvider metadataProvider;
- private final boolean skipSecondaryIndexSearchHint;
public CompiledDeleteStatement(VariableExpr var, String dataverseName, String datasetName,
- Expression condition, int varCounter, boolean skipSecondaryIndexSearchHint, AqlMetadataProvider metadataProvider) {
+ Expression condition, int varCounter, AqlMetadataProvider metadataProvider) {
this.var = var;
this.dataverseName = dataverseName;
this.datasetName = datasetName;
this.condition = condition;
this.varCounter = varCounter;
this.metadataProvider = metadataProvider;
- this.skipSecondaryIndexSearchHint = skipSecondaryIndexSearchHint;
}
@Override
@@ -453,10 +451,6 @@
public Expression getCondition() {
return condition;
}
-
- public boolean hasSkipSecondaryIndexSearchHint() {
- return skipSecondaryIndexSearchHint;
- }
public Query getQuery() throws AlgebricksException {
@@ -472,7 +466,7 @@
clauseList.add(forClause);
Clause whereClause = null;
if (condition != null) {
- whereClause = new WhereClause(condition, skipSecondaryIndexSearchHint);
+ whereClause = new WhereClause(condition);
clauseList.add(whereClause);
}
@@ -562,4 +556,4 @@
}
}
-}
+}
\ No newline at end of file
diff --git a/asterix-app/src/main/java/edu/uci/ics/asterix/aql/translator/AqlTranslator.java b/asterix-app/src/main/java/edu/uci/ics/asterix/aql/translator/AqlTranslator.java
index 25395e5..8fb0baa 100644
--- a/asterix-app/src/main/java/edu/uci/ics/asterix/aql/translator/AqlTranslator.java
+++ b/asterix-app/src/main/java/edu/uci/ics/asterix/aql/translator/AqlTranslator.java
@@ -1395,7 +1395,7 @@
String dataverseName = getActiveDataverseName(stmtDelete.getDataverseName());
CompiledDeleteStatement clfrqs = new CompiledDeleteStatement(stmtDelete.getVariableExpr(), dataverseName,
stmtDelete.getDatasetName().getValue(), stmtDelete.getCondition(), stmtDelete.getVarCounter(),
- stmtDelete.hasSkipSecondaryIndexSearchHint(), metadataProvider);
+ metadataProvider);
JobSpecification compiled = rewriteCompileQuery(metadataProvider, clfrqs.getQuery(), clfrqs);
MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
@@ -1892,4 +1892,4 @@
throw new IllegalStateException(rootE);
}
}
-}
+}
\ No newline at end of file
diff --git a/asterix-app/src/test/resources/optimizerts/queries/skip-index/dont-skip-primary-index-search-in-delete.aql b/asterix-app/src/test/resources/optimizerts/queries/skip-index/dont-skip-primary-index-search-in-delete.aql
index 6d8435ef..1c6f069 100644
--- a/asterix-app/src/test/resources/optimizerts/queries/skip-index/dont-skip-primary-index-search-in-delete.aql
+++ b/asterix-app/src/test/resources/optimizerts/queries/skip-index/dont-skip-primary-index-search-in-delete.aql
@@ -27,5 +27,5 @@
create dataset Customers(CustomerType) primary key cid;
-delete $c from dataset Customers /*+ skip-index */ where $c.cid < 10;
+delete $c from dataset Customers where $c.cid /*+ skip-index */ < 10;
diff --git a/asterix-app/src/test/resources/optimizerts/queries/skip-index/dont-skip-primary-index.aql b/asterix-app/src/test/resources/optimizerts/queries/skip-index/dont-skip-primary-index.aql
index 114784e..77f9e8e 100644
--- a/asterix-app/src/test/resources/optimizerts/queries/skip-index/dont-skip-primary-index.aql
+++ b/asterix-app/src/test/resources/optimizerts/queries/skip-index/dont-skip-primary-index.aql
@@ -19,6 +19,5 @@
create dataset testdst(TestType) primary key fname,lname;
for $emp in dataset('testdst')
-/*+ skip-index */
-where $emp.fname >= "Craig" and $emp.lname >= "Kevin" and $emp.fname <= "Mary" and $emp.lname <= "Tomes"
+where $emp.fname /*+ skip-index */ >= "Craig" and $emp.lname /*+ skip-index */ >= "Kevin" and $emp.fname /*+ skip-index */ <= "Mary" and $emp.lname /*+ skip-index */ <= "Tomes"
return $emp
diff --git a/asterix-app/src/test/resources/optimizerts/queries/skip-index/skip-ngram-index-search-in-delete.aql b/asterix-app/src/test/resources/optimizerts/queries/skip-index/skip-ngram-index-search-in-delete.aql
index de3b154..b8fc5ab 100644
--- a/asterix-app/src/test/resources/optimizerts/queries/skip-index/skip-ngram-index-search-in-delete.aql
+++ b/asterix-app/src/test/resources/optimizerts/queries/skip-index/skip-ngram-index-search-in-delete.aql
@@ -21,4 +21,4 @@
create index ngram_index on DBLP(title) type ngram(3);
-delete $o from dataset DBLP /*+ skip-index */ where contains($o.title, "Multimedia")
\ No newline at end of file
+delete $o from dataset DBLP where /*+ skip-index */ contains($o.title, "Multimedia")
\ No newline at end of file
diff --git a/asterix-app/src/test/resources/optimizerts/queries/skip-index/skip-ngram-index.aql b/asterix-app/src/test/resources/optimizerts/queries/skip-index/skip-ngram-index.aql
index 8b80497..1ae5fe9 100644
--- a/asterix-app/src/test/resources/optimizerts/queries/skip-index/skip-ngram-index.aql
+++ b/asterix-app/src/test/resources/optimizerts/queries/skip-index/skip-ngram-index.aql
@@ -23,7 +23,6 @@
write output to nc1:"rttest/inverted-index-basic_ngram-contains.adm";
for $o in dataset('DBLP')
-/*+ skip-index */
-where contains($o.title, "Multimedia")
+where /*+ skip-index */ contains($o.title, "Multimedia")
order by $o.id
return $o
\ No newline at end of file
diff --git a/asterix-app/src/test/resources/optimizerts/queries/skip-index/skip-rtree-index-search-in-delete.aql b/asterix-app/src/test/resources/optimizerts/queries/skip-index/skip-rtree-index-search-in-delete.aql
index 1c6b312..3403ef1 100644
--- a/asterix-app/src/test/resources/optimizerts/queries/skip-index/skip-rtree-index-search-in-delete.aql
+++ b/asterix-app/src/test/resources/optimizerts/queries/skip-index/skip-rtree-index-search-in-delete.aql
@@ -26,4 +26,4 @@
create index rtree_index_point on MyData(point) type rtree;
-delete $m from dataset MyData /*+ skip-index */ where spatial-intersect($m.point, create-polygon([0.0,1.0,0.0,4.0,12.0,4.0,12.0,1.0]));
+delete $m from dataset MyData where /*+ skip-index */ spatial-intersect($m.point, create-polygon([0.0,1.0,0.0,4.0,12.0,4.0,12.0,1.0]));
diff --git a/asterix-app/src/test/resources/optimizerts/queries/skip-index/skip-rtree-secondary-index.aql b/asterix-app/src/test/resources/optimizerts/queries/skip-index/skip-rtree-secondary-index.aql
index 55e78fc..52fb83d 100644
--- a/asterix-app/src/test/resources/optimizerts/queries/skip-index/skip-rtree-secondary-index.aql
+++ b/asterix-app/src/test/resources/optimizerts/queries/skip-index/skip-rtree-secondary-index.aql
@@ -35,6 +35,5 @@
write output to nc1:"rttest/index_rtree-secondary-index.adm";
for $o in dataset('MyData')
-/*+ skip-index */
-where spatial-intersect($o.point, create-polygon([4.0,1.0,4.0,4.0,12.0,4.0,12.0,1.0]))
+where /*+ skip-index */ spatial-intersect($o.point, create-polygon([4.0,1.0,4.0,4.0,12.0,4.0,12.0,1.0]))
return {"id":$o.id}
diff --git a/asterix-app/src/test/resources/optimizerts/queries/skip-index/skip-secondary-btree-index-search-in-delete.aql b/asterix-app/src/test/resources/optimizerts/queries/skip-index/skip-secondary-btree-index-search-in-delete.aql
index aee356f..a0096ff 100644
--- a/asterix-app/src/test/resources/optimizerts/queries/skip-index/skip-secondary-btree-index-search-in-delete.aql
+++ b/asterix-app/src/test/resources/optimizerts/queries/skip-index/skip-secondary-btree-index-search-in-delete.aql
@@ -28,5 +28,5 @@
create index age_index on Customers(age);
-delete $c from dataset Customers /*+ skip-index */ where $c.age < 20;
+delete $c from dataset Customers where $c.age /*+ skip-index */ < 20;
diff --git a/asterix-app/src/test/resources/optimizerts/queries/skip-index/skip-secondary-btree-index.aql b/asterix-app/src/test/resources/optimizerts/queries/skip-index/skip-secondary-btree-index.aql
index 32a6b06..abf77c6 100644
--- a/asterix-app/src/test/resources/optimizerts/queries/skip-index/skip-secondary-btree-index.aql
+++ b/asterix-app/src/test/resources/optimizerts/queries/skip-index/skip-secondary-btree-index.aql
@@ -21,6 +21,5 @@
create index sec_Idx on testdst(fname);
for $emp in dataset('testdst')
-/*+ skip-index */
-where $emp.fname >= "Max" and $emp.fname <= "Roger"
+where $emp.fname /*+ skip-index */ >= "Max" and $emp.fname /*+ skip-index */ <= "Roger"
return $emp
diff --git a/asterix-app/src/test/resources/optimizerts/queries/skip-index/skip-word-index-search-in-delete.aql b/asterix-app/src/test/resources/optimizerts/queries/skip-index/skip-word-index-search-in-delete.aql
index a7620c9..53010a0 100644
--- a/asterix-app/src/test/resources/optimizerts/queries/skip-index/skip-word-index-search-in-delete.aql
+++ b/asterix-app/src/test/resources/optimizerts/queries/skip-index/skip-word-index-search-in-delete.aql
@@ -22,4 +22,4 @@
create index keyword_index on DBLP(title) type keyword;
-delete $o from dataset DBLP /*+ skip-index */ where similarity-jaccard(word-tokens($o.title), word-tokens("Transactions for Cooperative Environments")) >= 0.5f
\ No newline at end of file
+delete $o from dataset DBLP where /*+ skip-index */ similarity-jaccard(word-tokens($o.title), word-tokens("Transactions for Cooperative Environments")) >= 0.5f
\ No newline at end of file
diff --git a/asterix-app/src/test/resources/optimizerts/queries/skip-index/skip-word-index.aql b/asterix-app/src/test/resources/optimizerts/queries/skip-index/skip-word-index.aql
index 2c95104..a9cdfbb 100644
--- a/asterix-app/src/test/resources/optimizerts/queries/skip-index/skip-word-index.aql
+++ b/asterix-app/src/test/resources/optimizerts/queries/skip-index/skip-word-index.aql
@@ -24,6 +24,6 @@
write output to nc1:"rttest/inverted-index-basic_word-jaccard.adm";
for $o in dataset('DBLP')
-/*+ skip-index */
-where similarity-jaccard(word-tokens($o.title), word-tokens("Transactions for Cooperative Environments")) >= 0.5f
+let $jacc := /*+ skip-index */ similarity-jaccard(word-tokens($o.title), word-tokens("Transactions for Cooperative Environments"))
+where $jacc >= 0.5f
return $o
diff --git a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/DeleteStatement.java b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/DeleteStatement.java
index 6698d16..ded6946 100644
--- a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/DeleteStatement.java
+++ b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/DeleteStatement.java
@@ -27,16 +27,14 @@
private Identifier datasetName;
private Expression condition;
private int varCounter;
- private final boolean skipSecondaryIndexSearchHint;
public DeleteStatement(VariableExpr vars, Identifier dataverseName, Identifier datasetName, Expression condition,
- int varCounter, boolean skipSecondaryIndexSearchHint) {
+ int varCounter) {
this.vars = vars;
this.dataverseName = dataverseName;
this.datasetName = datasetName;
this.condition = condition;
this.varCounter = varCounter;
- this.skipSecondaryIndexSearchHint = skipSecondaryIndexSearchHint;
}
@Override
@@ -63,10 +61,6 @@
public int getVarCounter() {
return varCounter;
}
-
- public boolean hasSkipSecondaryIndexSearchHint() {
- return skipSecondaryIndexSearchHint;
- }
@Override
public <R, T> R accept(IAqlExpressionVisitor<R, T> visitor, T arg) throws AsterixException {
@@ -78,4 +72,4 @@
visitor.visit(this, arg);
}
-}
+}
\ No newline at end of file
diff --git a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/WhereClause.java b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/WhereClause.java
index f136f34..3782624 100644
--- a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/WhereClause.java
+++ b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/WhereClause.java
@@ -22,7 +22,6 @@
public class WhereClause implements Clause {
private Expression whereExpr;
- private boolean skipSecondaryIndexSearchHint;
public Expression getWhereExpr() {
return whereExpr;
@@ -32,10 +31,9 @@
this.whereExpr = whereExpr;
}
- public WhereClause(Expression whereExpr, boolean skipSecondaryIndexSearchHint) {
+ public WhereClause(Expression whereExpr) {
super();
this.whereExpr = whereExpr;
- this.skipSecondaryIndexSearchHint = skipSecondaryIndexSearchHint;
}
public WhereClause() {
@@ -56,11 +54,4 @@
visitor.visit(this, arg);
}
- public void setSkipSecondaryIndexSearchHint(boolean skipSecondaryIndexSearchHint) {
- this.skipSecondaryIndexSearchHint = skipSecondaryIndexSearchHint;
- }
-
- public boolean hasSkipSecondaryIndexSearchHint() {
- return skipSecondaryIndexSearchHint;
- }
-}
+}
\ No newline at end of file
diff --git a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/rewrites/CloneAndSubstituteVariablesVisitor.java b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/rewrites/CloneAndSubstituteVariablesVisitor.java
index ab5905c..30a0ebb 100644
--- a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/rewrites/CloneAndSubstituteVariablesVisitor.java
+++ b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/rewrites/CloneAndSubstituteVariablesVisitor.java
@@ -214,7 +214,7 @@
public Pair<IAqlExpression, List<VariableSubstitution>> visitWhereClause(WhereClause wc,
List<VariableSubstitution> arg) throws AsterixException {
Pair<IAqlExpression, List<VariableSubstitution>> p1 = wc.getWhereExpr().accept(this, arg);
- WhereClause newW = new WhereClause((Expression) p1.first, wc.hasSkipSecondaryIndexSearchHint());
+ WhereClause newW = new WhereClause((Expression) p1.first);
return new Pair<IAqlExpression, List<VariableSubstitution>>(newW, p1.second);
}
@@ -606,4 +606,4 @@
// TODO Auto-generated method stub
return null;
}
-}
+}
\ No newline at end of file
diff --git a/asterix-aql/src/main/javacc/AQL.jj b/asterix-aql/src/main/javacc/AQL.jj
index 35f39f0..1044d2e 100644
--- a/asterix-aql/src/main/javacc/AQL.jj
+++ b/asterix-aql/src/main/javacc/AQL.jj
@@ -696,24 +696,17 @@
VariableExpr var = null;
Expression condition = null;
Pair<Identifier, Identifier> nameComponents;
- boolean skipSecondaryIndexSearchHint = false;
- Clause c = null;
}
{
"delete" var = Variable()
{
getCurrentScope().addNewVarSymbolToScope(var.getVar());
}
- "from" <DATASET> nameComponents = QualifiedName()
- (c = WhereClause())?
- {
- if (c != null) {
- WhereClause wc = (WhereClause) c;
- condition = wc.getWhereExpr();
- skipSecondaryIndexSearchHint = wc.hasSkipSecondaryIndexSearchHint();
+ "from" <DATASET> nameComponents = QualifiedName()
+ (<WHERE> condition = Expression())?
+ {
+ return new DeleteStatement(var, nameComponents.first, nameComponents.second, condition, getVarCounter());
}
- return new DeleteStatement(var, nameComponents.first, nameComponents.second, condition, getVarCounter(), skipSecondaryIndexSearchHint);
- }
}
UpdateStatement UpdateStatement() throws ParseException:
@@ -1328,8 +1321,12 @@
LOOKAHEAD(2)( <LT> | <GT> | <LE> | <GE> | <EQ> | <NE> |<SIMILAR>)
{
String mhint = getHint(token);
- if (mhint != null && mhint.equals(INDEXED_NESTED_LOOP_JOIN_HINT)) {
- annotation = IndexedNLJoinExpressionAnnotation.INSTANCE;
+ if (mhint != null) {
+ if (mhint.equals(INDEXED_NESTED_LOOP_JOIN_HINT)) {
+ annotation = IndexedNLJoinExpressionAnnotation.INSTANCE;
+ } else if (mhint.equals(SKIP_SECONDARY_INDEX_SEARCH_HINT)) {
+ annotation = SkipSecondaryIndexSearchExpressionAnnotation.INSTANCE;
+ }
}
if (op == null) {
op = new OperatorExpr();
@@ -1780,8 +1777,12 @@
signature = new FunctionSignature(funcName.dataverse, fqFunctionName, arity);
}
callExpr = new CallExpr(signature,argList);
- if (hint != null && hint.startsWith(INDEXED_NESTED_LOOP_JOIN_HINT)) {
- callExpr.addHint(IndexedNLJoinExpressionAnnotation.INSTANCE);
+ if (hint != null) {
+ if (hint.startsWith(INDEXED_NESTED_LOOP_JOIN_HINT)) {
+ callExpr.addHint(IndexedNLJoinExpressionAnnotation.INSTANCE);
+ } else if (hint.startsWith(SKIP_SECONDARY_INDEX_SEARCH_HINT)) {
+ callExpr.addHint(SkipSecondaryIndexSearchExpressionAnnotation.INSTANCE);
+ }
}
return callExpr;
}
@@ -1933,14 +1934,7 @@
Expression whereExpr;
}
{
- <WHERE>
- {
- String hint = getHint(token);
- if (hint != null && hint.equals(SKIP_SECONDARY_INDEX_SEARCH_HINT)) {
- wc.setSkipSecondaryIndexSearchHint(true);
- }
- }
- whereExpr = Expression()
+ <WHERE> whereExpr = Expression()
{
wc.setWhereExpr(whereExpr);
return wc;
diff --git a/asterix-common/src/main/java/edu/uci/ics/asterix/common/annotations/SkipSecondaryIndexSearchExpressionAnnotation.java b/asterix-common/src/main/java/edu/uci/ics/asterix/common/annotations/SkipSecondaryIndexSearchExpressionAnnotation.java
new file mode 100644
index 0000000..46190e7
--- /dev/null
+++ b/asterix-common/src/main/java/edu/uci/ics/asterix/common/annotations/SkipSecondaryIndexSearchExpressionAnnotation.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2009-2013 by The Regents of the University of California
+ * Licensed 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 from
+ *
+ * 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 edu.uci.ics.asterix.common.annotations;
+
+import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.IExpressionAnnotation;
+
+public class SkipSecondaryIndexSearchExpressionAnnotation implements IExpressionAnnotation {
+
+ public static final String SKIP_SECONDARY_INDEX_SEARCH_ANNOTATION_KEY = "skip-index";
+ public static final SkipSecondaryIndexSearchExpressionAnnotation INSTANCE = new SkipSecondaryIndexSearchExpressionAnnotation();
+
+ private Object object;
+
+ @Override
+ public Object getObject() {
+ return object;
+ }
+
+ @Override
+ public void setObject(Object object) {
+ this.object = object;
+ }
+
+ @Override
+ public IExpressionAnnotation copy() {
+ SkipSecondaryIndexSearchExpressionAnnotation clone = new SkipSecondaryIndexSearchExpressionAnnotation();
+ clone.setObject(object);
+ return clone;
+ }
+}