Skip to content

Commit 7b58ce7

Browse files
committed
implements QFromMapper
1 parent 5f522fc commit 7b58ce7

30 files changed

Lines changed: 1050 additions & 157 deletions
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package org.slowcoders.hyperquery.core;
2+
3+
import org.slowcoders.hyperquery.impl.AliasNode;
4+
5+
public class QAttribute extends AliasNode {
6+
7+
public QAttribute(String hyperExpr) {
8+
super(hyperExpr);
9+
}
10+
11+
public static QAttribute of(String statement) {
12+
return new QAttribute(statement);
13+
}
14+
15+
}

hyperquery/src/main/java/org/slowcoders/hyperquery/core/QFilter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
package org.slowcoders.hyperquery.core;
22

3+
import org.slowcoders.hyperquery.impl.HFilter;
34
import org.slowcoders.hyperquery.impl.QCriteria;
45
import org.slowcoders.hyperquery.impl.SqlBuilder;
56

67
import java.lang.annotation.Repeatable;
78
import java.lang.annotation.Retention;
89
import java.lang.annotation.RetentionPolicy;
910

10-
public class QFilter<T extends QEntity<?>> {
11+
public class QFilter<T extends QEntity<?>> extends HFilter {
1112

1213
@Retention(RetentionPolicy.RUNTIME)
1314
public @interface Predicate {
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package org.slowcoders.hyperquery.core;
2+
3+
import java.lang.annotation.Retention;
4+
import java.lang.annotation.RetentionPolicy;
5+
6+
@Retention(RetentionPolicy.RUNTIME)
7+
public @interface QFilterParameters {
8+
String[] value();
9+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.slowcoders.hyperquery.core;
2+
3+
import java.lang.annotation.Retention;
4+
import java.lang.annotation.RetentionPolicy;
5+
6+
@Retention(RetentionPolicy.RUNTIME)
7+
public @interface QFromMapper {
8+
Class<?> mapper() default void.class;
9+
10+
String sqlId();
11+
12+
Class<?> parameterType() default void.class;
13+
}

hyperquery/src/main/java/org/slowcoders/hyperquery/core/QInlineView.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import org.slowcoders.hyperquery.impl.HModel;
44
import org.slowcoders.hyperquery.impl.HSchema;
5+
import org.slowcoders.hyperquery.impl.ViewResolver;
56

67
public class QInlineView extends HModel {
78

@@ -18,7 +19,7 @@ protected HSchema loadSchema() {
1819
}
1920

2021
@Override
21-
protected String getQuery() {
22+
protected String getQuery(ViewResolver viewResolver) {
2223
return viewDefinition;
2324
}
2425

hyperquery/src/main/java/org/slowcoders/hyperquery/core/QJoin.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package org.slowcoders.hyperquery.core;
22

3+
import org.slowcoders.hyperquery.impl.AliasNode;
34
import org.slowcoders.hyperquery.impl.HModel;
45
import org.slowcoders.hyperquery.impl.HSchema;
56

6-
public class QJoin {
7+
public class QJoin extends AliasNode {
78

89
public enum JoinType {
910
Inner,
@@ -13,27 +14,26 @@ public enum JoinType {
1314
Right,
1415
Cross
1516
}
16-
private final String joinCriteria;
1717
private HModel model;
1818
private final boolean toUnique;
1919
private Class<? extends QEntity<?>> viewType;
2020

2121
// Cross Join 은 지원하지 읺는다.
2222
protected QJoin(QInlineView inlineView, String joinOn, boolean toUnique) {
23+
super(joinOn);
2324
this.viewType = HiddenView.class;
2425
this.model = inlineView;
25-
this.joinCriteria = joinOn;
2626
this.toUnique = toUnique;
2727
}
2828

2929
protected QJoin(Class<? extends QEntity<?>> viewType, String joinOn, boolean toUnique) {
30+
super(joinOn);
3031
this.viewType = viewType;
31-
this.joinCriteria = joinOn;
3232
this.toUnique = toUnique;
3333
}
3434

3535
public String getJoinCriteria() {
36-
return joinCriteria;
36+
return super.getEncodedExpr();
3737
}
3838
public boolean isToUnique() { return toUnique; }
3939

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package org.slowcoders.hyperquery.core;
2+
3+
import org.antlr.v4.runtime.CharStreams;
4+
import org.antlr.v4.runtime.CommonTokenStream;
5+
import org.antlr.v4.runtime.tree.ErrorNode;
6+
import org.antlr.v4.runtime.tree.ParseTree;
7+
import org.antlr.v4.runtime.tree.TerminalNode;
8+
import org.slowcoders.hql.core.antlr.LambdaBaseVisitor;
9+
import org.slowcoders.hql.core.antlr.LambdaLexer;
10+
import org.slowcoders.hql.core.antlr.LambdaParser;
11+
import org.slowcoders.hyperquery.impl.AliasNode;
12+
import org.slowcoders.hyperquery.impl.SqlBuilder;
13+
14+
import java.util.ArrayList;
15+
import java.util.List;
16+
17+
public class QLambda extends AliasNode {
18+
private final int argCount;
19+
private List<SourceFragment> sourceFragments;
20+
21+
public QLambda(int argCount, String rawStatement) {
22+
super(rawStatement);
23+
this.argCount = argCount;
24+
}
25+
26+
27+
public final int getArgCount() {
28+
return argCount;
29+
}
30+
31+
public final String inflateStatement(SqlBuilder generator, List<String> args) {
32+
if (sourceFragments == null) {
33+
sourceFragments = parseRawStatement(generator);
34+
}
35+
StringBuilder sb = new StringBuilder();
36+
for (SourceFragment sf : sourceFragments) {
37+
sb.append(sf.getSql(args));
38+
}
39+
return sb.toString();
40+
}
41+
42+
43+
}

hyperquery/src/main/java/org/slowcoders/hyperquery/core/QRecord.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,5 @@
11
package org.slowcoders.hyperquery.core;
22

3-
import org.slowcoders.hyperquery.impl.HSchema;
4-
import org.slowcoders.hyperquery.impl.QAttribute;
5-
import org.slowcoders.hyperquery.impl.QLambda;
6-
import org.slowcoders.hyperquery.impl.QRepository;
7-
8-
import java.lang.annotation.Retention;
9-
import java.lang.annotation.RetentionPolicy;
10-
113
public interface QRecord<T extends QRecord<T>> {
124

135
// @Retention(RetentionPolicy.RUNTIME)

hyperquery/src/main/java/org/slowcoders/hyperquery/impl/QRepository.java renamed to hyperquery/src/main/java/org/slowcoders/hyperquery/core/QRepository.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,9 @@
1-
package org.slowcoders.hyperquery.impl;
1+
package org.slowcoders.hyperquery.core;
22

33

44
import org.apache.ibatis.annotations.Param;
55
import org.apache.ibatis.annotations.Select;
66
import org.apache.ibatis.annotations.Update;
7-
import org.slowcoders.hyperquery.core.QEntity;
8-
import org.slowcoders.hyperquery.core.QFilter;
9-
import org.slowcoders.hyperquery.core.QRecord;
10-
import org.slowcoders.hyperquery.core.QUniqueRecord;
11-
12-
import java.util.List;
137

148
public interface QRepository {
159

hyperquery/src/main/java/org/slowcoders/hyperquery/impl/QLambda.java renamed to hyperquery/src/main/java/org/slowcoders/hyperquery/impl/AliasNode.java

Lines changed: 67 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -5,52 +5,82 @@
55
import org.antlr.v4.runtime.tree.ErrorNode;
66
import org.antlr.v4.runtime.tree.ParseTree;
77
import org.antlr.v4.runtime.tree.TerminalNode;
8-
import org.slowcoders.hql.core.antlr.LambdaBaseVisitor;
9-
import org.slowcoders.hql.core.antlr.LambdaLexer;
10-
import org.slowcoders.hql.core.antlr.LambdaParser;
8+
import org.slowcoders.hyperquery.core.QJoin;
119

1210
import java.util.ArrayList;
11+
import java.util.HashMap;
1312
import java.util.List;
1413

15-
public class QLambda {
16-
private HSchema relation;
14+
public class AliasNode {
1715
private String name;
18-
private final int argCount;
19-
private final String rawStatement;
20-
private List<SourceFragment> sourceFragments;
16+
private final String encodedExpr;
2117

22-
public QLambda(int argCount, String rawStatement) {
23-
this.argCount = argCount;
24-
this.rawStatement = rawStatement;
25-
}
18+
// 종속된 Alias(Attr, Lambda, Join) 목록
19+
// private final HashMap<String, AliasNode> references = new HashMap<>();
20+
// private final HashMap<String, QJoin> innerJoins = new HashMap<>();
21+
// int refCount;
22+
boolean inProgress = false;
2623

27-
public final String getName() { return name; }
24+
public AliasNode(String encodedExpr) {
25+
this.encodedExpr = encodedExpr;
26+
}
2827

29-
public final int getArgCount() {
30-
return argCount;
28+
final void setName(String name) {
29+
this.name = name;
3130
}
3231

33-
public final String getRawStatement() {
34-
return rawStatement;
32+
public final String getName() {
33+
if (name == null) throw new AssertionError();
34+
return name;
3535
}
3636

37-
public final String inflateStatement(SqlBuilder generator, List<String> args) {
38-
if (sourceFragments == null) {
39-
sourceFragments = parseRawStatement(generator);
37+
public final String getEncodedExpr() {
38+
return encodedExpr;
39+
}
40+
protected synchronized final String inflateStatement(SqlBuilder generator, String paramName) {
41+
if (inProgress) {
42+
throw new IllegalStateException("Circular attribute reference is found.");
4043
}
41-
StringBuilder sb = new StringBuilder();
42-
for (SourceFragment sf : sourceFragments) {
43-
sb.append(sf.getSql(args));
44+
try {
45+
inProgress = true;
46+
String expr = PredicateTranslator.translate(generator, paramName, encodedExpr);
47+
return expr;
48+
} finally {
49+
inProgress = false;
4450
}
45-
return sb.toString();
4651
}
4752

48-
public void init(HSchema relation, String name) {
49-
this.relation = relation;
50-
this.name = name;
51-
}
5253

53-
private interface SourceFragment {
54+
// final void addReference(AliasNode alias) {
55+
// if (!this.references.containsKey(alias.getName())) {
56+
// alias.refCount++;
57+
// this.references.put(alias.getName(), alias);
58+
// }
59+
// }
60+
//
61+
// final void addInnerJoin(QJoin join) {
62+
//// this.innerJoins.put(join.getName(), join);
63+
// }
64+
//
65+
//
66+
// final HashMap<String, AliasNode> getReferences() {
67+
// return references;
68+
// }
69+
//
70+
// final HashMap<String, QJoin> getInnerJoins() {
71+
// return innerJoins;
72+
// }
73+
//
74+
// protected QJoin getJoin(String alias) {
75+
// return innerJoins.get(alias);
76+
// }
77+
//
78+
// @Override
79+
// public int hashCode() {
80+
// return name.hashCode();
81+
// }
82+
83+
protected interface SourceFragment {
5484
String getSql(List<String> args);
5585
class Text implements SourceFragment {
5686
String sql;
@@ -68,9 +98,9 @@ class Param implements SourceFragment {
6898
}
6999
}
70100

71-
private List<SourceFragment> parseRawStatement(SqlBuilder generator) {
72-
LambdaLexer lexer = new LambdaLexer(CharStreams.fromString(rawStatement));
73-
LambdaParser parser = new LambdaParser(new CommonTokenStream(lexer));
101+
protected List<SourceFragment> parseRawStatement(SqlBuilder generator) {
102+
org.slowcoders.hql.core.antlr.LambdaLexer lexer = new org.slowcoders.hql.core.antlr.LambdaLexer(CharStreams.fromString(getEncodedExpr()));
103+
org.slowcoders.hql.core.antlr.LambdaParser parser = new org.slowcoders.hql.core.antlr.LambdaParser(new CommonTokenStream(lexer));
74104
ParseTree tree = parser.expr();
75105

76106
LambdaSplitter rewriter = new LambdaSplitter(generator);
@@ -120,7 +150,7 @@ public String toString() {
120150
}
121151
}
122152

123-
static class LambdaSplitter extends LambdaBaseVisitor<String> {
153+
static class LambdaSplitter extends org.slowcoders.hql.core.antlr.LambdaBaseVisitor<String> {
124154
private final SqlBuilder relation;
125155
SourceBuffer sb = new SourceBuffer();
126156

@@ -129,12 +159,12 @@ public LambdaSplitter(SqlBuilder generator) {
129159
}
130160

131161
@Override
132-
public String visitMacroInvocation(LambdaParser.MacroInvocationContext ctx) {
162+
public String visitMacroInvocation(org.slowcoders.hql.core.antlr.LambdaParser.MacroInvocationContext ctx) {
133163
String property = ctx.property().getText();
134164
List<String> callArgs = new ArrayList<>();
135165

136166
SourceBuffer old_sb = this.sb;
137-
for (LambdaParser.ExprContext arg : ctx.tuple().expr()) {
167+
for (org.slowcoders.hql.core.antlr.LambdaParser.ExprContext arg : ctx.tuple().expr()) {
138168
this.sb = new SourceBuffer();
139169
arg.accept(this);
140170
callArgs.add(sb.toString());
@@ -146,14 +176,14 @@ public String visitMacroInvocation(LambdaParser.MacroInvocationContext ctx) {
146176
}
147177

148178
@Override
149-
public String visitParameter(LambdaParser.ParameterContext ctx) {
179+
public String visitParameter(org.slowcoders.hql.core.antlr.LambdaParser.ParameterContext ctx) {
150180
String idx$ = ctx.getText().substring(1);
151181
sb.addParam(Integer.parseInt(idx$));
152182
return "";
153183
}
154184

155185
@Override
156-
public String visitProperty(LambdaParser.PropertyContext ctx) {
186+
public String visitProperty(org.slowcoders.hql.core.antlr.LambdaParser.PropertyContext ctx) {
157187
String property = ctx.getText();
158188
String v = relation.resolveProperty(property);
159189
sb.addText(v);

0 commit comments

Comments
 (0)