From 831a73466836d2f35ff7f9d5561d939a177f2068 Mon Sep 17 00:00:00 2001 From: wea_ondara Date: Mon, 15 Aug 2022 19:34:28 +0200 Subject: [PATCH] wip --- .../jef/expressions/IncludeExpression.java | 38 ++++++++++ src/main/java/jef/operations/IncludeOp.java | 75 +++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 src/main/java/jef/expressions/IncludeExpression.java create mode 100644 src/main/java/jef/operations/IncludeOp.java diff --git a/src/main/java/jef/expressions/IncludeExpression.java b/src/main/java/jef/expressions/IncludeExpression.java new file mode 100644 index 0000000..d445a5d --- /dev/null +++ b/src/main/java/jef/expressions/IncludeExpression.java @@ -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 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; + } +} diff --git a/src/main/java/jef/operations/IncludeOp.java b/src/main/java/jef/operations/IncludeOp.java new file mode 100644 index 0000000..f61c3a9 --- /dev/null +++ b/src/main/java/jef/operations/IncludeOp.java @@ -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 implements Queryable { + private final Queryable queryable; + private final List includes = new ArrayList<>(); + + public IncludeOp(Queryable queryable, SerializableFunction 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 thenInclude(SerializableFunction fieldSelector) { + var f = parseFunction(fieldSelector); + this.includes.add(new IncludeExpression.Include(f)); + return this; + } + + private FieldExpression parseFunction(SerializableFunction 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"); + } + } +}