Taewoo Kim has posted comments on this change.

Change subject: [ASTERIXDB-1972][COMP][RT][TX] index-only plan
......................................................................


Patch Set 13:

(104 comments)

https://asterix-gerrit.ics.uci.edu/#/c/1866/1/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AbstractIntroduceAccessMethodRule.java
File 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AbstractIntroduceAccessMethodRule.java:

Line 883:                         return getFieldNameFromSubTree(optFuncExpr, 
subTree, assignOrUnnestIndex, varIndex, recordType,
> MAJOR SonarQube violation:
Done


Line 1047:             }
> BLOCKER SonarQube violation:
Done


https://asterix-gerrit.ics.uci.edu/#/c/1866/1/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java
File 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java:

Line 425:                 return Collections.emptyList();
> MAJOR SonarQube violation:
Done


Line 483:             IOptimizableFuncExpr optFuncExpr, IAType 
indexedFieldType, OptimizableOperatorSubTree probeSubTree)
> MAJOR SonarQube violation:
Done


Line 578:                                 break;
> MAJOR SonarQube violation:
Done


Line 984:                 varAlreadyAdded = findVarInTripleVarList(unionVarMap, 
tVar, true);
> MAJOR SonarQube violation:
Done


Line 1859: 
> MAJOR SonarQube violation:
Done


Line 2313:         // First, check whether the given old variable can be 
deleted. If it is used somewhere else
> MAJOR SonarQube violation:
Done


https://asterix-gerrit.ics.uci.edu/#/c/1866/4/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java
File 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java:

Line 1606: 
> MAJOR SonarQube violation:
Done


https://asterix-gerrit.ics.uci.edu/#/c/1866/13/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java
File 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java:

Line 582:                     default:
> MAJOR SonarQube violation:
Done


Line 582:                     default:
> MAJOR SonarQube violation:
Done


