private static boolean isCountOnly(QueryPlanningInfo info) { if (info.aggregateProjection == null || info.projection == null || info.aggregateProjection.getItems().size() != 1 || info.projection.getItems().size() != 1) { return false; } OProjectionItem item = info.aggregateProjection.getItems().get(0); OExpression exp = item.getExpression(); if (exp.getMathExpression() != null && exp.getMathExpression() instanceof OBaseExpression) { OBaseExpression base = (OBaseExpression) exp.getMathExpression(); return base.isCount() && base.getModifier() == null; } return false; }
private Object calculateNewValue(OResultInternal doc, OCommandContext ctx, OMathExpression.Operator explicitOperator) { OExpression leftEx = new OExpression(left.copy()); if (leftModifier != null) { ((OBaseExpression) leftEx.mathExpression).modifier = leftModifier.copy(); } OMathExpression mathExp = new OMathExpression(-1); mathExp.getChildExpressions().add(leftEx.getMathExpression()); mathExp.getChildExpressions().add(new OParenthesisExpression(right.copy())); mathExp.getOperators().add(explicitOperator); return mathExp.execute(doc, ctx); }
return false; if (item.getExpression().getMathExpression() == null) { return false; if (!(item.getExpression().getMathExpression() instanceof OBaseExpression)) { return false; OBaseExpression base = (OBaseExpression) item.getExpression().getMathExpression(); if (base.getIdentifier() == null) { return false;
/** * for backward compatibility, translate "distinct(foo)" to "DISTINCT foo". This method modifies the projection itself. * * @param projection the projection */ protected static OProjection translateDistinct(OProjection projection) { if (projection != null && projection.getItems().size() == 1) { if (isDistinct(projection.getItems().get(0))) { projection = projection.copy(); OProjectionItem item = projection.getItems().get(0); OFunctionCall function = ((OBaseExpression) item.getExpression().getMathExpression()).getIdentifier().getLevelZero() .getFunctionCall(); OExpression exp = function.getParams().get(0); OProjectionItem resultItem = new OProjectionItem(-1); resultItem.setAlias(item.getAlias()); resultItem.setExpression(exp.copy()); OProjection result = new OProjection(-1); result.setItems(new ArrayList<>()); result.setDistinct(true); result.getItems().add(resultItem); return result; } } return projection; }