//--------------------------------------\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.xerial.core.XerialErrorCode;\r
import org.xerial.core.XerialException;\r
import org.xerial.lens.Lens;\r
-import org.xerial.lens.relation.TupleIndex;\r
import org.xerial.lens.relation.query.impl.LensQueryLexer;\r
import org.xerial.lens.relation.query.impl.LensQueryParser;\r
+import org.xerial.lens.relation.schema.Schema;\r
+import org.xerial.lens.relation.schema.SchemaBuilder;\r
import org.xerial.util.antlr.ANTLRUtil;\r
import org.xerial.util.log.Logger;\r
\r
* @author leo\r
* \r
*/\r
-public class RelationExpr {\r
+public class RelationExpr extends RelationItem {\r
\r
private static Logger _logger = Logger.getLogger(RelationExpr.class);\r
\r
- public class Node {\r
-\r
- public String name;\r
- public String alias;\r
+ public class Node extends RelationItem {\r
\r
public String nodeValue;\r
\r
public Compare compare = null;\r
public PatternMatch patternMatch = null;\r
\r
- public void setIndex(String tupleIndex) {\r
- index = TupleIndex.parse(tupleIndex);\r
- }\r
-\r
- public TupleIndex getIndex() {\r
- return index;\r
+ @Override\r
+ public boolean isRelation() {\r
+ return false;\r
}\r
-\r
}\r
\r
public static class Compare {\r
public String operand;\r
}\r
\r
- public String name;\r
- public String alias;\r
- public List<Node> node;\r
- public List<RelationExpr> relation;\r
- private TupleIndex index = new TupleIndex(0);\r
+ public List<Node> node = new ArrayList<Node>();\r
+ public List<RelationExpr> relation = new ArrayList<RelationExpr>();\r
\r
- public void setIndex(String tupleIndex) {\r
- index = TupleIndex.parse(tupleIndex);\r
- }\r
-\r
- public TupleIndex getIndex() {\r
- return index;\r
+ @Override\r
+ public boolean isRelation() {\r
+ return true;\r
}\r
\r
private static class RelationQuery {\r
}\r
\r
}\r
+\r
+ public Schema toSchema() {\r
+\r
+ ArrayList<RelationItem> sortedRelationItem = new ArrayList<RelationItem>();\r
+ sortedRelationItem.addAll(node);\r
+ sortedRelationItem.addAll(relation);\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
+\r
+ SchemaBuilder parent = new SchemaBuilder();\r
+ parent.add(name);\r
+ SchemaBuilder sibling = new SchemaBuilder();\r
+ for (RelationItem each : sortedRelationItem) {\r
+ if (each.isRelation()) {\r
+ RelationExpr re = RelationExpr.class.cast(each);\r
+ sibling.add(re.toSchema());\r
+ }\r
+ else\r
+ sibling.add(each.name);\r
+ }\r
+\r
+ parent.add(sibling.build());\r
+\r
+ return parent.build();\r
+\r
+ }\r
+\r
}\r
@After\r
public void tearDown() throws Exception {}\r
\r
- public void parse(String query) throws Exception {\r
+ public RelationExpr parse(String query) throws Exception {\r
RelationExpr e = RelationExpr.parse(query);\r
_logger.info(Lens.toJSON(e));\r
+ return e;\r
}\r
\r
@Test\r
\r
@Test\r
public void q3() throws Exception {\r
- parse("entry(dc.subject:sigmod09, link(rel:related, href), summary)");\r
+ RelationExpr e = parse("entry(dc.subject:sigmod09, link(rel:related, href), summary)");\r
+ _logger.debug(e.toSchema());\r
}\r
\r
}\r