Taewoo Kim has posted comments on this change. Change subject: Index-only plan ......................................................................
Patch Set 9: (238 comments) https://asterix-gerrit.ics.uci.edu/#/c/744/9/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 457: protected boolean findIndexAndFillExprs(List<Index> datasetIndexes, List<String> fieldName, IAType fieldType, > MAJOR SonarQube violation: Done Line 646: if (subTreePKs.contains(dsVar) && dsVarIndex <= subTreePKs.size() - 1) { > CRITICAL SonarQube violation: Done Line 737: List<LogicalVariable> primaryKeyVarList = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 922: if (optFuncExpr.getFuncExpr().getFunctionIdentifier() == AsterixBuiltinFunctions.EDIT_DISTANCE_CHECK) { > MAJOR SonarQube violation: Done Line 984: if (unnestExpr.getExpressionTag() != LogicalExpressionTag.FUNCTION_CALL) { > BLOCKER SonarQube violation: Done Line 1009: ArrayList<Mutable<ILogicalExpression>> idxFuncArgs = new ArrayList<Mutable<ILogicalExpression>>(); > MAJOR SonarQube violation: Done Line 1032: boolean isInnerJoin) throws AlgebricksException { > MAJOR SonarQube violation: Done Line 1032: boolean isInnerJoin) throws AlgebricksException { > MAJOR SonarQube violation: Done Line 1057: if (subTree.selectRefs != null && subTree.selectRefs.size() > 0) { > MAJOR SonarQube violation: Done Line 1098: if (subTree.selectRefs != null && subTree.selectRefs.size() > 0) { > MAJOR SonarQube violation: Done Line 1147: // secondary-index search in non-index only plan can keep the original attribute order from the search > MAJOR SonarQube violation: Done https://asterix-gerrit.ics.uci.edu/#/c/744/9/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodAnalysisContext.java File asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodAnalysisContext.java: Line 59: private boolean isIndexOnlyPlan = false; > MAJOR SonarQube violation: Done Line 72: private Quintuple<Boolean, Boolean, Boolean, Boolean, Boolean> indexOnlyPlanInfo = new Quintuple<Boolean, Boolean, Boolean, Boolean, Boolean>( > MAJOR SonarQube violation: Done Line 72: private Quintuple<Boolean, Boolean, Boolean, Boolean, Boolean> indexOnlyPlanInfo = new Quintuple<Boolean, Boolean, Boolean, Boolean, Boolean>( > MAJOR SonarQube violation: Done https://asterix-gerrit.ics.uci.edu/#/c/744/9/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodJobGenParams.java File asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodJobGenParams.java: Line 53: private final int NUM_PARAMS = 8; > MAJOR SonarQube violation: Done https://asterix-gerrit.ics.uci.edu/#/c/744/9/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 253: int numOutputVars = (primaryKeysOnly) ? numPrimaryKeys : numPrimaryKeys + numSecondaryKeys; > MAJOR SonarQube violation: Done Line 257: // If not, add one more variables to put the result of instantTryLock - whether this lock can be granted on a primary key > MAJOR SonarQube violation: Done Line 259: // If it is not granted, then we need to do a secondary index lookup, sort PKs, do a primary index lookup, and select. > MAJOR SonarQube violation: Done Line 333: List<LogicalVariable> keyVars = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 334: List<LogicalVariable> sourceVars = null; > MAJOR SonarQube violation: Done Line 346: switch (keyType) { > MAJOR SonarQube violation: Done Line 387: * If we are optimizing a selection query then this method returns a ConstantExpression from the first constant value > MAJOR SonarQube violation: Done Line 440: // we need to check a corner case where two real values are located between an INT value. > MAJOR SonarQube violation: Done Line 447: // It should generate a result if there is a tuple that satisfies the condition, which is 3, > MAJOR SonarQube violation: Done Line 449: // fail after truncating the fraction part (there is no INT whose value is greater than 2 and less than 3.) > MAJOR SonarQube violation: Done Line 467: // IntVar = 4.3 ==> round-down and round-up: IntVar = 4 and IntVar = 5 (eventually - false) > MAJOR SonarQube violation: Done Line 468: // IntVar = 4.0 ==> round-down and round-up: IntVar = 4 and IntVar = 4 (eventually - true) > MAJOR SonarQube violation: Done Line 475: mathFunctionTypeForNumericTypeCasting = TypeCastingMathFunctionType.FLOOR; // round-down > MAJOR SonarQube violation: Done Line 477: mathFunctionTypeForNumericTypeCasting = TypeCastingMathFunctionType.CEIL_FLOOR; // both > MAJOR SonarQube violation: Done Line 506: return new Pair<ILogicalExpression, ILogicalExpression>( > MAJOR SonarQube violation: Done Line 510: return new Pair<ILogicalExpression, ILogicalExpression>( > MAJOR SonarQube violation: Done Line 514: return new Pair<ILogicalExpression, ILogicalExpression>(optFuncExpr.getConstantAtRuntimeExpr(0), null); > MAJOR SonarQube violation: Done Line 519: return new Pair<ILogicalExpression, ILogicalExpression>( > MAJOR SonarQube violation: Done Line 522: return new Pair<ILogicalExpression, ILogicalExpression>( > MAJOR SonarQube violation: Done Line 577: List<LogicalVariable> usedVarsInSelectJoinOpTemp = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 578: List<LogicalVariable> usedVarsInSelectJoinOp = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 584: List<LogicalVariable> dataScanPKRecordVars = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 585: List<LogicalVariable> dataScanPKVars = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 586: List<LogicalVariable> dataScanRecordVars = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 604: List<LogicalVariable> selectInIndexSubTreeVars = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 631: List<LogicalVariable> liveVarsInSubTreeRootOp = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 632: List<LogicalVariable> producedVarsInSubTreeRootOp = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 651: // For the select case, it doesn't do anything since live variables includes all variables used in that operator. > MAJOR SonarQube violation: Done Line 685: List<LogicalVariable> chosenIndexVars = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 689: List<LogicalVariable> constantVars = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 773: List<LogicalVariable> countUsedVars = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 774: List<LogicalVariable> producedVarsAfterSelectOrJoinOp = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 785: List<LogicalVariable> usedVarsAfterSelectOrJoinOp = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 822: // If this operator is using the variables that are produced before the SELECT or JOIN operator > MAJOR SonarQube violation: Done Line 838: // Unlike B+Tree or R-Tree on POINT or RECTANGLE type, we can't use or reconstruct > MAJOR SonarQube violation: Done Line 840: // Therefore, if a secondary key field value is used after SELECT operator, this cannot be > MAJOR SonarQube violation: Done Line 841: // an index-only plan. Therefore, we can only check whether PK is used after SELECT operator. > MAJOR SonarQube violation: Done Line 847: // If an ASSIGN or UNNEST before SELECT or JOIN operator contain the given variable and > MAJOR SonarQube violation: Done Line 848: // the given variable is a secondary key field (this happens when we have a composite secondary index) > MAJOR SonarQube violation: Done Line 965: List<LogicalVariable> producedVarsFromProbeTree = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 966: List<LogicalVariable> usedVarsFromProbeTree = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 966: List<LogicalVariable> usedVarsFromProbeTree = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 1024: } catch (Exception e) { > CRITICAL SonarQube violation: Done Line 1038: // we don't need to verify it again using SELECT operator since there are no false positive results. > MAJOR SonarQube violation: Done Line 1047: // If the type of an R-Tree index is not a point or rectangle, an index-only plan is not possible > MAJOR SonarQube violation: Done Line 1063: // this can't be qualified as an index-only plan since an inverted index contains a part of a field value, not all of it. > MAJOR SonarQube violation: Done Line 1068: if (secondaryKeyFieldUsedAfterSelectOrJoinOp) { > MAJOR SonarQube violation: Done Line 1169: // the combination of the SELECT condition and the chosen secondary index do not generate false positive results, > MAJOR SonarQube violation: Done Line 1176: // (left) secondary index-search -> split --+--> primary index-search -> select (verification) --+--> UNION -> ... > MAJOR SonarQube violation: Done Line 1203: boolean doesSIdxSearchCoverAllPredicates = indexOnlyPlanInfo.fifth; > MAJOR SonarQube violation: Done Line 1210: HashMap<LogicalVariable, LogicalVariable> keyMappingBetweenNewSIdxSrchAndOrigianlScan = new HashMap<LogicalVariable, LogicalVariable>(); > MAJOR SonarQube violation: Done Line 1235: // construct an additional ASSIGN to restore the original secondary key field(s) from the results of the secondary index search > MAJOR SonarQube violation: Done Line 1250: restoredSecondaryKeyFieldExprs = new ArrayList<Mutable<ILogicalExpression>>(); > MAJOR SonarQube violation: Done Line 1251: restoredSecondaryKeyFieldVars = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 1257: List<Mutable<ILogicalExpression>> expressions = new ArrayList<Mutable<ILogicalExpression>>(); > MAJOR SonarQube violation: Done Line 1271: List<Mutable<ILogicalExpression>> expressions = new ArrayList<Mutable<ILogicalExpression>>(); > MAJOR SonarQube violation: Done Line 1306: List<LogicalVariable> varsUsedInTopOp = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 1307: List<LogicalVariable> uniqueVarsUsedInTopOp = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 1311: List<LogicalVariable> liveVarsInTopOp = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 1316: List<LogicalVariable> liveVarsInSubTreeRootOp = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 1317: List<LogicalVariable> producedVarsInSubTreeRootOp = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 1357: varsUsedInAssignUnnestBeforeTopOp = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 1358: List<LogicalVariable> varsUsedInAssignUnnestBeforeTopOpTmp = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 1378: List<LogicalVariable> varsUsedAfterTopOp = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 1398: unionVarMap = new ArrayList<Triple<LogicalVariable, LogicalVariable, LogicalVariable>>(); > MAJOR SonarQube violation: Done Line 1400: // Is the used variables after SELECT operator from the primary index? Then, create the mapping between two paths. > MAJOR SonarQube violation: Done Line 1418: // If the index means -1, either it is a secondary key variable or a variable from different branch (join case). > MAJOR SonarQube violation: Done Line 1424: // Construct the mapping between the PK from the original plan to the PK from the secondary index search > MAJOR SonarQube violation: Done Line 1429: // iterator.remove(); > MAJOR SonarQube violation: Done Line 1453: // For the join-case, the match might not exist. In this case, we just propagate the variables later. > MAJOR SonarQube violation: Done Line 1458: // Construct the mapping between the SK from the original plan to the SK from the secondary index search > MAJOR SonarQube violation: Done Line 1473: // For the join-case, the match might not exist. In this case, we just propagate the variables later. > MAJOR SonarQube violation: Done Line 1480: fetchedSecondaryKeyFieldVarsFromPIdxLookUp = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 1504: varsLiveInSelect = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 1548: Mutable<ILogicalExpression> vRef = new MutableObject<ILogicalExpression>( > MAJOR SonarQube violation: Done Line 1561: List<Mutable<ILogicalExpression>> primaryIndexFuncArgs = new ArrayList<Mutable<ILogicalExpression>>(); > MAJOR SonarQube violation: Done Line 1614: // If not, we just need to use the original select operator in the left path (tryLock on PK fail path) to do final verification. > MAJOR SonarQube violation: Done Line 1644: // context.computeAndSetTypeEnvironmentForOperator(lastAssignBeforeTopOp); > MAJOR SonarQube violation: Done Line 1671: // assignRestoredSecondaryKeyFieldOp.setExecutionMode(lastAssignBeforeTopOp.getExecutionMode()); > MAJOR SonarQube violation: Done Line 1671: // assignRestoredSecondaryKeyFieldOp.setExecutionMode(lastAssignBeforeTopOp.getExecutionMode()); > MAJOR SonarQube violation: Done Line 1683: // Lastly, if there is an index-nested-loop-join and the join contains more conditions other than joining fields, > MAJOR SonarQube violation: Done Line 1684: // then those conditions need to be applied to filter out false positive results in the right path (tryLock success path). > MAJOR SonarQube violation: Done Line 1719: // int sIndexIdx = chosenIndexFieldNames.indexOf(subTree.fieldNames.get(uniqueVarsUsedInTopOp > MAJOR SonarQube violation: Done Line 1720: // .get(i))); > MAJOR SonarQube violation: Done Line 1722: // if (sIndexIdx > -1) { > MAJOR SonarQube violation: Done Line 1724: // secondaryKeyVarsFromSIdxSearch.get(sIndexIdx)); > MAJOR SonarQube violation: Done Line 1749: List<LogicalVariable> leftVars = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 1750: List<LogicalVariable> rightVars = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 1778: // unionAllOp.getInputs().add(new MutableObject<ILogicalOperator>(newSelectOp)); > MAJOR SonarQube violation: Done Line 1781: // StringBuilder sb = new StringBuilder(); > MAJOR SonarQube violation: Done Line 1871: // If it is used somewhere else except the group-by operator, we can't delete it since we need to propagate it. > MAJOR SonarQube violation: Done Line 1874: List<LogicalVariable> usedVars = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 1918: // When changes in the variable mapping are happened, we need to adjust Project operator before UnionAll operators. > MAJOR SonarQube violation: Done Line 1939: List<LogicalVariable> leftVars = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 1940: List<LogicalVariable> rightVars = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 2112: return new Pair<Boolean, Boolean>(functionFound, doesSIdxSearchGenerateNoFalsePositiveResults); > MAJOR SonarQube violation: Done Line 2146: // The order of operators: union <- project (current) <- select <- assign? <- unnest-map (PIdx) <- split <- unnest-map (SIdx) <- ... > MAJOR SonarQube violation: Done https://asterix-gerrit.ics.uci.edu/#/c/744/9/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 90: private static List<Pair<FunctionIdentifier, Boolean>> funcIdents = new ArrayList<Pair<FunctionIdentifier, Boolean>>(); > MAJOR SonarQube violation: Done Line 90: private static List<Pair<FunctionIdentifier, Boolean>> funcIdents = new ArrayList<Pair<FunctionIdentifier, Boolean>>(); > MAJOR SonarQube violation: Done Line 137: Mutable<ILogicalOperator> assignBeforeSelectOpRef = (subTree.assignsAndUnnestsRefs.isEmpty()) ? null > MAJOR SonarQube violation: Done Line 172: Quintuple<Boolean, Boolean, Boolean, Boolean, Boolean> indexOnlyPlanInfo = new Quintuple<Boolean, Boolean, Boolean, Boolean, Boolean>( > MAJOR SonarQube violation: Done Line 172: Quintuple<Boolean, Boolean, Boolean, Boolean, Boolean> indexOnlyPlanInfo = new Quintuple<Boolean, Boolean, Boolean, Boolean, Boolean>( > MAJOR SonarQube violation: Done Line 305: Mutable<ILogicalOperator> assignBeforeJoinOpRef = (indexSubTree.assignsAndUnnestsRefs.isEmpty()) ? null > MAJOR SonarQube violation: Done Line 307: ILogicalOperator assignBeforeJoinOp = null; > MAJOR SonarQube violation: Done Line 309: assignBeforeJoinOp = assignBeforeJoinOpRef.getValue(); > MAJOR SonarQube violation: Done Line 337: Quintuple<Boolean, Boolean, Boolean, Boolean, Boolean> indexOnlyPlanInfo = new Quintuple<Boolean, Boolean, Boolean, Boolean, Boolean>( > MAJOR SonarQube violation: Done Line 337: Quintuple<Boolean, Boolean, Boolean, Boolean, Boolean> indexOnlyPlanInfo = new Quintuple<Boolean, Boolean, Boolean, Boolean, Boolean>( > MAJOR SonarQube violation: Done Line 372: List<LogicalVariable> LOJNullVariables = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 375: if (LOJNullVariables.size() > 0) { > MAJOR SonarQube violation: Done Line 435: public ILogicalOperator createSecondaryToPrimaryPlan(List<Mutable<ILogicalOperator>> afterTopOpRefs, > MAJOR SonarQube violation: Done Line 453: boolean secondaryKeyFieldUsedAfterSelectOrJoinOp = indexOnlyPlanInfo.second; > MAJOR SonarQube violation: Done Line 453: boolean secondaryKeyFieldUsedAfterSelectOrJoinOp = indexOnlyPlanInfo.second; > MAJOR SonarQube violation: Done Line 454: boolean requireVerificationAfterSIdxSearch = indexOnlyPlanInfo.third; > MAJOR SonarQube violation: Done Line 455: boolean doesSIdxSearchGenerateNoFalsePositiveResults = indexOnlyPlanInfo.fourth; > MAJOR SonarQube violation: Done Line 455: boolean doesSIdxSearchGenerateNoFalsePositiveResults = indexOnlyPlanInfo.fourth; > MAJOR SonarQube violation: Done Line 456: boolean doesSIdxSearchCoverAllPredicates = indexOnlyPlanInfo.fifth; > MAJOR SonarQube violation: Done Line 456: boolean doesSIdxSearchCoverAllPredicates = indexOnlyPlanInfo.fifth; > MAJOR SonarQube violation: Done Line 804: // since we can't guarantee that the results will be the final results and an additional SELECT needs to be applied. > MAJOR SonarQube violation: Done Line 806: // The job gen parameters are transferred to the actual job gen via the UnnestMapOperator's function arguments. > MAJOR SonarQube violation: Done Line 807: ArrayList<Mutable<ILogicalExpression>> primaryIndexFuncArgs = new ArrayList<Mutable<ILogicalExpression>>(); > MAJOR SonarQube violation: Done Line 807: ArrayList<Mutable<ILogicalExpression>> primaryIndexFuncArgs = new ArrayList<Mutable<ILogicalExpression>>(); > MAJOR SonarQube violation: Done https://asterix-gerrit.ics.uci.edu/#/c/744/9/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceJoinAccessMethodRule.java File asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceJoinAccessMethodRule.java: Line 66: * (limit)* <-- (order)* <-- (select) <-- (assign) <-- (btree search) <-- (sort) <-- (unnest(index search)) <-- (assign) <-- (datasource scan | unnest-map) > MAJOR SonarQube violation: Done Line 94: * 2) A secondary index search or a primary index search of INNER branch can cover the given condition in the given join operator. > MAJOR SonarQube violation: Done Line 95: * = no more verification is required after an index search assuming that we can get a trustworthy tuple from that index search. > MAJOR SonarQube violation: Done Line 99: * 4-1) Also, the attribute order in the given "order by" should be consistent with the attribute order in the first index search > MAJOR SonarQube violation: Done Line 156: if (op.getOperatorTag() != LogicalOperatorTag.SINK) { > MAJOR SonarQube violation: Done Line 161: afterJoinRefs = new ArrayList<Mutable<ILogicalOperator>>(); > MAJOR SonarQube violation: Done Line 162: boolean planTransformed = false; > MAJOR SonarQube violation: Done Line 211: // We check the dataset name and the subtree to make sure that this index come from the inner branch. > MAJOR SonarQube violation: Done Line 348: // We first check the children of the given operator to make sure an earlier join in the path is optimized first. > MAJOR SonarQube violation: Done Line 373: Map<IAccessMethod, AccessMethodAnalysisContext> analyzedAMs = new HashMap<IAccessMethod, AccessMethodAnalysisContext>(); > MAJOR SonarQube violation: Done Line 373: Map<IAccessMethod, AccessMethodAnalysisContext> analyzedAMs = new HashMap<IAccessMethod, AccessMethodAnalysisContext>(); > MAJOR SonarQube violation: Done Line 423: String innerDataset = null; > MAJOR SonarQube violation: Done Line 425: innerDataset = rightSubTree.dataset.getDatasetName(); > MAJOR SonarQube violation: Done Line 449: // For LOJ with GroupBy, prepare objects to reset LOJ nullPlaceHolderVariable in GroupByOp. > MAJOR SonarQube violation: Done Line 462: // We assume that the left subtree is the outer branch and the right subtree is the inner branch. > MAJOR SonarQube violation: Done Line 479: ArrayList<LogicalVariable> pkVars = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 502: // 2) This index-search can generate the final results (trustworthy results in the outer branch). > MAJOR SonarQube violation: Done Line 503: // 3) the order of attribute from its index-search (data-scan) is the same as the attributes > MAJOR SonarQube violation: Done Line 505: // In this case, the index-search of the OUTER branch can generate just enough number of results > MAJOR SonarQube violation: Done Line 508: // INNER-JOIN case: we pass limit to inner branch since we can't count the final results > MAJOR SonarQube violation: Done Line 510: // or primary-index search of the inner branch. And the index should cover all join condition(s), > MAJOR SonarQube violation: Done Line 549: // If the plan transformation is successful, we don't need to traverse the plan any more, > MAJOR SonarQube violation: Done https://asterix-gerrit.ics.uci.edu/#/c/744/9/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: Line 72: * NEW: the left path (union) <-- (select) <-- (assign)+ <-- (btree search) <-- (sort) <-- (split) <-- (unnest-map(index search)) <-- (assign) > MAJOR SonarQube violation: Done Line 176: if (op.getOperatorTag() != LogicalOperatorTag.SINK) { > MAJOR SonarQube violation: Done Line 181: afterSelectRefs = new ArrayList<Mutable<ILogicalOperator>>(); > MAJOR SonarQube violation: Done Line 182: boolean planTransformed = false; > MAJOR SonarQube violation: Done Line 326: Map<IAccessMethod, AccessMethodAnalysisContext> analyzedAMs = new LinkedHashMap<IAccessMethod, AccessMethodAnalysisContext>(); > MAJOR SonarQube violation: Done Line 326: Map<IAccessMethod, AccessMethodAnalysisContext> analyzedAMs = new LinkedHashMap<IAccessMethod, AccessMethodAnalysisContext>(); > MAJOR SonarQube violation: Done Line 336: if (subTree.selectRefs == null || (subTree.selectRefs != null && subTree.selectRefs.size() == 0)) { > MAJOR SonarQube violation: Done Line 372: // We also check whether we can pass LIMIT information to this index-search so that > MAJOR SonarQube violation: Done Line 384: ArrayList<LogicalVariable> pkVars = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 399: // an R-Tree or an inverted index doesn't have any particular ordering of elements > MAJOR SonarQube violation: Done Line 400: // from the index so we can't pass LIMIT information if there is an order by. > MAJOR SonarQube violation: Done Line 422: // We have all matching conditions for passing LIMIT information to the chosen index-search. > MAJOR SonarQube violation: Done Line 424: // To prepare for a case where an index is being updated, we generate slightly > MAJOR SonarQube violation: Done Line 437: // If the plan transformation is successful, we don't need to traverse the plan any more, > MAJOR SonarQube violation: Done Line 438: // since if there are more SELECT operators, the next trigger on this plan will find them. > MAJOR SonarQube violation: Done https://asterix-gerrit.ics.uci.edu/#/c/744/9/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 108: private static List<Pair<FunctionIdentifier, Boolean>> funcIdents = new ArrayList<Pair<FunctionIdentifier, Boolean>>(); > MAJOR SonarQube violation: Done Line 108: private static List<Pair<FunctionIdentifier, Boolean>> funcIdents = new ArrayList<Pair<FunctionIdentifier, Boolean>>(); > MAJOR SonarQube violation: Done Line 121: private static List<Pair<FunctionIdentifier, Boolean>> secondLevelFuncIdents = new ArrayList<Pair<FunctionIdentifier, Boolean>>(); > MAJOR SonarQube violation: Done Line 121: private static List<Pair<FunctionIdentifier, Boolean>> secondLevelFuncIdents = new ArrayList<Pair<FunctionIdentifier, Boolean>>(); > MAJOR SonarQube violation: Done Line 232: if (fID.equals(matchedFuncExpr.getFunctionIdentifier())) { > BLOCKER SonarQube violation: Done Line 307: // The arguments of edit-distance-string-contains() function are asymmetrical, we can only use index if it is on the first argument > MAJOR SonarQube violation: Done Line 391: * ......... union <- select <- assign? <- unnest-map (primary index look-up) <- split <- unnest-map (secondary index look-up) <- assign? <- datasource-scan > MAJOR SonarQube violation: Done https://asterix-gerrit.ics.uci.edu/#/c/744/9/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/OptimizableFuncExpr.java File asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/OptimizableFuncExpr.java: Line 220: if (!(o instanceof OptimizableFuncExpr)) > MAJOR SonarQube violation: Done Line 222: else > MAJOR SonarQube violation: Done https://asterix-gerrit.ics.uci.edu/#/c/744/9/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 59: * (limit)? <-- (assign | unnest)* <-- (orderby)? <-- (select)? <-- (assign | unnest)* <-- (datasource scan | unnest-map)* > MAJOR SonarQube violation: Done Line 75: public final List<AbstractLogicalOperator> assignsAndUnnestsOps = new ArrayList<AbstractLogicalOperator>(); > MAJOR SonarQube violation: Done Line 83: public HashMap<LogicalVariable, List<String>> varsTofieldNameMap = new HashMap<LogicalVariable, List<String>>(); > MAJOR SonarQube violation: Done Line 83: public HashMap<LogicalVariable, List<String>> varsTofieldNameMap = new HashMap<LogicalVariable, List<String>>(); > MAJOR SonarQube violation: Done Line 102: public final List<Mutable<ILogicalOperator>> selectRefs = new ArrayList<Mutable<ILogicalOperator>>(); > MAJOR SonarQube violation: Done Line 189: if (subTreeOp.getInputs().size() < 1 || subTreeOp.getInputs() == null) { > MAJOR SonarQube violation: Done Line 279: Mutable<ILogicalOperator> subTreeOpRef, IOptimizationContext context) throws AlgebricksException { > MAJOR SonarQube violation: Done Line 297: // ... <- UNION <- PROJECT <- SELECT <- ASSIGN? <- UNNEST_MAP(PIdx) <- SPLIT <- UNNEST_MAP (SIdx) <- ASSIGN? <- ... > MAJOR SonarQube violation: Done Line 340: if (subTreeOp.getOperatorTag() == LogicalOperatorTag.ASSIGN) { > MAJOR SonarQube violation: Done Line 804: dataSourceRefToFetch = dataSourceRef; > MAJOR SonarQube violation: Done Line 851: List<LogicalVariable> pkVars = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 872: List<LogicalVariable> PKVars = new ArrayList<LogicalVariable>(); > MAJOR SonarQube violation: Done https://asterix-gerrit.ics.uci.edu/#/c/744/9/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 68: // The second boolean value means that this function can produce false positive results if this value is set to false. > MAJOR SonarQube violation: Done Line 71: // In R-Tree case, depending on the parameters of the SPATIAL_INTERSECT function, it may/may not produce false positive results. > MAJOR SonarQube violation: Done Line 72: // Thus, we need to have one more step to check whether the SPATIAL_INTERSECT generates false positive results or not. > MAJOR SonarQube violation: Done Line 73: private static List<Pair<FunctionIdentifier, Boolean>> funcIdents = new ArrayList<Pair<FunctionIdentifier, Boolean>>(); > MAJOR SonarQube violation: Done Line 73: private static List<Pair<FunctionIdentifier, Boolean>> funcIdents = new ArrayList<Pair<FunctionIdentifier, Boolean>>(); > MAJOR SonarQube violation: Done Line 128: Mutable<ILogicalOperator> assignBeforeSelectOpRef = (subTree.assignsAndUnnestsRefs.isEmpty()) ? null > MAJOR SonarQube violation: Done Line 130: ILogicalOperator assignBeforeSelectOp = null; > MAJOR SonarQube violation: Done Line 130: ILogicalOperator assignBeforeSelectOp = null; > MAJOR SonarQube violation: Done Line 132: assignBeforeSelectOp = assignBeforeSelectOpRef.getValue(); > MAJOR SonarQube violation: Done Line 171: Quintuple<Boolean, Boolean, Boolean, Boolean, Boolean> indexOnlyPlanInfo = new Quintuple<Boolean, Boolean, Boolean, Boolean, Boolean>( > MAJOR SonarQube violation: Done Line 171: Quintuple<Boolean, Boolean, Boolean, Boolean, Boolean> indexOnlyPlanInfo = new Quintuple<Boolean, Boolean, Boolean, Boolean, Boolean>( > MAJOR SonarQube violation: Done Line 263: if (indexSubTree == null) { > BLOCKER SonarQube violation: Done Line 275: Mutable<ILogicalOperator> assignBeforeJoinOpRef = (indexSubTree.assignsAndUnnestsRefs.isEmpty()) ? null > MAJOR SonarQube violation: Done Line 346: if (LOJNullVariables.size() > 0) { > MAJOR SonarQube violation: Done Line 403: public ILogicalOperator createSecondaryToPrimaryPlan(List<Mutable<ILogicalOperator>> afterTopRefs, > MAJOR SonarQube violation: Done Line 432: boolean requireVerificationAfterSIdxSearch = indexOnlyPlanInfo.third; > MAJOR SonarQube violation: Done Line 462: // Pair<ILogicalExpression, Boolean> returnedSearchKeyExpr = AccessMethodUtils.createSearchKeyExpr(optFuncExpr, > MAJOR SonarQube violation: Done Line 463: // indexSubTree, probeSubTree); > MAJOR SonarQube violation: Done https://asterix-gerrit.ics.uci.edu/#/c/744/9/asterixdb/asterix-app/src/main/java/org/apache/asterix/aql/translator/QueryTranslator.java File asterixdb/asterix-app/src/main/java/org/apache/asterix/aql/translator/QueryTranslator.java: Line 432: // if(ExperimentProfiler.PROFILE_MODE) { > MAJOR SonarQube violation: Done Line 435: // OperatorExecutionTimeProfiler.INSTANCE.executionTimeProfiler.add("compileAndExecute", String.valueOf(profilerSW.getStartTimeStamp()), profilerSW.getMessage("compileAndExecute", profilerSW.getStartTimeStamp()), true); > MAJOR SonarQube violation: Done https://asterix-gerrit.ics.uci.edu/#/c/744/9/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/IndexInfoOperatorDescriptor.java File asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/IndexInfoOperatorDescriptor.java: Line 134: return null; > MAJOR SonarQube violation: Done https://asterix-gerrit.ics.uci.edu/#/c/744/9/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/AqlMetadataProvider.java File asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/AqlMetadataProvider.java: Line 655: AqlMetadataImplConfig aqlMetadataImplConfig = (AqlMetadataImplConfig) implConfig; > MAJOR SonarQube violation: Done https://asterix-gerrit.ics.uci.edu/#/c/744/9/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/AqlBinaryTokenizerFactoryProvider.java File asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/AqlBinaryTokenizerFactoryProvider.java: Line 41: private static final IBinaryTokenizerFactory aqlStringWithOutTypeTagTokenizer = new DelimitedUTF8StringBinaryTokenizerFactory( > MAJOR SonarQube violation: Done Line 41: private static final IBinaryTokenizerFactory aqlStringWithOutTypeTagTokenizer = new DelimitedUTF8StringBinaryTokenizerFactory( > MAJOR SonarQube violation: Done https://asterix-gerrit.ics.uci.edu/#/c/744/9/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AbstractLogicalOperator.java File hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AbstractLogicalOperator.java: Line 62: public static enum canDecreaseCardinalityCode { > MAJOR SonarQube violation: Done Line 70: public static enum canPreserveOrderCode { > MAJOR SonarQube violation: Done https://asterix-gerrit.ics.uci.edu/#/c/744/9/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AbstractReplicateOperator.java File hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AbstractReplicateOperator.java: Line 42: this.outputs = new ArrayList<Mutable<ILogicalOperator>>(); > MAJOR SonarQube violation: Done Line 48: this.outputs = new ArrayList<Mutable<ILogicalOperator>>(); > MAJOR SonarQube violation: Done https://asterix-gerrit.ics.uci.edu/#/c/744/9/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 57: private final HashMap<AbstractLogicalOperator, HashSet<LogicalVariable>> allUsedVarsAfterOpMap = new HashMap<AbstractLogicalOperator, HashSet<LogicalVariable>>(); > MAJOR SonarQube violation: Done Line 57: private final HashMap<AbstractLogicalOperator, HashSet<LogicalVariable>> allUsedVarsAfterOpMap = new HashMap<AbstractLogicalOperator, HashSet<LogicalVariable>>(); > MAJOR SonarQube violation: Done https://asterix-gerrit.ics.uci.edu/#/c/744/9/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 56: private static final Logger LOGGER = Logger.getLogger(RemoveUnusedAssignAndAggregateRule.class.getName()); > MAJOR SonarQube violation: Done Line 57: private static final Level LVL = Level.WARNING; > MAJOR SonarQube violation: Done Line 60: Map<Mutable<ILogicalOperator>, Set<LogicalVariable>> assignedVarMap = new LinkedHashMap<Mutable<ILogicalOperator>, Set<LogicalVariable>>(); > MAJOR SonarQube violation: Done Line 60: Map<Mutable<ILogicalOperator>, Set<LogicalVariable>> assignedVarMap = new LinkedHashMap<Mutable<ILogicalOperator>, Set<LogicalVariable>>(); > MAJOR SonarQube violation: Done Line 61: Set<LogicalVariable> assignedVarSet = new HashSet<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 64: Map<Mutable<ILogicalOperator>, Set<LogicalVariable>> accumulatedUsedVarFromRootMap = new LinkedHashMap<Mutable<ILogicalOperator>, Set<LogicalVariable>>(); > MAJOR SonarQube violation: Done Line 64: Map<Mutable<ILogicalOperator>, Set<LogicalVariable>> accumulatedUsedVarFromRootMap = new LinkedHashMap<Mutable<ILogicalOperator>, Set<LogicalVariable>>(); > MAJOR SonarQube violation: Done Line 71: Set<LogicalVariable> survivedUnionSourceVarSet = new HashSet<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 86: Set<LogicalVariable> accumulatedUsedVarFromRootSet = new HashSet<LogicalVariable>(); > MAJOR SonarQube violation: Done Line 113: if (assignVarsSetForThisOp != null && assignVarsSetForThisOp.size() > 0) { > MAJOR SonarQube violation: Done Line 117: if (usedVarsSetForThisOp.contains(v) || survivedUnionSourceVarSet.contains(v)) { > BLOCKER SonarQube violation: Done Line 194: // LOGGER.log(LVL, op + " " + toRemove); > MAJOR SonarQube violation: Done Line 240: if (toRemove != null && toRemove.size() > 0) { > MAJOR SonarQube violation: Done Line 261: if (toRemove != null && toRemove.size() > 0) { > MAJOR SonarQube violation: Done -- To view, visit https://asterix-gerrit.ics.uci.edu/744 To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings Gerrit-MessageType: comment Gerrit-Change-Id: Ifa02c13d4fddd880e1ee9e85eef6577301fb4560 Gerrit-PatchSet: 9 Gerrit-Project: asterixdb Gerrit-Branch: master Gerrit-Owner: Taewoo Kim <wangs...@yahoo.com> Gerrit-Reviewer: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Gerrit-Reviewer: Taewoo Kim <wangs...@yahoo.com> Gerrit-Reviewer: Till Westmann <ti...@apache.org> Gerrit-Reviewer: Yingyi Bu <buyin...@gmail.com> Gerrit-Reviewer: Young-Seok Kim <kiss...@gmail.com> Gerrit-HasComments: Yes