OSDN Git Service

added nested schema generator
authorleo <leo@ae02f08e-27ec-0310-ae8c-8ba02fe2eafd>
Thu, 6 Aug 2009 07:02:16 +0000 (07:02 +0000)
committerleo <leo@ae02f08e-27ec-0310-ae8c-8ba02fe2eafd>
Thu, 6 Aug 2009 07:02:16 +0000 (07:02 +0000)
git-svn-id: http://www.xerial.org/svn/project/XerialJ/trunk/xerial-core@3523 ae02f08e-27ec-0310-ae8c-8ba02fe2eafd

src/main/java/org/xerial/lens/relation/query/lang/RelationExpr.java
src/main/java/org/xerial/lens/relation/query/lang/RelationItem.java
src/test/java/org/xerial/lens/relation/query/lang/RelationExprTest.java

index b2f1436..094cba6 100644 (file)
@@ -24,6 +24,9 @@
 //--------------------------------------\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
@@ -33,9 +36,10 @@ import org.antlr.runtime.tree.Tree;
 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
@@ -45,28 +49,21 @@ import org.xerial.util.log.Logger;
  * @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
@@ -78,18 +75,12 @@ public class RelationExpr {
         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
@@ -118,4 +109,35 @@ public class RelationExpr {
         }\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
index 2066ef9..cfbb864 100644 (file)
 //--------------------------------------\r
 package org.xerial.lens.relation.query.lang;\r
 \r
+import org.xerial.lens.relation.TupleIndex;\r
+\r
 /**\r
  * base class of relation expression\r
  * \r
  * @author leo\r
  * \r
  */\r
-public class RelationItem {\r
+public abstract class RelationItem {\r
     public String name;\r
     public String alias;\r
+\r
+    protected TupleIndex index = TupleIndex.root();\r
+\r
+    public void setIndex(String tupleIndex) {\r
+        index = TupleIndex.parse(tupleIndex);\r
+    }\r
+\r
+    public TupleIndex getIndex() {\r
+        return index;\r
+    }\r
+\r
+    public abstract boolean isRelation();\r
+\r
 }\r
index 43c26f7..5d5925f 100644 (file)
@@ -39,9 +39,10 @@ public class RelationExprTest {
     @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
@@ -56,7 +57,8 @@ public class RelationExprTest {
 \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