+++ /dev/null
-/*--------------------------------------------------------------------------\r
- * Copyright 2009 Taro L. Saito\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- *--------------------------------------------------------------------------*/\r
-//--------------------------------------\r
-// XerialJ\r
-//\r
-// TupleIndex.java\r
-// Since: 2009/05/13 9:29:15\r
-//\r
-// $URL$\r
-// $Author$\r
-//--------------------------------------\r
-package org.xerial.lens.relation;\r
-\r
-import org.xerial.core.XerialError;\r
-import org.xerial.core.XerialErrorCode;\r
-\r
-/**\r
- * Dot-separated number for specifying a position in a node tuple, e.g., 1, 1.1,\r
- * 1.2, ...etc.\r
- * \r
- * @author leo\r
- * \r
- */\r
-public class TupleIndex implements Comparable<TupleIndex> {\r
- private int[] index;\r
-\r
- /**\r
- * Create an index with a single level, e.g., 1, 2, 3, ...\r
- * \r
- * @param baseIndex\r
- */\r
- public TupleIndex(int baseIndex) {\r
- this.index = new int[1];\r
- this.index[0] = baseIndex;\r
- }\r
-\r
- /**\r
- * Create an index based on a parent index, e.g, 1.1, 1.2, 1.1.1, 1.1.2,\r
- * ..etc.\r
- * \r
- * @param parent\r
- * @param childIndex\r
- */\r
- public TupleIndex(TupleIndex parent, int childIndex) {\r
- if (parent == null) {\r
- this.index = new int[1];\r
- this.index[0] = childIndex;\r
- }\r
- else {\r
- this.index = new int[parent.size() + 1];\r
- for (int i = 0; i < parent.size(); ++i)\r
- index[i] = parent.get(i);\r
- index[parent.size()] = childIndex;\r
- }\r
- }\r
-\r
- public static TupleIndex root() {\r
- return new TupleIndex(0);\r
- }\r
-\r
- public static TupleIndex parse(String indexStr) {\r
- if (indexStr == null)\r
- throw new NullPointerException("indexStr");\r
-\r
- String[] component = indexStr.split("\\.");\r
- if (component == null)\r
- throw new XerialError(XerialErrorCode.INVALID_INPUT, "invalid format:" + indexStr);\r
-\r
- int[] index = new int[component.length];\r
- for (int i = 0; i < component.length; ++i)\r
- index[i] = Integer.parseInt(component[i]);\r
- return new TupleIndex(index);\r
- }\r
-\r
- private TupleIndex(int[] index) {\r
- this.index = index;\r
- }\r
-\r
- public TupleIndex parent() {\r
- if (index.length <= 1)\r
- return null;\r
-\r
- int[] newIndex = new int[index.length - 1];\r
- for (int i = 0; i < index.length - 1; ++i)\r
- newIndex[i] = index[i];\r
- return new TupleIndex(newIndex);\r
- }\r
-\r
- public TupleIndex tail() {\r
- if (index.length < 2)\r
- return null;\r
-\r
- int[] newIndex = new int[index.length - 1];\r
- for (int i = 1; i < index.length; ++i)\r
- newIndex[i - 1] = index[i];\r
- return new TupleIndex(newIndex);\r
- }\r
-\r
- public TupleIndex sibling() {\r
- int[] newIndex = new int[index.length];\r
- for (int i = 0; i < index.length; ++i)\r
- newIndex[i] = index[i];\r
- newIndex[index.length - 1]++;\r
- return new TupleIndex(newIndex);\r
- }\r
-\r
- /**\r
- * nested level\r
- * \r
- * @return nested level\r
- */\r
- public int size() {\r
- return index.length;\r
- }\r
-\r
- public boolean hasParent() {\r
- return index.length > 1;\r
- }\r
-\r
- public boolean hasTail() {\r
- return index.length > 1;\r
- }\r
-\r
- /**\r
- * Get the index on the specified level\r
- * \r
- * @param level\r
- * @return\r
- */\r
- public int get(int level) {\r
- return index[level];\r
- }\r
-\r
- @Override\r
- public String toString() {\r
- StringBuilder buf = new StringBuilder();\r
- for (int i = 0; i < index.length; i++) {\r
- if (i != 0)\r
- buf.append(".");\r
- buf.append(index[i]);\r
- }\r
- return buf.toString();\r
- }\r
-\r
- @Override\r
- public boolean equals(Object obj) {\r
- TupleIndex other = TupleIndex.class.cast(obj);\r
- if (this.index.length != other.index.length)\r
- return false;\r
-\r
- for (int i = 0; i < this.index.length; ++i) {\r
- if (this.index[i] != other.index[i])\r
- return false;\r
- }\r
- return true;\r
-\r
- }\r
-\r
- public int compareTo(TupleIndex other) {\r
- int i1 = 0;\r
- int i2 = 0;\r
- int cmp = 0;\r
- while (i1 < this.index.length && i2 < other.index.length) {\r
- int e1 = this.index[i1];\r
- int e2 = other.index[i2];\r
- cmp = e1 - e2;\r
- if (cmp != 0)\r
- return cmp;\r
-\r
- i1++;\r
- i2++;\r
- }\r
- if (i1 < this.index.length)\r
- return 1;\r
- else {\r
- if (i2 < other.index.length)\r
- return -1;\r
- else\r
- return 0;\r
- }\r
- }\r
-\r
- @Override\r
- public int hashCode() {\r
- int hash = 3;\r
- for (int i = 0; i < index.length; ++i)\r
- hash += 137 * index[i];\r
- return hash / 1987;\r
- }\r
-\r
-}\r