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)
*/
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);
}

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

public static Path path(final String path) {
Preconditions.checkNotNull(path, "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);
}
};
return Path.of(path);
}

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;

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
public String visit(Path path) {
return path.path();
return path.toStringPath();
}
}
}
Expand Up @@ -193,13 +193,13 @@ public Object visit(Literal literal) {

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

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

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

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

Object result = object;

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

return result;

}

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);
}
}

}

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

@Override
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.