/** * Create a new root variable based on the given path and suffix * * @param path base path * @param suffix suffix for variable name * @return path expression */ public static String createRootVariable(Path<?> path, int suffix) { String variable = path.accept(ToStringVisitor.DEFAULT, TEMPLATES); return variable + "_" + suffix; }
/** * Create a new root variable based on the given path * * @param path base path * @return variable name */ public static String createRootVariable(Path<?> path) { return path.accept(ToStringVisitor.DEFAULT, TEMPLATES); }
private Path<?> normalizePath(Path<?> expr) { Context context = new Context(); Path<?> replaced = (Path<?>) expr.accept(collectionAnyVisitor, context); if (!replaced.equals(expr)) { for (int i = 0; i < context.paths.size(); i++) { Path path = context.paths.get(i).getMetadata().getParent(); Path replacement = context.replacements.get(i); this.innerJoin(path, replacement); } return replaced; } else { return expr; } }
@Override public Expression<?> visit(Path<?> expr, C context) { if (expr.getMetadata().isRoot()) { return expr; } else { PathMetadata metadata = expr.getMetadata(); Path<?> parent = (Path) metadata.getParent().accept(this, context); Object element = metadata.getElement(); if (element instanceof Expression<?>) { element = ((Expression<?>) element).accept(this, context); } if (parent.equals(metadata.getParent()) && Objects.equal(element, metadata.getElement())) { return expr; } else { metadata = new PathMetadata(parent, element, metadata.getPathType()); return ExpressionUtils.path(expr.getType(), metadata); } } }
append("("); append("(").append(path.getType().getName()).append(")"); path.getMetadata().getParent().accept(this, context); append(")");
@Override public Expression<?> visit(Path<?> expr, Context context) { if (expr.getMetadata().getPathType() == PathType.COLLECTION_ANY) { Path<?> parent = (Path<?>) expr.getMetadata().getParent().accept(this, context); expr = ExpressionUtils.path(expr.getType(), PathMetadataFactory.forCollectionAny(parent)); EntityPath<?> replacement = new EntityPathBase<Object>(expr.getType(), ExpressionUtils.createRootVariable(expr, replacedCounter++)); context.add(expr, replacement); return replacement; } else if (expr.getMetadata().getParent() != null) { Context c = new Context(); Path<?> parent = (Path<?>) expr.getMetadata().getParent().accept(this, c); if (c.replace) { context.add(c); return replaceParent(expr, parent); } } return expr; }
@SuppressWarnings("unchecked") @Test public void various() { List<Path<?>> paths = new ArrayList<Path<?>>(); paths.add(new ArrayPath(String[].class, "p")); paths.add(new BeanPath(Object.class, "p")); paths.add(new BooleanPath("p")); paths.add(new CollectionPath(String.class, StringPath.class, "p")); paths.add(new ComparablePath(String.class,"p")); paths.add(new DatePath(Date.class,"p")); paths.add(new DateTimePath(Date.class,"p")); paths.add(new EnumPath(ExampleEnum.class,"p")); paths.add(new ListPath(String.class, StringPath.class, "p")); paths.add(new MapPath(String.class, String.class, StringPath.class, "p")); paths.add(new NumberPath(Integer.class,"p")); paths.add(new SetPath(String.class, StringPath.class, "p")); paths.add(new SimplePath(String.class,"p")); paths.add(new StringPath("p")); paths.add(new TimePath(Time.class,"p")); for (Path<?> path : paths) { Path other = ExpressionUtils.path(path.getType(), "p"); assertEquals(path.toString(), path.accept(ToStringVisitor.DEFAULT, null)); assertEquals(path.hashCode(), other.hashCode()); assertEquals(path, other); assertNotNull(path.getMetadata()); assertNotNull(path.getType()); assertEquals(path, path.getRoot()); } }
@SuppressWarnings("unchecked") @Test public void various_properties() { Path<?> parent = ExpressionUtils.path(Object.class, "parent"); List<Path<?>> paths = new ArrayList<Path<?>>(); paths.add(new ArrayPath(String[].class, parent, "p")); paths.add(new BeanPath(Object.class, parent, "p")); paths.add(new BooleanPath(parent, "p")); paths.add(new CollectionPath(String.class, StringPath.class, parent, "p")); paths.add(new ComparablePath(String.class, parent, "p")); paths.add(new DatePath(Date.class, parent, "p")); paths.add(new DateTimePath(Date.class, parent, "p")); paths.add(new EnumPath(ExampleEnum.class, parent, "p")); paths.add(new ListPath(String.class, StringPath.class, parent, "p")); paths.add(new MapPath(String.class, String.class, StringPath.class, parent, "p")); paths.add(new NumberPath(Integer.class, parent, "p")); paths.add(new SetPath(String.class, StringPath.class, parent, "p")); paths.add(new SimplePath(String.class, parent, "p")); paths.add(new StringPath(parent, "p")); paths.add(new TimePath(Time.class, parent, "p")); for (Path<?> path : paths) { Path other = ExpressionUtils.path(path.getType(), PathMetadataFactory.forProperty(parent, "p")); assertEquals(path.toString(), path.accept(ToStringVisitor.DEFAULT, Templates.DEFAULT)); assertEquals(path.hashCode(), other.hashCode()); assertEquals(path, other); assertNotNull(path.getMetadata()); assertNotNull(path.getType()); assertEquals(parent, path.getRoot()); } }
/** * Create a new root variable based on the given path and suffix * * @param path base path * @param suffix suffix for variable name * @return path expression */ public static String createRootVariable(Path<?> path, int suffix) { String variable = path.accept(ToStringVisitor.DEFAULT, TEMPLATES); return variable + "_" + suffix; }
/** * Create a new root variable based on the given path * * @param path base path * @return variable name */ public static String createRootVariable(Path<?> path) { return path.accept(ToStringVisitor.DEFAULT, TEMPLATES); }
private Path<?> normalizePath(Path<?> expr) { Context context = new Context(); Path<?> replaced = (Path<?>) expr.accept(collectionAnyVisitor, context); if (!replaced.equals(expr)) { for (int i = 0; i < context.paths.size(); i++) { Path path = context.paths.get(i).getMetadata().getParent(); Path replacement = context.replacements.get(i); this.innerJoin(path, replacement); } return replaced; } else { return expr; } }
@Override public Set<RelationalPath<?>> visit(Path<?> expr, Set<RelationalPath<?>> known) { if (expr.getMetadata().isRoot()) { if (expr instanceof RelationalPath) { known = add(known, (RelationalPath<?>) expr); } } else { known = expr.getMetadata().getParent().accept(this, known); } return known; }
@Override public Expression<?> visit(Path<?> expr, C context) { if (expr.getMetadata().isRoot()) { return expr; } else { PathMetadata metadata = expr.getMetadata(); Path<?> parent = (Path) metadata.getParent().accept(this, context); Object element = metadata.getElement(); if (element instanceof Expression<?>) { element = ((Expression<?>) element).accept(this, context); } if (parent.equals(metadata.getParent()) && Objects.equal(element, metadata.getElement())) { return expr; } else { metadata = new PathMetadata(parent, element, metadata.getPathType()); return ExpressionUtils.path(expr.getType(), metadata); } } }
@Override public Expression<?> visit(Path<?> expr, Context context) { if (expr.getMetadata().getPathType() == PathType.COLLECTION_ANY) { Path<?> parent = (Path<?>) expr.getMetadata().getParent().accept(this, context); expr = ExpressionUtils.path(expr.getType(), PathMetadataFactory.forCollectionAny(parent)); EntityPath<?> replacement = new EntityPathBase<Object>(expr.getType(), ExpressionUtils.createRootVariable(expr, replacedCounter++)); context.add(expr, replacement); return replacement; } else if (expr.getMetadata().getParent() != null) { Context c = new Context(); Path<?> parent = (Path<?>) expr.getMetadata().getParent().accept(this, c); if (c.replace) { context.add(c); return replaceParent(expr, parent); } } return expr; }
append("("); append("(").append(path.getType().getName()).append(")"); path.getMetadata().getParent().accept(this, context); append(")");