This commit is contained in:
wea_ondara
2022-08-15 19:34:28 +02:00
parent d532d92c0f
commit 831a734668
2 changed files with 113 additions and 0 deletions

View File

@@ -0,0 +1,38 @@
package jef.expressions;
import jef.expressions.selectable.DatabaseSelectAllExpression;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.ArrayList;
import java.util.List;
@Getter
@AllArgsConstructor
public class IncludeExpression implements Expression {
private final Expression expr;
private final List<Include> includes;
@Override
public Type getType() {
return Type.INCLUDE;
}
@Override
public Priority getPriority() {
return Priority.UNDEFINED;
}
@Override
public String toString() {
var ret = new SelectExpression(List.of(new DatabaseSelectAllExpression()), expr, "").toString();
ret += " LEFT JOIN "
return ret;
}
@Getter
@AllArgsConstructor
public static class Include {
private final FieldExpression expr;
}
}

View File

@@ -0,0 +1,75 @@
package jef.operations;
import jef.Queryable;
import jef.asm.AsmParseException;
import jef.asm.AsmParser;
import jef.expressions.Expression;
import jef.expressions.FieldExpression;
import jef.expressions.SelectExpression;
import jef.expressions.modifier.ExpressionOptimizerBottomUp;
import jef.expressions.modifier.IConst0Fixer;
import jef.expressions.modifier.TableAliasInjector;
import jef.expressions.modifier.TernaryRewriter;
import jef.expressions.selectable.DatabaseSelectAllExpression;
import jef.serializable.SerializableFunction;
import lombok.AllArgsConstructor;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
@AllArgsConstructor
public class IncludeOp<T extends Serializable, I> implements Queryable<T> {
private final Queryable<T> queryable;
private final List<IncludeExpression.Include> includes = new ArrayList<>();
public IncludeOp(Queryable<T> queryable, SerializableFunction<? super T, ?> fieldSelector) {
this.queryable = queryable;
var f = parseFunction(fieldSelector);
this.includes.add(new IncludeExpression.Include(f, direction));
}
@Override
public String getTableAlias() {
return String.valueOf((char) (queryable.getTableAlias().charAt(0) + (char) 1));
}
@Override
public Expression getExpression() {
return new IncludeExpression(new SelectExpression(List.of(new DatabaseSelectAllExpression()), queryable.getExpression(), getTableAlias()), includes);
}
@Override
public String toString() {
return getExpression().toString();
}
public IncludeOp<T, I> thenInclude(SerializableFunction<? super T, ?> fieldSelector) {
var f = parseFunction(fieldSelector);
this.includes.add(new IncludeExpression.Include(f));
return this;
}
private FieldExpression parseFunction(SerializableFunction<? super T, ?> fieldSelector) {
var parser = new AsmParser(fieldSelector);
Expression expr;
try {
expr = parser.parse();
} catch (AsmParseException e) {
throw new RuntimeException(e);
}
System.out.println(expr);
expr = new TernaryRewriter().modify(expr);
System.out.println(expr);
expr = new IConst0Fixer().modify(expr);
System.out.println(expr);
// expr = new ExpressionOptimizer().modify(expr);
expr = new ExpressionOptimizerBottomUp().modify(expr);
expr = new TableAliasInjector(getTableAlias()).modify(expr);
if (expr instanceof FieldExpression f) {
return f;
} else {
throw new RuntimeException(expr + " is not a field");
}
}
}