@Override public void visit(TreatExpression expression) { sb.append("TREAT("); expression.getExpression().accept(this); sb.append(" AS "); sb.append(expression.getType()); sb.append(')'); }
@Override public Expression visit(TreatExpression expression) { Expression newExpression = expression.getExpression().accept(this); if (newExpression != expression.getExpression()) { return new TreatExpression(newExpression, expression.getType()); } return expression; }
@Override public Expression visit(TreatExpression expression) { expression.setExpression(expression.getExpression().accept(this)); return expression; }
@Override public Expression get() { return target.getExpression(); }
@Override public void visit(TreatExpression expression) { if (jpaProvider.supportsRootTreat()) { super.visit(expression); } else if (jpaProvider.supportsSubtypePropertyResolving()) { // NOTE: this might be wrong when having multiple same named properties expression.getExpression().accept(this); } else { throw new IllegalArgumentException("Can not render treat expression[" + expression.toString() + "] as the JPA provider does not support it!"); } }
@Override public void visit(TreatExpression expression) { EntityType<?> type = metamodel.getEntity(expression.getType()); currentPosition.setAttribute(null); currentPosition.setCurrentType(type); }
@Override public TreatExpression clone(boolean resolved) { return new TreatExpression(expression.clone(resolved), type); }
@Override public void set(Expression expression) { target.setExpression(expression); }
@Override public void visit(TreatExpression expression) { throw new IllegalArgumentException("Treat should not be a root of an expression: " + expression.toString()); }
@Override public Expression get() { return target.getExpression(); }
@Override public TreatExpression clone(boolean resolved) { return new TreatExpression(expression.clone(resolved), type); }
@Override public void set(Expression expression) { target.setExpression(expression); }
@Override public void visit(TreatExpression expression) { sb.append("TREAT("); expression.getExpression().accept(this); sb.append(" AS "); sb.append(expression.getType()); sb.append(')'); }
@Override public Expression visit(TreatExpression expression) { Expression newExpression = expression.getExpression().accept(this); if (newExpression != expression.getExpression()) { return new TreatExpression(newExpression, expression.getType()); } return expression; }
@Override public void visit(TreatExpression expression) { Expression subExpression = expression.getExpression(); boolean beforeContained = expressions.contains(subExpression); subExpression.accept(this); if (expressions.contains(subExpression)) { // If the expression only got added for this TREAT expression, we replace it with the treat expression if (!beforeContained) { expressions.remove(subExpression); } expressions.add(expression); } }
@Override public Expression visit(TreatExpression expression) { expression.setExpression(expression.getExpression().accept(this)); return expression; }
@Override public Expression visitTreated_subpath(Treated_subpathContext ctx) { TreatExpression treatExpression = new TreatExpression(ctx.general_subpath().accept(this), ctx.subtype().getText()); List<General_path_elementContext> followingPaths = ctx.general_path_element(); Expression finalExpression = treatExpression; if (followingPaths.size() > 0) { List<PathElementExpression> pathProperties = new ArrayList<PathElementExpression>(followingPaths.size() + 1); PathExpression path = new PathExpression(pathProperties); pathProperties.add(treatExpression); for (int i = 0; i < followingPaths.size(); i++) { // TODO: Can here be arrays or is it just path elements? pathProperties.add((PathElementExpression) followingPaths.get(i).accept(this)); } finalExpression = path; } return finalExpression; }
@Override public void visit(TreatExpression expression) { boolean handled = false; if (expression.getExpression() instanceof PathExpression) { PathExpression treatPath = (PathExpression) expression.getExpression(); if (treatPath.getExpressions().size() == 1 && skipBaseNodeAlias.equals(treatPath.getExpressions().get(0).toString())) { // When we encounter a naked root treat like "TREAT(alias AS Subtype)" we always skip it handled = true; } } if (!handled) { expression.getExpression().accept(this); } EntityType<?> type = metamodel.getEntity(expression.getType()); // TODO: should we check if the type is actually a sub- or super type? currentPosition.setCurrentType(type); currentPosition.setValueType(type); }
@Override public Expression visit(TreatExpression expression) { expression.getExpression().accept(this); return expression; }
@Override public Expression visitTreated_subpath(Treated_subpathContext ctx) { TreatExpression treatExpression = new TreatExpression(ctx.general_subpath().accept(this), ctx.subtype().getText()); List<General_path_elementContext> followingPaths = ctx.general_path_element(); Expression finalExpression = treatExpression; if (followingPaths.size() > 0) { List<PathElementExpression> pathProperties = new ArrayList<PathElementExpression>(followingPaths.size() + 1); PathExpression path = new PathExpression(pathProperties); pathProperties.add(treatExpression); for (int i = 0; i < followingPaths.size(); i++) { // TODO: Can here be arrays or is it just path elements? pathProperties.add((PathElementExpression) followingPaths.get(i).accept(this)); } finalExpression = path; } return finalExpression; }