private boolean allEqualities(OAndBlock condition) { if (condition == null) { return false; } for (OBooleanExpression exp : condition.getSubBlocks()) { if (exp instanceof OBinaryCondition) { if (((OBinaryCondition) exp).getOperator() instanceof OEqualsCompareOperator || ((OBinaryCondition) exp) .getOperator() instanceof OContainsKeyOperator || ((OBinaryCondition) exp) .getOperator() instanceof OContainsValueOperator) { //OK } else { return false; } } else if (exp instanceof OInCondition) { //OK } else { return false; } } return true; }
private boolean allEqualities(OAndBlock condition) { if (condition == null) { return false; } for (OBooleanExpression exp : condition.getSubBlocks()) { if (exp instanceof OBinaryCondition) { if (((OBinaryCondition) exp).getOperator() instanceof OEqualsCompareOperator) { return true; } } else { return false; } } return true; }
private boolean createsRangeWith(OBinaryCondition left, OBooleanExpression next) { if (!(next instanceof OBinaryCondition)) { return false; } OBinaryCondition right = (OBinaryCondition) next; if (!left.getLeft().equals(right.getLeft())) { return false; } OBinaryCompareOperator leftOperator = left.getOperator(); OBinaryCompareOperator rightOperator = right.getOperator(); if (leftOperator instanceof OGeOperator || leftOperator instanceof OGtOperator) { return rightOperator instanceof OLeOperator || rightOperator instanceof OLtOperator; } if (leftOperator instanceof OLeOperator || leftOperator instanceof OLtOperator) { return rightOperator instanceof OGeOperator || rightOperator instanceof OGtOperator; } return false; }
private Object convertToIndexDefinitionTypes(Object val, OType[] types) { if (val == null) { return null; } if (OMultiValue.isMultiValue(val)) { List<Object> result = new ArrayList<>(); int i = 0; for (Object o : OMultiValue.getMultiValueIterable(val)) { result.add(OType.convert(o, types[i++].getDefaultJavaType())); } if (condition instanceof OAndBlock) { for (int j = 0; j < ((OAndBlock) condition).getSubBlocks().size(); j++) { OBooleanExpression subExp = ((OAndBlock) condition).getSubBlocks().get(j); if (subExp instanceof OBinaryCondition) { if (((OBinaryCondition) subExp).getOperator() instanceof OContainsKeyOperator) { Map<Object, Object> newValue = new HashMap<>(); newValue.put(result.get(j), ""); result.set(j, newValue); } else if (((OBinaryCondition) subExp).getOperator() instanceof OContainsValueOperator) { Map<Object, Object> newValue = new HashMap<>(); newValue.put("", result.get(j)); result.set(j, newValue); } } } } return result; } return OType.convert(val, types[0].getDefaultJavaType()); }
private boolean indexKeyFromIncluded(OAndBlock keyCondition, OBinaryCondition additional) { OBooleanExpression exp = keyCondition.getSubBlocks().get(keyCondition.getSubBlocks().size() - 1); if (exp instanceof OBinaryCondition) { OBinaryCompareOperator operator = ((OBinaryCondition) exp).getOperator(); OBinaryCompareOperator additionalOperator = additional == null ? null : ((OBinaryCondition) additional).getOperator(); if (isGreaterOperator(operator)) { if (isIncludeOperator(operator)) { return true; } else { return false; } } else if (additionalOperator == null || (isIncludeOperator(additionalOperator) && isGreaterOperator(additionalOperator))) { return true; } else { return false; } } else { throw new UnsupportedOperationException("Cannot execute index query with " + exp); } }
for (OBooleanExpression exp : newBlock.getSubBlocks()) { if (exp instanceof OBinaryCondition) { if (((OBinaryCondition) exp).getOperator() instanceof OEqualsCompareOperator) { equalityExpressions.add(exp); } else {
private boolean indexKeyToIncluded(OAndBlock keyCondition, OBinaryCondition additional) { OBooleanExpression exp = keyCondition.getSubBlocks().get(keyCondition.getSubBlocks().size() - 1); if (exp instanceof OBinaryCondition) { OBinaryCompareOperator operator = ((OBinaryCondition) exp).getOperator(); OBinaryCompareOperator additionalOperator = additional == null ? null : ((OBinaryCondition) additional).getOperator(); if (isLessOperator(operator)) { if (isIncludeOperator(operator)) { return true; } else { return false; } } else if (additionalOperator == null || (isIncludeOperator(additionalOperator) && isLessOperator(additionalOperator))) { return true; } else { return false; } } else { throw new UnsupportedOperationException("Cannot execute index query with " + exp); } }
private boolean indexKeyFromIncluded(OAndBlock keyCondition, OBinaryCondition additional) { OBooleanExpression exp = keyCondition.getSubBlocks().get(keyCondition.getSubBlocks().size() - 1); OBinaryCompareOperator additionalOperator = additional == null ? null : additional.getOperator(); if (exp instanceof OBinaryCondition) { OBinaryCompareOperator operator = ((OBinaryCondition) exp).getOperator(); if (isGreaterOperator(operator)) { if (isIncludeOperator(operator)) { return true; } else { return false; } } else if (additionalOperator == null || (isIncludeOperator(additionalOperator) && isGreaterOperator(additionalOperator))) { return true; } else { return false; } } else if (exp instanceof OInCondition || exp instanceof OContainsAnyCondition) { if (additional == null || (isIncludeOperator(additionalOperator) && isGreaterOperator(additionalOperator))) { return true; } else { return false; } } else { throw new UnsupportedOperationException("Cannot execute index query with " + exp); } }
private boolean indexKeyToIncluded(OAndBlock keyCondition, OBinaryCondition additional) { OBooleanExpression exp = keyCondition.getSubBlocks().get(keyCondition.getSubBlocks().size() - 1); OBinaryCompareOperator additionalOperator = additional == null ? null : ((OBinaryCondition) additional).getOperator(); if (exp instanceof OBinaryCondition) { OBinaryCompareOperator operator = ((OBinaryCondition) exp).getOperator(); if (isLessOperator(operator)) { if (isIncludeOperator(operator)) { return true; } else { return false; } } else if (additionalOperator == null || (isIncludeOperator(additionalOperator) && isLessOperator(additionalOperator))) { return true; } else { return false; } } else if (exp instanceof OInCondition || exp instanceof OContainsAnyCondition) { if (additionalOperator == null || (isIncludeOperator(additionalOperator) && isLessOperator(additionalOperator))) { return true; } else { return false; } } else { throw new UnsupportedOperationException("Cannot execute index query with " + exp); } }
private void processBinaryCondition() { OIndexDefinition definition = index.getDefinition(); OBinaryCompareOperator operator = ((OBinaryCondition) condition).getOperator(); OExpression left = ((OBinaryCondition) condition).getLeft(); if (!left.toString().equalsIgnoreCase("key")) { throw new OCommandExecutionException("search for index for " + condition + " is not supported yet"); } Object rightValue = ((OBinaryCondition) condition).getRight().execute((OResult) null, ctx); cursor = createCursor(operator, definition, rightValue, ctx); }
public int cost(OCommandContext ctx) { OQueryStats stats = OQueryStats.get((ODatabaseDocumentInternal) ctx.getDatabase()); String indexName = idx.getName(); int size = keyCondition.getSubBlocks().size(); boolean range = false; OBooleanExpression lastOp = keyCondition.getSubBlocks().get(keyCondition.getSubBlocks().size() - 1); if (lastOp instanceof OBinaryCondition) { OBinaryCompareOperator op = ((OBinaryCondition) lastOp).getOperator(); range = op.isRangeOperator(); } long val = stats.getIndexStats(indexName, size, range, additionalRangeCondition != null); if (val == -1) { //TODO query the index! } if (val >= 0) { return val > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) val; } return Integer.MAX_VALUE; } }
private long calculateMinClusterPosition() { if (queryPlanning == null || queryPlanning.ridRangeConditions == null || queryPlanning.ridRangeConditions.isEmpty()) { return -1; } long maxValue = -1; for (OBooleanExpression ridRangeCondition : queryPlanning.ridRangeConditions.getSubBlocks()) { if (ridRangeCondition instanceof OBinaryCondition) { OBinaryCondition cond = (OBinaryCondition) ridRangeCondition; ORid condRid = cond.getRight().getRid(); OBinaryCompareOperator operator = cond.getOperator(); if (condRid != null) { if (condRid.getCluster().getValue().intValue() != this.clusterId) { continue; } if (operator instanceof OGtOperator || operator instanceof OGeOperator) { maxValue = Math.max(maxValue, condRid.getPosition().getValue().longValue()); } } } } return maxValue; }
private OCollection indexKeyFrom(OAndBlock keyCondition, OBinaryCondition additional) { OCollection result = new OCollection(-1); for (OBooleanExpression exp : keyCondition.getSubBlocks()) { if (exp instanceof OBinaryCondition) { OBinaryCondition binaryCond = ((OBinaryCondition) exp); OBinaryCompareOperator operator = binaryCond.getOperator(); if ((operator instanceof OEqualsCompareOperator) || (operator instanceof OGtOperator) || (operator instanceof OGeOperator)) { result.add(binaryCond.getRight()); } else if (additional != null) { result.add(additional.getRight()); } } else { throw new UnsupportedOperationException("Cannot execute index query with " + exp); } } return result; }
private void updateIndexStats() { //stats OQueryStats stats = OQueryStats.get((ODatabaseDocumentInternal) ctx.getDatabase()); if (index == null) { return;//this could happen, if not inited yet } String indexName = index.getName(); boolean range = false; int size = 0; if (condition == null) { size = 0; } else if (condition instanceof OBinaryCondition) { size = 1; } else if (condition instanceof OBetweenCondition) { size = 1; range = true; } else if (condition instanceof OAndBlock) { OAndBlock andBlock = ((OAndBlock) condition); size = andBlock.getSubBlocks().size(); OBooleanExpression lastOp = andBlock.getSubBlocks().get(andBlock.getSubBlocks().size() - 1); if (lastOp instanceof OBinaryCondition) { OBinaryCompareOperator op = ((OBinaryCondition) lastOp).getOperator(); range = op.isRangeOperator(); } } else if (condition instanceof OInCondition) { size = 1; } stats.pushIndexStats(indexName, size, range, additionalRangeCondition != null, count); }
private OCollection indexKeyTo(OAndBlock keyCondition, OBinaryCondition additional) { OCollection result = new OCollection(-1); for (OBooleanExpression exp : keyCondition.getSubBlocks()) { if (exp instanceof OBinaryCondition) { OBinaryCondition binaryCond = ((OBinaryCondition) exp); OBinaryCompareOperator operator = binaryCond.getOperator(); if ((operator instanceof OEqualsCompareOperator) || (operator instanceof OLtOperator) || (operator instanceof OLeOperator)) { result.add(binaryCond.getRight()); } else if (additional != null) { result.add(additional.getRight()); } } else { throw new UnsupportedOperationException("Cannot execute index query with " + exp); } } return result; }
private void processBinaryCondition() { OIndexDefinition definition = index.getDefinition(); OBinaryCompareOperator operator = ((OBinaryCondition) condition).getOperator(); OExpression left = ((OBinaryCondition) condition).getLeft(); if (!left.toString().equalsIgnoreCase("key")) { throw new OCommandExecutionException("search for index for " + condition + " is not supported yet"); } Object rightValue = ((OBinaryCondition) condition).getRight().execute((OResult) null, ctx); cursor = createCursor(operator, definition, rightValue, ctx); if (cursor != null) { fetchNextEntry(); } }
private boolean isRidRange(OBooleanExpression booleanExpression, OCommandContext ctx) { if (booleanExpression instanceof OBinaryCondition) { OBinaryCondition cond = ((OBinaryCondition) booleanExpression); OBinaryCompareOperator operator = cond.getOperator(); if (isRangeOperator(operator) && cond.getLeft().toString().equalsIgnoreCase("@rid")) { Object obj; if (cond.getRight().getRid() != null) { obj = cond.getRight().getRid().toRecordId((OResult) null, ctx); } else { obj = cond.getRight().execute((OResult) null, ctx); } return obj instanceof OIdentifiable; } } return false; }
private long calculateMaxClusterPosition() { if (queryPlanning == null || queryPlanning.ridRangeConditions == null || queryPlanning.ridRangeConditions.isEmpty()) { return -1; } long minValue = Long.MAX_VALUE; for (OBooleanExpression ridRangeCondition : queryPlanning.ridRangeConditions.getSubBlocks()) { if (ridRangeCondition instanceof OBinaryCondition) { OBinaryCondition cond = (OBinaryCondition) ridRangeCondition; ORID conditionRid; Object obj; if (((OBinaryCondition) ridRangeCondition).getRight().getRid() != null) { obj = ((OBinaryCondition) ridRangeCondition).getRight().getRid().toRecordId((OResult) null, ctx); } else { obj = ((OBinaryCondition) ridRangeCondition).getRight().execute((OResult) null, ctx); } conditionRid = ((OIdentifiable) obj).getIdentity(); OBinaryCompareOperator operator = cond.getOperator(); if (conditionRid != null) { if (conditionRid.getClusterId() != this.clusterId) { continue; } if (operator instanceof OLtOperator || operator instanceof OLeOperator) { minValue = Math.min(minValue, conditionRid.getClusterPosition()); } } } } return minValue == Long.MAX_VALUE ? -1 : minValue; }
if (exp instanceof OBinaryCondition) { OBinaryCondition binaryCond = ((OBinaryCondition) exp); OBinaryCompareOperator operator = binaryCond.getOperator(); if ((operator instanceof OEqualsCompareOperator) || (operator instanceof OGtOperator) || (operator instanceof OGeOperator) || (operator instanceof OContainsKeyOperator) || (operator instanceof OContainsValueOperator)) {
private boolean clusterMatchesRidRange(String clusterName, OAndBlock ridRangeConditions, ODatabase database, OCommandContext ctx) { int thisClusterId = database.getClusterIdByName(clusterName); for (OBooleanExpression ridRangeCondition : ridRangeConditions.getSubBlocks()) { if (ridRangeCondition instanceof OBinaryCondition) { OBinaryCompareOperator operator = ((OBinaryCondition) ridRangeCondition).getOperator(); ORID conditionRid; Object obj; if (((OBinaryCondition) ridRangeCondition).getRight().getRid() != null) { obj = ((OBinaryCondition) ridRangeCondition).getRight().getRid().toRecordId((OResult) null, ctx); } else { obj = ((OBinaryCondition) ridRangeCondition).getRight().execute((OResult) null, ctx); } conditionRid = ((OIdentifiable) obj).getIdentity(); if (conditionRid != null) { int conditionClusterId = conditionRid.getClusterId(); if (operator instanceof OGtOperator || operator instanceof OGeOperator) { if (thisClusterId < conditionClusterId) { return false; } } else if (operator instanceof OLtOperator || operator instanceof OLeOperator) { if (thisClusterId > conditionClusterId) { return false; } } } } } return true; }