//--------------------------------------\r
package org.xerial.lens.relation.query.lang;\r
\r
-import java.util.ArrayList;\r
-import java.util.Collections;\r
-import java.util.Comparator;\r
-import java.util.List;\r
-\r
import org.antlr.runtime.ANTLRStringStream;\r
import org.antlr.runtime.CommonTokenStream;\r
import org.antlr.runtime.RecognitionException;\r
import org.xerial.core.XerialErrorCode;\r
import org.xerial.core.XerialException;\r
import org.xerial.lens.Lens;\r
+import org.xerial.lens.relation.TupleElement;\r
+import org.xerial.lens.relation.Tuple;\r
import org.xerial.lens.relation.query.QuerySet;\r
import org.xerial.lens.relation.query.QuerySet.QuerySetBuilder;\r
import org.xerial.lens.relation.query.impl.LensQueryLexer;\r
* @author leo\r
* \r
*/\r
-public class RelationExpr extends RelationItem {\r
+public class RelationExpr extends Tuple<RelationAttribute> {\r
\r
private static Logger _logger = Logger.getLogger(RelationExpr.class);\r
\r
- public class Node extends RelationItem {\r
-\r
- public String nodeValue;\r
-\r
- public Compare compare = null;\r
- public PatternMatch patternMatch = null;\r
-\r
- @Override\r
- public boolean isRelation() {\r
- return false;\r
- }\r
- }\r
-\r
- public static class Compare {\r
- public String operator;\r
- public String operand;\r
- }\r
-\r
- public static class PatternMatch {\r
- public String operand;\r
- }\r
-\r
- public List<Node> node = new ArrayList<Node>();\r
- public List<RelationExpr> relation = new ArrayList<RelationExpr>();\r
-\r
- @Override\r
- public boolean isRelation() {\r
- return true;\r
- }\r
+ public String name;\r
+ public String alias;\r
\r
private static class RelationQuery {\r
public RelationExpr relation;\r
\r
}\r
\r
- private List<RelationItem> sortedNodeList() {\r
- ArrayList<RelationItem> sortedRelationItem = new ArrayList<RelationItem>();\r
- sortedRelationItem.addAll(node);\r
- sortedRelationItem.addAll(relation);\r
+ public void addNode(RelationAttribute node) {\r
+ this.add(node);\r
+ }\r
\r
- Collections.sort(sortedRelationItem, new Comparator<RelationItem>() {\r
- public int compare(RelationItem o1, RelationItem o2) {\r
- return o1.getIndex().compareTo(o2.getIndex());\r
- }\r
- });\r
+ public void addRelation(RelationExpr relation) {\r
+ this.add(relation);\r
+ }\r
\r
- return sortedRelationItem;\r
+ @Override\r
+ public String toString() {\r
+ return String.format("%s%s%s", name, alias != null ? " as " + alias : "", super.toString());\r
}\r
\r
public Schema toSchema() {\r
\r
- List<RelationItem> sortedRelationItem = sortedNodeList();\r
-\r
SchemaBuilder parent = new SchemaBuilder();\r
parent.add(name);\r
\r
- for (RelationItem each : sortedRelationItem) {\r
- if (each.isRelation()) {\r
+ for (TupleElement<RelationAttribute> each : this) {\r
+ if (each.isTuple()) {\r
RelationExpr re = RelationExpr.class.cast(each);\r
parent.add(re.toSchema());\r
}\r
- else\r
- parent.add(each.name);\r
+ else {\r
+ RelationAttribute ra = RelationAttribute.class.cast(each);\r
+ parent.add(ra.name);\r
+ }\r
}\r
\r
return parent.build();\r
\r
QuerySetBuilder b = new QuerySetBuilder();\r
\r
- List<RelationItem> sortedRelationItem = sortedNodeList();\r
-\r
SchemaBuilder parent = new SchemaBuilder();\r
parent.add(name);\r
- for (RelationItem each : sortedRelationItem) {\r
- parent.add(each.name);\r
-\r
- if (each.isRelation()) {\r
+ for (TupleElement<RelationAttribute> each : this) {\r
\r
+ if (each.isTuple()) {\r
RelationExpr re = RelationExpr.class.cast(each);\r
for (Schema s : re.buildQuerySet().getTargetQuerySet()) {\r
b.addQueryTarget(s);\r
}\r
}\r
+ else {\r
+ RelationAttribute ra = RelationAttribute.class.cast(each);\r
+ parent.add(ra.name);\r
+ }\r
}\r
b.addQueryTarget(parent.build());\r
\r