Line 595:                         } catch (HyracksDataException e) {
> CRITICAL SonarQube violation:
Done


Line 595:                         } catch (HyracksDataException e) {
> CRITICAL SonarQube violation:
Done


Line 595:                         } catch (HyracksDataException e) {
> fix this?
Done


Line 608:                         } catch (HyracksDataException e) {
> CRITICAL SonarQube violation:
Done


Line 608:                         } catch (HyracksDataException e) {
> Fix this?
Done


Line 608:                         } catch (HyracksDataException e) {
> CRITICAL SonarQube violation:
Done


PS13, Line 750:  // Are we transforming a join plan?
> considering keeping the old method and create a new one for index only?
Done


PS13, Line 752: topOpRef.getValue().getOperatorTag() != 
LogicalOperatorTag.SELECT
> is there any chance to make the code agnostic to SELECT?
Done.


Line 857:                 case RECTANGLE:
> MAJOR SonarQube violation:
Done


Line 857:                 case RECTANGLE:
> MAJOR SonarQube violation:
Done


PS13, Line 939: // If there are ASSIGN operators before the given SELECT or 
JOIN operator, we need to propagate
              :             // these variables to the UNIONALL operator, too.
> update the comment to be based on variable usage/liveness.
Done


Line 947:                         for (int j = 0; j < 
usedVarsInAssignUnnestBeforeTopOpTmp.size(); j++) {
> MAJOR SonarQube violation:
Done


Line 947:                         for (int j = 0; j < 
usedVarsInAssignUnnestBeforeTopOpTmp.size(); j++) {
> MAJOR SonarQube violation:
Done


Line 967:                         if (!usedVarsAfterTopOp.contains(tmpVar)) {
> MAJOR SonarQube violation:
Done


Line 967:                         if (!usedVarsAfterTopOp.contains(tmpVar)) {
> MAJOR SonarQube violation:
Done


PS13, Line 962: if (afterTopOpRefs != null) {
              :                 for (Mutable<ILogicalOperator> afterTopOpRef : 
afterTopOpRefs) {
              :                     tmpVars.clear();
              :                     
VariableUtilities.getUsedVariables((ILogicalOperator) afterTopOpRef.getValue(), 
tmpVars);
              :                     for (LogicalVariable tmpVar : tmpVars) {
              :                         if 
(!usedVarsAfterTopOp.contains(tmpVar)) {
              :                             usedVarsAfterTopOp.add(tmpVar);
              :                         }
              :                     }
              :                 }
              :             }
> OperatorPropertiesUtils.getFreeVaraibles(....)
Done


PS13, Line 977: 
              :             // Is the used variables after SELECT operator from 
the primary index?
              :      
> UnionAll need to generate new variable, so that the query plan can stay as 
Done


Line 1020:                         if (sIndexIdx > -1) {
> MAJOR SonarQube violation:
Done


Line 1020:                         if (sIndexIdx > -1) {
> MAJOR SonarQube violation:
Done


Line 1041:                         if (sIndexIdx > -1) {
> MAJOR SonarQube violation:
Done


Line 1041:                         if (sIndexIdx > -1) {
> MAJOR SonarQube violation:
Done


Line 1043:                             if (isIndexOnlyPlan && 
(secondaryKeyFieldUsedAfterSelectOrJoinOp
> MAJOR SonarQube violation:
Done


Line 1043:                             if (isIndexOnlyPlan && 
(secondaryKeyFieldUsedAfterSelectOrJoinOp
> MAJOR SonarQube violation:
Done


PS13, Line 1077: unionVarMap.add(new Triple<>(v, v, v));
> make v/v/v as SSA?
Done


Line 1112:                         if (expr.getValue().getExpressionTag() == 
LogicalExpressionTag.CONSTANT) {
> MAJOR SonarQube violation:
Done


Line 1112:                         if (expr.getValue().getExpressionTag() == 
LogicalExpressionTag.CONSTANT) {
> MAJOR SonarQube violation:
Done


Line 1120:                 if (constAssignVars.size() > 0) {
> MAJOR SonarQube violation:
Done


Line 1120:                 if (constAssignVars.size() > 0) {
> MAJOR SonarQube violation:
Done


Line 1278:             if ((idxType == IndexType.RTREE && 
requireVerificationAfterSIdxSearch)
> MAJOR SonarQube violation:
Done


Line 1278:             if ((idxType == IndexType.RTREE && 
requireVerificationAfterSIdxSearch)
> MAJOR SonarQube violation:
Done


Line 1302:                         for (int i = 0; i < 
uniqueUsedVarsInTopOp.size(); i++) {
> MAJOR SonarQube violation:
Done


Line 1302:                         for (int i = 0; i < 
uniqueUsedVarsInTopOp.size(); i++) {
> MAJOR SonarQube violation:
Done


Line 1312:                         if 
(fetchedSecondaryKeyFieldVarsFromPIdxLookUp != null) {
> MAJOR SonarQube violation:
Done


Line 1312:                         if 
(fetchedSecondaryKeyFieldVarsFromPIdxLookUp != null) {
> MAJOR SonarQube violation:
Done


PS13, Line 1376: else {
               :             // Non-index-only plan optimization - still 
index-utilization plan.
               :             return primaryIndexUnnestOp;
               :         }
> Pull that into a separate if block and then the current if branch doesn't n
Done


https://asterix-gerrit.ics.uci.edu/#/c/1866/4/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/BTreeAccessMethod.java
File 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/BTreeAccessMethod.java:

Line 184:         } else {
> MAJOR SonarQube violation:
Done


Line 185:             // We don't consider an index on an external dataset or a 
primary index to be an index-only plan.
> MAJOR SonarQube violation:
Done


Line 339: 
> MAJOR SonarQube violation:
Done


Line 340:         ILogicalOperator primaryIndexUnnestOp = 
createSecondaryToPrimaryPlan(afterJoinRefs, joinRef, conditionRef,
> MAJOR SonarQube violation:
Done


Line 341:                 indexSubTree.getAssignsAndUnnestsRefs(), 
indexSubTree, probeSubTree, chosenIndex, analysisCtx, true,
> MAJOR SonarQube violation:
Done


Line 342:                 isLeftOuterJoin, true, context, 
newNullPlaceHolderVar);
> MAJOR SonarQube violation:
Done


https://asterix-gerrit.ics.uci.edu/#/c/1866/13/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/BTreeAccessMethod.java
File 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/BTreeAccessMethod.java:

Line 95:     private static List<Pair<FunctionIdentifier, Boolean>> 
FUNC_IDENTIFIERS = Collections.unmodifiableList(
> final?
Done


PS13, Line 155: secondaryKeyFieldUsedAfterSelectOp 
> this variable is not needed for B-tree?
Done


PS13, Line 218: || dataSourceRefOp.getOperatorTag() == 
LogicalOperatorTag.LEFT_OUTER_UNNEST_MAP
> Is the or branch covered by any tests?
Removed.


PS13, Line 232:  // The whole plan is now changed into an index-only plan
> you only use primary index for this branch, why it is related to index only
Removed.


PS13, Line 240: dataSourceRefOp.getOperatorTag() == 
LogicalOperatorTag.LEFT_OUTER_UNNEST_MAP
> same as above
Removed.


PS13, Line 305: boolean secondaryKeyFieldUsedAfterJoinOp = false;
> Is this variable necessary?
Removed.


PS13, Line 349: IsNull
> IsNull -> isMissing?
Done


PS13, Line 391: primaryIndexUnnestOp
> rename the variable?
I changed the name. I just found that this is not an assignment so that I can't 
make this into one line.


https://asterix-gerrit.ics.uci.edu/#/c/1866/13/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceSelectAccessMethodRule.java
File 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceSelectAccessMethodRule.java:

PS13, Line 384: intersectAllSecondaryIndexes
> factor out single index handling as another method and call the new method 
Done


https://asterix-gerrit.ics.uci.edu/#/c/1866/13/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/InvertedIndexAccessMethod.java
File 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/InvertedIndexAccessMethod.java:

Line 117:     private static List<Pair<FunctionIdentifier, Boolean>> 
FUNC_IDENTIFIERS = Collections.unmodifiableList(
> MAJOR SonarQube violation:
Done


Line 117:     private static List<Pair<FunctionIdentifier, Boolean>> 
FUNC_IDENTIFIERS = Collections.unmodifiableList(
> MAJOR SonarQube violation:
Done


Line 129:     private static List<Pair<FunctionIdentifier, Boolean>> 
SECOND_LEVEL_FUNC_IDENTIFIERS = Collections.unmodifiableList(
> MAJOR SonarQube violation:
Done


Line 129:     private static List<Pair<FunctionIdentifier, Boolean>> 
SECOND_LEVEL_FUNC_IDENTIFIERS = Collections.unmodifiableList(
> MAJOR SonarQube violation:
Done


Line 235:             if (fID != null && 
fID.equals(matchedFuncExpr.getFunctionIdentifier())) {
> BLOCKER SonarQube violation:
Done


Line 235:             if (fID != null && 
fID.equals(matchedFuncExpr.getFunctionIdentifier())) {
> BLOCKER SonarQube violation:
Done


https://asterix-gerrit.ics.uci.edu/#/c/1866/1/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/OptimizableOperatorSubTree.java
File 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/OptimizableOperatorSubTree.java:

Line 173:             Mutable<ILogicalOperator> additionalSubTreeOpRef;
> MAJOR SonarQube violation:
Done


Line 354:         op = (AbstractLogicalOperator) opRef.getValue();
> MAJOR SonarQube violation:
Done


https://asterix-gerrit.ics.uci.edu/#/c/1866/4/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/RTreeAccessMethod.java
File 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/RTreeAccessMethod.java:

Line 143: 
> MAJOR SonarQube violation:
Done


Line 176:                 isIndexOnlyPlan = false;
> MAJOR SonarQube violation:
Done


Line 178:             }
> MAJOR SonarQube violation:
Done


Line 179:         }
> MAJOR SonarQube violation:
Done


Line 183:         ILogicalOperator primaryIndexUnnestOp = 
createSecondaryToPrimaryPlan(afterSelectRefs, selectRef,
> MAJOR SonarQube violation:
Done


Line 192: 
> MAJOR SonarQube violation:
Done


Line 247:                 dataset.getDataverseName(), dataset.getDatasetName(), 
retainInput, requiresBroadcast);
> MAJOR SonarQube violation:
Done


Line 248:         // A spatial object is serialized in the constant of the func 
expr we are optimizing.
> MAJOR SonarQube violation:
Done


Line 248:         // A spatial object is serialized in the constant of the func 
expr we are optimizing.
> MAJOR SonarQube violation:
Done


Line 403:         if (isLeftOuterJoin && hasGroupBy) {
> MAJOR SonarQube violation:
Done


Line 404:             ScalarFunctionCallExpression LOJFuncExprs = 
analysisCtx.getLOJIsNullFuncInGroupBy();
> MAJOR SonarQube violation:
Done


Line 405:             List<LogicalVariable> LOJNullVariables = new 
ArrayList<LogicalVariable>();
> MAJOR SonarQube violation:
Done


Line 406:             LOJFuncExprs.getUsedVariables(LOJNullVariables);
> MAJOR SonarQube violation:
Done


https://asterix-gerrit.ics.uci.edu/#/c/1866/13/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/RTreeAccessMethod.java
File 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/RTreeAccessMethod.java:

Line 76:     private static List<Pair<FunctionIdentifier, Boolean>> 
FUNC_IDENTIFIERS = Collections.unmodifiableList(
> MAJOR SonarQube violation:
Done


Line 76:     private static List<Pair<FunctionIdentifier, Boolean>> 
FUNC_IDENTIFIERS = Collections.unmodifiableList(
> MAJOR SonarQube violation:
Done


Line 173:                 requireVerificationAfterSIdxSearch = 
indexOnlyPlanInfo.third;
> MAJOR SonarQube violation:
Done


Line 173:                 requireVerificationAfterSIdxSearch = 
indexOnlyPlanInfo.third;
> MAJOR SonarQube violation:
Done


PS13, Line 240: generateInstantTrylockResultFromIndexSearch = true;
> change that to an one line assignment.
Done


https://asterix-gerrit.ics.uci.edu/#/c/1866/13/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/AbstractOperationCallbackFactory.java
File 
asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/AbstractOperationCallbackFactory.java:

PS13, Line 34: protected boolean isIndexOnlyPlanEnabled;
> Move to this flag to the specific call back need that?
Done


https://asterix-gerrit.ics.uci.edu/#/c/1866/1/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java
File 
asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java:

Line 470:                     
dataset.getSearchCallbackFactory(storaegComponentProvider, theIndex, jobId, 
IndexOperation.SEARCH,
> MAJOR SonarQube violation:
Done


Line 496:             JobGenContext context, boolean retainInput, boolean 
retainMissing, Dataset dataset, String indexName,
> MAJOR SonarQube violation:
Done


https://asterix-gerrit.ics.uci.edu/#/c/1866/13/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataset.java
File 
asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataset.java:

PS13, Line 558:  public
> copy the documentation here if it is public.
Done


https://asterix-gerrit.ics.uci.edu/#/c/1866/1/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/ATypeHierarchy.java
File 
asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/ATypeHierarchy.java:

Line 401:     public enum TypeCastingMathFunctionType {
> MAJOR SonarQube violation:
Done


https://asterix-gerrit.ics.uci.edu/#/c/1866/13/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/DoubleToInt16TypeConvertComputer.java
File 
asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/DoubleToInt16TypeConvertComputer.java:

PS13, Line 62:  switch (mathFunction) {
             :             case CEIL:
             :                 sourceValue = Math.ceil(((ADouble) 
sourceObject).getDoubleValue());
             :                 break;
             :             case FLOOR:
             :                 sourceValue = Math.floor(((ADouble) 
sourceObject).getDoubleValue());
             :                 break;
             :             default:
             :                 sourceValue = ((ADouble) 
sourceObject).getDoubleValue();
             :                 break;
             :         }
> mathFunction.covert(sourceObject, ...);
Done


https://asterix-gerrit.ics.uci.edu/#/c/1866/1/hyracks-fullstack/algebricks/algebricks-common/src/main/java/org/apache/hyracks/algebricks/common/utils/Quadruple.java
File 
hyracks-fullstack/algebricks/algebricks-common/src/main/java/org/apache/hyracks/algebricks/common/utils/Quadruple.java:

Line 42:         if (!(o instanceof Quadruple<?, ?, ?, ?>)) {
> MAJOR SonarQube violation:
Done


https://asterix-gerrit.ics.uci.edu/#/c/1866/13/hyracks-fullstack/algebricks/algebricks-common/src/main/java/org/apache/hyracks/algebricks/common/utils/Quadruple.java
File 
hyracks-fullstack/algebricks/algebricks-common/src/main/java/org/apache/hyracks/algebricks/common/utils/Quadruple.java:

Line 18:     public T1 first;
> final?
Changed to provide the type of the variables to private and made getter() and 
setter().


https://asterix-gerrit.ics.uci.edu/#/c/1866/13/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/util/OperatorPropertiesUtil.java
File 
hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/util/OperatorPropertiesUtil.java:

PS13, Line 252:  AbstractLogicalOperator op = (AbstractLogicalOperator) 
r.getValue();
              :         for (Mutable<ILogicalOperator> i : op.getInputs()) {
              :             typeOpRec(i, context);
              :         }
              :         if (op.hasNestedPlans()) {
              :             for (ILogicalPlan p : 
((AbstractOperatorWithNestedPlans) op).getNestedPlans()) {
              :                 typePlan(p, context);
              :             }
              :         }
              :         context.computeAndSetTypeEnvironmentForOperator(op);
> return typeOpRec(r.getValue(), context);
Done


https://asterix-gerrit.ics.uci.edu/#/c/1866/13/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/IntroduceProjectsRule.java
File 
hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/IntroduceProjectsRule.java:

Line 82:         return introduceProjects(parentOps, null, -1, opRef, 
Collections.<LogicalVariable> emptySet(), context);
> MAJOR SonarQube violation:
Done


Line 82:         return introduceProjects(parentOps, null, -1, opRef, 
Collections.<LogicalVariable> emptySet(), context);
> MAJOR SonarQube violation:
Done


PS13, Line 186: boolean projectBeforeUnionFound = false;
> Make the rule general and agnostic to specific operators.
Done


https://asterix-gerrit.ics.uci.edu/#/c/1866/5/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/RemoveUnusedAssignAndAggregateRule.java
File 
hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/RemoveUnusedAssignAndAggregateRule.java:

Line 430:      */
> MAJOR SonarQube violation:
Done


Line 436: 
> MAJOR SonarQube violation:
Done


Line 436: 
> MAJOR SonarQube violation:
Done


https://asterix-gerrit.ics.uci.edu/#/c/1866/13/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/RemoveUnusedAssignAndAggregateRule.java
File 
hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/RemoveUnusedAssignAndAggregateRule.java:

PS13, Line 156: .getOperatorTag() == LogicalOperatorTag.AGGREGATE
              :                     || (op.getOperatorTag() == 
LogicalOperatorTag.UNIONALL && keepUnionOp
> Fix it here instead of adding a special case handling method.
Done


https://asterix-gerrit.ics.uci.edu/#/c/1866/13/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeRangeSearchCursor.java
File 
hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeRangeSearchCursor.java:

PS13, Line 54: private byte[] returnValuesArrayForProccedResult = new byte[10];
> split into two byte arrays.
split into two byte arrays: done.

Passing those values through CursorFactory instead of opContext: it was hard 
for me to come up with a viable solution for this. Sorry.


-- 
To view, visit https://asterix-gerrit.ics.uci.edu/1866
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: Ifd5c9ab1cf2e4bedb7d8db582441919875e74d51
Gerrit-PatchSet: 13
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Owner: Taewoo Kim <wangs...@gmail.com>
Gerrit-Reviewer: Jenkins <jenk...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Taewoo Kim <wangs...@gmail.com>
Gerrit-Reviewer: Yingyi Bu <buyin...@gmail.com>
Gerrit-HasComments: Yes

Reply via email to