Skip to content

Commit

Permalink
Criteria. Make Path a concrete class and enrich with fluent methods
Browse files Browse the repository at this point in the history
  • Loading branch information
asereda-gs committed May 24, 2019
1 parent 9fe85f9 commit baba31e
Show file tree
Hide file tree
Showing 7 changed files with 63 additions and 27 deletions.
Expand Up @@ -38,7 +38,7 @@ public R create() {
* adds an intermediate step (list of paths usually) * adds an intermediate step (list of paths usually)
*/ */
public CriteriaContext<R> add(Path path) { public CriteriaContext<R> add(Path path) {
final Path newPath = this.path != null ? Expressions.path(this.path.path() + "." + path.path()) : path; final Path newPath = this.path != null ? this.path.concat(path) : path;
return new CriteriaContext<>(operator, expression, newPath, creator); return new CriteriaContext<>(operator, expression, newPath, creator);
} }


Expand Down
Expand Up @@ -40,7 +40,7 @@ public Void visit(Literal literal) {
@Override @Override
public Void visit(Path path) { public Void visit(Path path) {
writer.print(" path="); writer.print(" path=");
writer.print(path.path()); writer.print(path.toStringPath());
return null; return null;
} }
} }
Expand Up @@ -19,20 +19,7 @@ public final class Expressions {
private Expressions() {} private Expressions() {}


public static Path path(final String path) { public static Path path(final String path) {
Preconditions.checkNotNull(path, "path"); return Path.of(path);

return new Path() {
@Override
public String path() {
return path;
}

@Nullable
@Override
public <R, C> R accept(ExpressionBiVisitor<R, C> visitor, @Nullable C context) {
return visitor.visit(this, context);
}
};
} }


public static Literal nullLiteral(Class<?> type) { public static Literal nullLiteral(Class<?> type) {
Expand Down
55 changes: 52 additions & 3 deletions criteria/common/src/org/immutables/criteria/constraints/Path.java
@@ -1,10 +1,59 @@
package org.immutables.criteria.constraints; package org.immutables.criteria.constraints;


import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;

import javax.annotation.Nullable;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

/** /**
* Access to a field. * Access to a property possibly via several paths like {@code foo.bar.qux}
*/ */
public interface Path extends Expression { public final class Path implements Expression {

private final ImmutableList<String> paths;

private Path(List<String> paths) {
this.paths = ImmutableList.copyOf(paths);
}

public List<String> paths() {
return paths;
}

public Path add(String path) {
Objects.requireNonNull(path, "path");
Preconditions.checkArgument(!path.isEmpty(), "empty path");
return new Path(ImmutableList.<String>builder().addAll(paths).add(path).build());
}

public Path concat(Path other) {
Objects.requireNonNull(other, "other");
return new Path(ImmutableList.<String>builder().addAll(this.paths).addAll(other.paths).build());
}

public static Path of(String path) {
Objects.requireNonNull(path);
return new Path(Collections.singletonList(path));
}

/**
* Returns current path in java bean format: {@code foo.bar.qux}
*/
public String toStringPath() {
return String.join(".", paths());
}


String path(); @Override
public String toString() {
return toStringPath();
}


@Nullable
@Override
public <R, C> R accept(ExpressionBiVisitor<R, C> visitor, @Nullable C context) {
return visitor.visit(this, context);
}
} }
Expand Up @@ -77,7 +77,7 @@ public String visit(Literal literal) {


@Override @Override
public String visit(Path path) { public String visit(Path path) {
return path.path(); return path.toStringPath();
} }
} }
} }
Expand Up @@ -193,13 +193,13 @@ public Object visit(Literal literal) {


@Override @Override
public Object visit(Path path) { public Object visit(Path path) {
return extractor.extract(path.path()); return extractor.extract(path);
} }
} }


private interface ValueExtractor<T> { private interface ValueExtractor<T> {
@Nullable @Nullable
Object extract(String property); Object extract(Path path);
} }


private static class ReflectionFieldExtractor<T> implements ValueExtractor<T> { private static class ReflectionFieldExtractor<T> implements ValueExtractor<T> {
Expand All @@ -211,20 +211,19 @@ private ReflectionFieldExtractor(T object) {


@Nullable @Nullable
@Override @Override
public Object extract(String property) { public Object extract(Path path) {
Objects.requireNonNull(property, "property"); Objects.requireNonNull(path, "path");


Object result = object; Object result = object;


for (String name:property.split("\\.")) { for (String name:path.paths()) {
result = extract(result, name); result = extract(result, name);
if (result == UNKNOWN) { if (result == UNKNOWN) {
break; break;
} }
} }


return result; return result;

} }


private static Object extract(Object instance, String property) { private static Object extract(Object instance, String property) {
Expand All @@ -247,6 +246,7 @@ private static Object extract(Object instance, String property) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
} }

} }


} }
Expand Up @@ -96,6 +96,6 @@ public BsonValue visit(Literal literal) {


@Override @Override
public BsonString visit(Path path) { public BsonString visit(Path path) {
return new BsonString(path.path()); return new BsonString(path.toStringPath());
} }
} }

0 comments on commit baba31e

Please sign in to comment.