Skip to content

Commit

Permalink
Use PathNaming strategy in Geode backend (not publically exposed yet)
Browse files Browse the repository at this point in the history
  • Loading branch information
asereda-gs committed Oct 18, 2019
1 parent 2a0643b commit c823959
Show file tree
Hide file tree
Showing 6 changed files with 26 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
import org.immutables.criteria.expression.Path;

/**
* Strategy represent {@link Path}s as String.
* Strategy to represent a {@link Path}s as String (eg {@code foo.bar.qux})
*
* @see org.immutables.criteria.Criteria.Id
*/
Expand All @@ -28,10 +28,13 @@ public interface PathNaming extends NamingStrategy<Path> {
/**
* Return name of a field (aka {@link Path}) like {@code a.b.c} or {@code _id}.
* Should take in consideration {@code ID} naming properties of the backend.
* @param path
* @param path path to be converted to string
* @return path representation as string
*/
@Override
String name(Path path);

static PathNaming defaultNaming() {
return Path::toStringPath;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import org.immutables.criteria.backend.DefaultResult;
import org.immutables.criteria.backend.IdExtractor;
import org.immutables.criteria.backend.IdResolver;
import org.immutables.criteria.backend.PathNaming;
import org.immutables.criteria.backend.StandardOperations;
import org.immutables.criteria.backend.WatchEvent;
import org.immutables.criteria.expression.AggregationCall;
Expand All @@ -49,16 +50,18 @@ public class GeodeBackend implements Backend {
static final Logger logger = Logger.getLogger(GeodeBackend.class.getName());

private final GeodeSetup setup;
private final PathNaming pathNaming;


public GeodeBackend(GeodeSetup setup) {
this.setup = Objects.requireNonNull(setup, "setup");
this.pathNaming = PathNaming.defaultNaming();
}

@Override
public Backend.Session open(Class<?> entityType) {
Objects.requireNonNull(entityType, "context");
return new Session(entityType, setup);
return new Session(entityType, this);
}

static class Session implements Backend.Session {
Expand All @@ -68,15 +71,18 @@ static class Session implements Backend.Session {
final IdExtractor idExtractor;
final IdResolver idResolver;
final QueryService queryService;
final PathNaming pathNaming;

private Session(Class<?> entityType, GeodeSetup setup) {
private Session(Class<?> entityType, GeodeBackend backend) {
this.entityType = Objects.requireNonNull(entityType, "entityType");
GeodeSetup setup = backend.setup;
@SuppressWarnings("unchecked")
Region<Object, Object> region = (Region<Object, Object>) setup.regionResolver().resolve(entityType);
this.region = region;
this.idResolver = setup.idResolver();
this.idExtractor = IdExtractor.fromResolver(idResolver);
this.queryService = setup.queryServiceResolver().resolve(region);
this.pathNaming = backend.pathNaming;
}

@Override
Expand Down Expand Up @@ -140,7 +146,7 @@ OqlWithVariables toOql(Query query, boolean useBindVariables) {
oql.append(" FROM ").append(region.getFullPath());
final List<Object> variables = new ArrayList<>();
if (query.filter().isPresent()) {
OqlWithVariables withVars = Geodes.converter(useBindVariables).convert(query.filter().get());
OqlWithVariables withVars = Geodes.converter(useBindVariables, pathNaming).convert(query.filter().get());
oql.append(" WHERE ").append(withVars.oql());
variables.addAll(withVars.variables());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableSet;
import org.immutables.criteria.backend.PathNaming;
import org.immutables.criteria.expression.AbstractExpressionVisitor;
import org.immutables.criteria.expression.Call;
import org.immutables.criteria.expression.ComparableOperators;
Expand All @@ -34,7 +35,6 @@
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
Expand All @@ -43,7 +43,7 @@
*/
class GeodeQueryVisitor extends AbstractExpressionVisitor<OqlWithVariables> {

private final Function<Path, String> pathFn;
private final PathNaming pathNaming;

/**
* Bind variables. Remains empty if variables are not used
Expand All @@ -55,13 +55,9 @@ class GeodeQueryVisitor extends AbstractExpressionVisitor<OqlWithVariables> {
/**
* @param useBindVariables wherever query should be generated with bind variables or not
*/
GeodeQueryVisitor(boolean useBindVariables) {
this(useBindVariables, Path::toStringPath);
}

GeodeQueryVisitor(boolean useBindVariables, Function<Path, String> pathFn) {
GeodeQueryVisitor(boolean useBindVariables, PathNaming pathNaming) {
super(e -> { throw new UnsupportedOperationException(); });
this.pathFn = Objects.requireNonNull(pathFn, "pathFn");
this.pathNaming = Objects.requireNonNull(pathNaming, "pathFn");
this.variables = new ArrayList<>();
this.useBindVariables = useBindVariables;
}
Expand Down Expand Up @@ -111,7 +107,7 @@ private OqlWithVariables unaryOperator(Call call) {
Preconditions.checkArgument(args.size() == 1, "Size should be == 1 for %s but was %s", op, args.size());
final Path path = Visitors.toPath(args.get(0));
final String isNull = op == OptionalOperators.IS_PRESENT ? "!= null" : "= null";
return oql(pathFn.apply(path) + " " + isNull);
return oql(pathNaming.name(path) + " " + isNull);
} else if (op == Operators.NOT) {
return oql("NOT (" + args.get(0).accept(this).oql() + ")");
}
Expand Down Expand Up @@ -156,10 +152,10 @@ private OqlWithVariables binaryOperator(Call call) {
if (useBindVariables) {
variables.add(variable);
// bind variables in Geode start at index 1: $1, $2, $3 etc.
return oql(String.format("%s %s $%d", pathFn.apply(path), operator, variables.size()));
return oql(String.format("%s %s $%d", pathNaming.name(path), operator, variables.size()));
}

return oql(String.format("%s %s %s", pathFn.apply(path), operator, toString(variable)));
return oql(String.format("%s %s %s", pathNaming.name(path), operator, toString(variable)));
}

/**
Expand Down
5 changes: 3 additions & 2 deletions criteria/geode/src/org/immutables/criteria/geode/Geodes.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import com.google.common.base.Preconditions;
import org.apache.geode.cache.Region;
import org.immutables.criteria.backend.IdResolver;
import org.immutables.criteria.backend.PathNaming;
import org.immutables.criteria.backend.ProjectedTuple;
import org.immutables.criteria.expression.Call;
import org.immutables.criteria.expression.Constant;
Expand Down Expand Up @@ -46,8 +47,8 @@ final class Geodes {
*
* @return predicate, empty string if no predicate
*/
static ExpressionConverter<OqlWithVariables> converter(boolean useBindVariables) {
return expression -> expression.accept(new GeodeQueryVisitor(useBindVariables));
static ExpressionConverter<OqlWithVariables> converter(boolean useBindVariables, PathNaming pathNaming) {
return expression -> expression.accept(new GeodeQueryVisitor(useBindVariables, pathNaming));
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public WriteResult call() throws Exception {
return deleteByKeys(ids.get());
}

GeodeQueryVisitor visitor = new GeodeQueryVisitor(true, path -> String.format("e.value.%s", path.toStringPath()));
GeodeQueryVisitor visitor = new GeodeQueryVisitor(true, path -> String.format("e.value.%s", session.pathNaming.name(path)));
OqlWithVariables oql = filter.accept(visitor);

// delete by query. Perform separate query to get list of IDs
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import java.util.stream.Collectors;

class SyncSelect implements Callable<Iterable<Object>> {


/**
* Convert Geode specific {@link QueryService#UNDEFINED} value to null
Expand Down

0 comments on commit c823959

Please sign in to comment.