From 80deef45daa33522b2bba608a01aadbaf4b3fc8a Mon Sep 17 00:00:00 2001 From: leo Date: Wed, 14 Oct 2009 01:11:08 +0000 Subject: [PATCH] git-svn-id: http://www.xerial.org/svn/project/XerialJ/trunk/xerial-core@3637 ae02f08e-27ec-0310-ae8c-8ba02fe2eafd --- src/main/java/org/xerial/lens/RelationLens.java | 2 +- .../java/org/xerial/lens/relation/IndexAccess.java | 2 +- .../java/org/xerial/lens/relation/NodeBase.java | 2 +- src/main/java/org/xerial/lens/relation/Tuple.java | 2 +- .../org/xerial/lens/relation/TupleElement.java | 4 +- ...{TupleElementVisitor.java => TupleVisitor.java} | 3 +- .../{query => }/lang/RelationAttribute.java | 2 +- .../relation/{query => }/lang/RelationExpr.java | 6 +- .../lens/relation/{query => }/lang/XPathExpr.java | 2 +- .../relation/query/RelationFragmentHolder.java | 4 +- src/main/java/org/xerial/util/DSNumber.java | 204 +++++++++++++++++++++ src/main/java/org/xerial/util/xml/dtd/impl/DTD.g | 3 +- .../{query => }/lang/RelationExprTest.java | 3 +- .../relation/{query => }/lang/XPathExprTest.java | 3 +- src/test/java/org/xerial/util/xml/dtd/dblp.dtd | 26 +-- 15 files changed, 237 insertions(+), 31 deletions(-) rename src/main/java/org/xerial/lens/relation/{TupleElementVisitor.java => TupleVisitor.java} (92%) rename src/main/java/org/xerial/lens/relation/{query => }/lang/RelationAttribute.java (94%) rename src/main/java/org/xerial/lens/relation/{query => }/lang/RelationExpr.java (95%) rename src/main/java/org/xerial/lens/relation/{query => }/lang/XPathExpr.java (95%) create mode 100644 src/main/java/org/xerial/util/DSNumber.java rename src/test/java/org/xerial/lens/relation/{query => }/lang/RelationExprTest.java (92%) rename src/test/java/org/xerial/lens/relation/{query => }/lang/XPathExprTest.java (92%) diff --git a/src/main/java/org/xerial/lens/RelationLens.java b/src/main/java/org/xerial/lens/RelationLens.java index 7233bee..01cc14e 100644 --- a/src/main/java/org/xerial/lens/RelationLens.java +++ b/src/main/java/org/xerial/lens/RelationLens.java @@ -27,10 +27,10 @@ package org.xerial.lens; import org.xerial.core.XerialException; import org.xerial.lens.relation.Node; import org.xerial.lens.relation.Tuple; +import org.xerial.lens.relation.lang.RelationExpr; import org.xerial.lens.relation.query.QuerySet; import org.xerial.lens.relation.query.RelationExtractor; import org.xerial.lens.relation.query.RelationHandler; -import org.xerial.lens.relation.query.lang.RelationExpr; import org.xerial.lens.relation.schema.Schema; import org.xerial.util.log.Logger; import org.xerial.util.tree.TreeParser; diff --git a/src/main/java/org/xerial/lens/relation/IndexAccess.java b/src/main/java/org/xerial/lens/relation/IndexAccess.java index 97da151..10d9f9f 100644 --- a/src/main/java/org/xerial/lens/relation/IndexAccess.java +++ b/src/main/java/org/xerial/lens/relation/IndexAccess.java @@ -62,6 +62,6 @@ public interface IndexAccess * * @param visitor */ - void accept(TupleElementVisitor visitor); + void accept(TupleVisitor visitor); } diff --git a/src/main/java/org/xerial/lens/relation/NodeBase.java b/src/main/java/org/xerial/lens/relation/NodeBase.java index 8730583..563afc0 100644 --- a/src/main/java/org/xerial/lens/relation/NodeBase.java +++ b/src/main/java/org/xerial/lens/relation/NodeBase.java @@ -80,7 +80,7 @@ public abstract class NodeBase implements TupleElement { } @SuppressWarnings("unchecked") - public void accept(TupleElementVisitor visitor) { + public void accept(TupleVisitor visitor) { visitor.visitNode((NodeType) this); } diff --git a/src/main/java/org/xerial/lens/relation/Tuple.java b/src/main/java/org/xerial/lens/relation/Tuple.java index 4b3d06a..2ddbcac 100644 --- a/src/main/java/org/xerial/lens/relation/Tuple.java +++ b/src/main/java/org/xerial/lens/relation/Tuple.java @@ -207,7 +207,7 @@ public class Tuple implements TupleElement, Iterable visitor) { + public void accept(TupleVisitor visitor) { visitor.visitTuple(this); } diff --git a/src/main/java/org/xerial/lens/relation/TupleElement.java b/src/main/java/org/xerial/lens/relation/TupleElement.java index bfd4ae2..e0cff5c 100644 --- a/src/main/java/org/xerial/lens/relation/TupleElement.java +++ b/src/main/java/org/xerial/lens/relation/TupleElement.java @@ -57,7 +57,7 @@ public interface TupleElement { public int size(); /** - * Get the cell at the specified index + * Get the tuple element at the specified index * * @param index * @return @@ -92,6 +92,6 @@ public interface TupleElement { * * @param visitor */ - void accept(TupleElementVisitor visitor); + void accept(TupleVisitor visitor); } diff --git a/src/main/java/org/xerial/lens/relation/TupleElementVisitor.java b/src/main/java/org/xerial/lens/relation/TupleVisitor.java similarity index 92% rename from src/main/java/org/xerial/lens/relation/TupleElementVisitor.java rename to src/main/java/org/xerial/lens/relation/TupleVisitor.java index e4c9e86..26fdc6e 100644 --- a/src/main/java/org/xerial/lens/relation/TupleElementVisitor.java +++ b/src/main/java/org/xerial/lens/relation/TupleVisitor.java @@ -30,8 +30,7 @@ package org.xerial.lens.relation; * @author leo * */ -public interface TupleElementVisitor -{ +public interface TupleVisitor { public void visitNode(NodeType node); public void visitTuple(Tuple tuple); diff --git a/src/main/java/org/xerial/lens/relation/query/lang/RelationAttribute.java b/src/main/java/org/xerial/lens/relation/lang/RelationAttribute.java similarity index 94% rename from src/main/java/org/xerial/lens/relation/query/lang/RelationAttribute.java rename to src/main/java/org/xerial/lens/relation/lang/RelationAttribute.java index 1b565da..d37932f 100644 --- a/src/main/java/org/xerial/lens/relation/query/lang/RelationAttribute.java +++ b/src/main/java/org/xerial/lens/relation/lang/RelationAttribute.java @@ -22,7 +22,7 @@ // $URL$ // $Author$ //-------------------------------------- -package org.xerial.lens.relation.query.lang; +package org.xerial.lens.relation.lang; import org.xerial.lens.relation.NodeBase; diff --git a/src/main/java/org/xerial/lens/relation/query/lang/RelationExpr.java b/src/main/java/org/xerial/lens/relation/lang/RelationExpr.java similarity index 95% rename from src/main/java/org/xerial/lens/relation/query/lang/RelationExpr.java rename to src/main/java/org/xerial/lens/relation/lang/RelationExpr.java index 6ef2a52..d207adb 100644 --- a/src/main/java/org/xerial/lens/relation/query/lang/RelationExpr.java +++ b/src/main/java/org/xerial/lens/relation/lang/RelationExpr.java @@ -22,7 +22,7 @@ // $URL$ // $Author$ //-------------------------------------- -package org.xerial.lens.relation.query.lang; +package org.xerial.lens.relation.lang; import org.antlr.runtime.ANTLRStringStream; import org.antlr.runtime.CommonTokenStream; @@ -122,13 +122,13 @@ public class RelationExpr extends Tuple { SchemaBuilder parent = new SchemaBuilder(); parent.add(name); + for (TupleElement each : this) { if (each.isTuple()) { RelationExpr re = RelationExpr.class.cast(each); - for (Schema s : re.buildQuerySet().getTargetQuerySet()) { + for (Schema s : re.buildQuerySet().getTargetQuerySet()) b.addQueryTarget(s); - } } else { RelationAttribute ra = RelationAttribute.class.cast(each); diff --git a/src/main/java/org/xerial/lens/relation/query/lang/XPathExpr.java b/src/main/java/org/xerial/lens/relation/lang/XPathExpr.java similarity index 95% rename from src/main/java/org/xerial/lens/relation/query/lang/XPathExpr.java rename to src/main/java/org/xerial/lens/relation/lang/XPathExpr.java index 1a6e06e..e429e5d 100644 --- a/src/main/java/org/xerial/lens/relation/query/lang/XPathExpr.java +++ b/src/main/java/org/xerial/lens/relation/lang/XPathExpr.java @@ -22,7 +22,7 @@ // $URL$ // $Author$ //-------------------------------------- -package org.xerial.lens.relation.query.lang; +package org.xerial.lens.relation.lang; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/org/xerial/lens/relation/query/RelationFragmentHolder.java b/src/main/java/org/xerial/lens/relation/query/RelationFragmentHolder.java index 8c676fe..f641a04 100644 --- a/src/main/java/org/xerial/lens/relation/query/RelationFragmentHolder.java +++ b/src/main/java/org/xerial/lens/relation/query/RelationFragmentHolder.java @@ -31,7 +31,7 @@ import java.util.LinkedList; import java.util.List; import org.xerial.lens.relation.TupleElement; -import org.xerial.lens.relation.TupleElementVisitor; +import org.xerial.lens.relation.TupleVisitor; import org.xerial.lens.relation.Node; import org.xerial.lens.relation.Tuple; import org.xerial.lens.relation.TupleIndex; @@ -84,7 +84,7 @@ public class RelationFragmentHolder { return new Tuple(nodeList); } - class CompletenessTester implements TupleElementVisitor { + class CompletenessTester implements TupleVisitor { boolean hasNull = false; public boolean isComplete() { diff --git a/src/main/java/org/xerial/util/DSNumber.java b/src/main/java/org/xerial/util/DSNumber.java new file mode 100644 index 0000000..40d0b18 --- /dev/null +++ b/src/main/java/org/xerial/util/DSNumber.java @@ -0,0 +1,204 @@ +/*-------------------------------------------------------------------------- + * Copyright 2009 Taro L. Saito + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *--------------------------------------------------------------------------*/ +//-------------------------------------- +// XerialJ +// +// DSNumber.java +// Since: 2009/05/13 9:29:15 +// +// $URL$ +// $Author$ +//-------------------------------------- +package org.xerial.util; + +import org.xerial.core.XerialError; +import org.xerial.core.XerialErrorCode; + +/** + * DSNumber (Dot-separated number) for specifying a position in a nested node + * tuple, e.g., 1, 1.1, 1.2, ...etc. + * + * @author leo + * + */ +public class DSNumber implements Comparable { + private int[] index; + + /** + * Create an index with a single level, e.g., 1, 2, 3, ... + * + * @param baseIndex + */ + public DSNumber(int baseIndex) { + this.index = new int[1]; + this.index[0] = baseIndex; + } + + /** + * Create an index based on a parent index, e.g, 1.1, 1.2, 1.1.1, 1.1.2, + * ..etc. + * + * @param parent + * @param childIndex + */ + public DSNumber(DSNumber parent, int childIndex) { + if (parent == null) { + this.index = new int[1]; + this.index[0] = childIndex; + } + else { + this.index = new int[parent.size() + 1]; + for (int i = 0; i < parent.size(); ++i) + index[i] = parent.get(i); + index[parent.size()] = childIndex; + } + } + + public static DSNumber root() { + return new DSNumber(0); + } + + public static DSNumber parse(String indexStr) { + if (indexStr == null) + throw new NullPointerException("indexStr"); + + String[] component = indexStr.split("\\."); + if (component == null) + throw new XerialError(XerialErrorCode.INVALID_INPUT, "invalid format:" + indexStr); + + int[] index = new int[component.length]; + for (int i = 0; i < component.length; ++i) + index[i] = Integer.parseInt(component[i]); + return new DSNumber(index); + } + + private DSNumber(int[] index) { + this.index = index; + } + + public DSNumber parent() { + if (index.length <= 1) + return null; + + int[] newIndex = new int[index.length - 1]; + for (int i = 0; i < index.length - 1; ++i) + newIndex[i] = index[i]; + return new DSNumber(newIndex); + } + + public DSNumber tail() { + if (index.length < 2) + return null; + + int[] newIndex = new int[index.length - 1]; + for (int i = 1; i < index.length; ++i) + newIndex[i - 1] = index[i]; + return new DSNumber(newIndex); + } + + public DSNumber sibling() { + int[] newIndex = new int[index.length]; + for (int i = 0; i < index.length; ++i) + newIndex[i] = index[i]; + newIndex[index.length - 1]++; + return new DSNumber(newIndex); + } + + /** + * nested level + * + * @return nested level + */ + public int size() { + return index.length; + } + + public boolean hasParent() { + return index.length > 1; + } + + public boolean hasTail() { + return index.length > 1; + } + + /** + * Get the index on the specified level + * + * @param level + * @return + */ + public int get(int level) { + return index[level]; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + for (int i = 0; i < index.length; i++) { + if (i != 0) + buf.append("."); + buf.append(index[i]); + } + return buf.toString(); + } + + @Override + public boolean equals(Object obj) { + DSNumber other = DSNumber.class.cast(obj); + if (this.index.length != other.index.length) + return false; + + for (int i = 0; i < this.index.length; ++i) { + if (this.index[i] != other.index[i]) + return false; + } + return true; + + } + + public int compareTo(DSNumber other) { + int i1 = 0; + int i2 = 0; + int cmp = 0; + while (i1 < this.index.length && i2 < other.index.length) { + int e1 = this.index[i1]; + int e2 = other.index[i2]; + cmp = e1 - e2; + if (cmp != 0) + return cmp; + + i1++; + i2++; + } + if (i1 < this.index.length) + return 1; + else { + if (i2 < other.index.length) + return -1; + else + return 0; + } + } + + @Override + public int hashCode() { + int hash = 3; + for (int i = 0; i < index.length; ++i) + hash += 137 * index[i]; + return hash / 1987; + } + +} diff --git a/src/main/java/org/xerial/util/xml/dtd/impl/DTD.g b/src/main/java/org/xerial/util/xml/dtd/impl/DTD.g index fdf66de..56f9316 100644 --- a/src/main/java/org/xerial/util/xml/dtd/impl/DTD.g +++ b/src/main/java/org/xerial/util/xml/dtd/impl/DTD.g @@ -36,6 +36,7 @@ COMPONENT; OCCURRENCE; CONTENTSPEC; ENTITY; +ENTITY_REF; VALUE; } @@ -245,6 +246,6 @@ tokenizedType entityDecl : '' -> ^(ENTITY NAME[$Name.text] VALUE[$String.text]) - | '' -> ^(ENTITY NAME[$Name.text] VALUE[$String.text]) + | '' -> ^(ENTITY_REF NAME[$Name.text] VALUE[$String.text]) ; \ No newline at end of file diff --git a/src/test/java/org/xerial/lens/relation/query/lang/RelationExprTest.java b/src/test/java/org/xerial/lens/relation/lang/RelationExprTest.java similarity index 92% rename from src/test/java/org/xerial/lens/relation/query/lang/RelationExprTest.java rename to src/test/java/org/xerial/lens/relation/lang/RelationExprTest.java index 63f7869..7d5bd31 100644 --- a/src/test/java/org/xerial/lens/relation/query/lang/RelationExprTest.java +++ b/src/test/java/org/xerial/lens/relation/lang/RelationExprTest.java @@ -22,12 +22,13 @@ // $URL$ // $Author$ //-------------------------------------- -package org.xerial.lens.relation.query.lang; +package org.xerial.lens.relation.lang; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.xerial.lens.Lens; +import org.xerial.lens.relation.lang.RelationExpr; import org.xerial.util.log.Logger; public class RelationExprTest { diff --git a/src/test/java/org/xerial/lens/relation/query/lang/XPathExprTest.java b/src/test/java/org/xerial/lens/relation/lang/XPathExprTest.java similarity index 92% rename from src/test/java/org/xerial/lens/relation/query/lang/XPathExprTest.java rename to src/test/java/org/xerial/lens/relation/lang/XPathExprTest.java index 168206e..4d3a1c2 100644 --- a/src/test/java/org/xerial/lens/relation/query/lang/XPathExprTest.java +++ b/src/test/java/org/xerial/lens/relation/lang/XPathExprTest.java @@ -22,13 +22,14 @@ // $URL$ // $Author$ //-------------------------------------- -package org.xerial.lens.relation.query.lang; +package org.xerial.lens.relation.lang; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.xerial.core.XerialException; import org.xerial.lens.Lens; +import org.xerial.lens.relation.lang.XPathExpr; import org.xerial.util.log.Logger; public class XPathExprTest { diff --git a/src/test/java/org/xerial/util/xml/dtd/dblp.dtd b/src/test/java/org/xerial/util/xml/dtd/dblp.dtd index c1f31ac..49cfb92 100644 --- a/src/test/java/org/xerial/util/xml/dtd/dblp.dtd +++ b/src/test/java/org/xerial/util/xml/dtd/dblp.dtd @@ -17,32 +17,32 @@ phdthesis|mastersthesis|www)*> - + - + - + - + - + - + - + - + @@ -50,7 +50,7 @@ - + @@ -81,10 +81,10 @@ - - - - + + + + -- 2.11.0