public UpdatableExpressionVisitor(EntityMetamodel metamodel, Class<?> startClass, boolean updatable) { super(metamodel, metamodel.type(startClass), null); this.updatable = updatable; }
@Override public void visit(StringLiteral expression) { currentPosition.setCurrentType(metamodel.type(String.class)); }
@Override public void visit(BooleanLiteral expression) { currentPosition.setCurrentType(metamodel.type(Boolean.class)); }
@Override public void visit(DateLiteral expression) { currentPosition.setCurrentType(metamodel.type(Date.class)); }
@Override public void visit(TimestampLiteral expression) { currentPosition.setCurrentType(metamodel.type(Date.class)); }
@Override public void visit(TimeLiteral expression) { currentPosition.setCurrentType(metamodel.type(Date.class)); }
@Override public void visit(TrimExpression expression) { currentPosition.setAttribute(null); currentPosition.setCurrentType(metamodel.type(String.class)); }
private void resolveToFunctionReturnType(String functionName) { JpqlFunction function = functions.get(functionName.toLowerCase()); if (function == null) { return; } List<PathPosition> currentPositions = pathPositions; int positionsSize = currentPositions.size(); for (int i = 0; i < positionsSize; i++) { PathPosition position = currentPositions.get(i); Class<?> returnType = function.getReturnType(position.getCurrentClass()); position.setAttribute(null); position.setCurrentType(metamodel.type(returnType)); } }
private Type<?> getType(Type<?> baseType, Attribute<?, ?> attribute) { if (attribute instanceof PluralAttribute<?, ?, ?>) { return metamodel.type(((PluralAttribute<?, ?, ?>) attribute).getJavaType()); } Class<?> baseClass = baseType.getJavaType(); if (baseClass != null) { Class<?> clazz = JpaMetamodelUtils.resolveFieldClass(baseType.getJavaType(), attribute); if (clazz != null) { return metamodel.type(clazz); } } return ((SingularAttribute<?, ?>) attribute).getType(); }
private Type<?> getType(Type<?> baseType, Attribute<?, ?> attribute) { if (attribute instanceof PluralAttribute<?, ?, ?>) { return metamodel.type(((PluralAttribute<?, ?, ?>) attribute).getJavaType()); } Class<?> baseClass = baseType.getJavaType(); if (baseClass != null) { Class<?> clazz = JpaMetamodelUtils.resolveFieldClass(baseType.getJavaType(), attribute); if (clazz != null) { return metamodel.type(clazz); } } return ((SingularAttribute<?, ?>) attribute).getType(); }
@Override public void visit(ArithmeticExpression expression) { if (expression.getNumericType() != null) { currentPosition.setCurrentType(metamodel.type(expression.getNumericType().getJavaType())); } }
@Override public void visit(ArithmeticFactor expression) { if (expression.getNumericType() != null) { currentPosition.setCurrentType(metamodel.type(expression.getNumericType().getJavaType())); } }
@Override public void visit(NumericLiteral expression) { if (expression.getNumericType() != null) { currentPosition.setCurrentType(metamodel.type(expression.getNumericType().getJavaType())); } }
@Override public void visit(FunctionExpression expression) { String name = expression.getFunctionName(); if ("FUNCTION".equalsIgnoreCase(name)) { // Skip the function name resolveFirst(expression.getExpressions().subList(1, expression.getExpressions().size()), true); resolveToFunctionReturnType(((StringLiteral) expression.getExpressions().get(0)).getValue()); } else if (ExpressionUtils.isSizeFunction(expression)) { // According to our grammar, we can only get a path here currentPosition.setAttribute(null); currentPosition.setCurrentType(metamodel.type(Long.class)); } else { resolveFirst(expression.getExpressions(), true); resolveToFunctionReturnType(name); } }
@Override public void visit(MapEntryExpression expression) { expression.getPath().accept(this); currentPosition.setAttribute(new MapEntryAttribute<>((MapAttribute<?, Object, ?>) currentPosition.getAttribute())); currentPosition.setCurrentType(metamodel.type(Map.Entry.class)); }
@Override public void visit(MapEntryExpression expression) { expression.getPath().accept(this); if (!(currentPosition.getAttribute() instanceof MapAttribute<?, ?, ?>)) { invalid(expression, "Does not resolve to java.util.Map!"); } else { currentPosition.setAttribute(null); currentPosition.setCurrentType(metamodel.type(Map.Entry.class)); } }
@Override public void visit(MapEntryExpression expression) { expression.getPath().accept(this); currentPosition.setAttribute(new MapEntryAttribute<>((MapAttribute<?, Object, ?>) currentPosition.getAttribute())); currentPosition.setCurrentType(metamodel.type(Map.Entry.class)); }
@Override public void visit(ListIndexExpression expression) { expression.getPath().accept(this); Class<?> type = currentPosition.getRealCurrentClass(); if (!List.class.isAssignableFrom(type)) { invalid(expression, "Does not resolve to java.util.List!"); } else { currentPosition.setAttribute(new ListIndexAttribute<>((ListAttribute<?, ?>) currentPosition.getAttribute())); currentPosition.setValueType(null); currentPosition.setKeyType(metamodel.type(Integer.class)); } }
@Override public void visit(ListIndexExpression expression) { expression.getPath().accept(this); Class<?> type = currentPosition.getRealCurrentClass(); if (!List.class.isAssignableFrom(type)) { invalid(expression, "Does not resolve to java.util.List!"); } else { currentPosition.setAttribute(new ListIndexAttribute<>((ListAttribute<?, ?>) currentPosition.getAttribute())); currentPosition.setValueType(null); currentPosition.setKeyType(metamodel.type(Integer.class)); } }
@Override public void visit(ListIndexExpression expression) { expression.getPath().accept(this); if (!(currentPosition.getAttribute() instanceof ListAttribute<?, ?>)) { invalid(expression, "Does not resolve to java.util.List!"); } else { currentPosition.setAttribute(new ListIndexAttribute<>((ListAttribute<?, ?>) currentPosition.getAttribute())); currentPosition.setCurrentType(metamodel.type(Integer.class)); } }