DRILL-655: Miscellaneous fixes for SchemaPath - Fixed equals() and hashCode(). - Made PathSegment immutable outside of package. - Made ArraySegment and NameSegment final.
Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/42763b65 Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/42763b65 Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/42763b65 Branch: refs/heads/master Commit: 42763b650e7abbc8c8974fe5a7486fa32c5fb192 Parents: 16dc94f Author: Aditya Kishore <adi...@maprtech.com> Authored: Wed May 7 07:37:27 2014 -0700 Committer: Jacques Nadeau <jacq...@apache.org> Committed: Fri May 9 16:48:48 2014 -0700 ---------------------------------------------------------------------- .../drill/common/expression/PathSegment.java | 88 ++++++++++++++------ .../drill/common/expression/SchemaPath.java | 19 ++--- 2 files changed, 69 insertions(+), 38 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/42763b65/common/src/main/java/org/apache/drill/common/expression/PathSegment.java ---------------------------------------------------------------------- diff --git a/common/src/main/java/org/apache/drill/common/expression/PathSegment.java b/common/src/main/java/org/apache/drill/common/expression/PathSegment.java index 448e50f..ffbe493 100644 --- a/common/src/main/java/org/apache/drill/common/expression/PathSegment.java +++ b/common/src/main/java/org/apache/drill/common/expression/PathSegment.java @@ -17,17 +17,16 @@ */ package org.apache.drill.common.expression; - - - public abstract class PathSegment{ - protected PathSegment child; + PathSegment child; + + int hash; public abstract PathSegment cloneWithNewChild(PathSegment segment); public abstract PathSegment clone(); - public static class ArraySegment extends PathSegment{ + public static final class ArraySegment extends PathSegment { private final int index; public ArraySegment(String numberAsText, PathSegment child){ @@ -68,6 +67,22 @@ public abstract class PathSegment{ } @Override + public int segmentHashCode() { + return index; + } + + @Override + public boolean segmentEquals(PathSegment obj) { + if (this == obj) + return true; + else if (obj == null) + return false; + else if (obj instanceof ArraySegment) + return index == ((ArraySegment)obj).getIndex(); + return false; + } + + @Override public PathSegment clone() { PathSegment seg = new ArraySegment(index); if(child != null) seg.setChild(child.clone()); @@ -86,8 +101,7 @@ public abstract class PathSegment{ } - - public static class NameSegment extends PathSegment{ + public static final class NameSegment extends PathSegment { private final String path; public NameSegment(CharSequence n, PathSegment child){ @@ -122,28 +136,24 @@ public abstract class PathSegment{ } @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((path == null) ? 0 : path.toLowerCase().hashCode()); - return result; + public int segmentHashCode() { + return ((path == null) ? 0 : path.toLowerCase().hashCode()); } @Override - public boolean equals(Object obj) { + public boolean segmentEquals(PathSegment obj) { if (this == obj) return true; - if (obj == null) + else if (obj == null) return false; - if (getClass() != obj.getClass()) + else if (getClass() != obj.getClass()) return false; + NameSegment other = (NameSegment) obj; if (path == null) { - if (other.path != null) - return false; - } else if (!path.equalsIgnoreCase(other.path)) - return false; - return true; + return other.path == null; + } + return path.equalsIgnoreCase(other.path); } @Override @@ -153,7 +163,6 @@ public abstract class PathSegment{ return s; } - @Override public NameSegment cloneWithNewChild(PathSegment newChild) { NameSegment s = new NameSegment(this.path); @@ -165,19 +174,19 @@ public abstract class PathSegment{ return s; } - } public NameSegment getNameSegment(){ throw new UnsupportedOperationException(); } + public ArraySegment getArraySegment(){ throw new UnsupportedOperationException(); } + public abstract boolean isArray(); public abstract boolean isNamed(); - public boolean isLastPath(){ return child == null; } @@ -186,10 +195,39 @@ public abstract class PathSegment{ return child; } - public void setChild(PathSegment child) { + void setChild(PathSegment child) { this.child = child; } + protected abstract int segmentHashCode(); + protected abstract boolean segmentEquals(PathSegment other); + @Override + public int hashCode() { + int h = hash; + if (h == 0) { + h = segmentHashCode(); + h = 31*h + ((child == null) ? 0 : child.hashCode()); + hash = h; + } + return h; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + + PathSegment other = (PathSegment) obj; + if (!segmentEquals(other)) { + return false; + } else if (child == null) { + return (other.child == null); + } else return child.equals(other.child); + } -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/42763b65/common/src/main/java/org/apache/drill/common/expression/SchemaPath.java ---------------------------------------------------------------------- diff --git a/common/src/main/java/org/apache/drill/common/expression/SchemaPath.java b/common/src/main/java/org/apache/drill/common/expression/SchemaPath.java index df96ffc..fd75aeb 100644 --- a/common/src/main/java/org/apache/drill/common/expression/SchemaPath.java +++ b/common/src/main/java/org/apache/drill/common/expression/SchemaPath.java @@ -46,7 +46,6 @@ public class SchemaPath extends LogicalExpressionBase { private final NameSegment rootSegment; - public static SchemaPath getSimplePath(String name){ return getCompoundPath(name); } @@ -61,8 +60,6 @@ public class SchemaPath extends LogicalExpressionBase { return new SchemaPath(s); } - - /** * * @param simpleName @@ -115,10 +112,7 @@ public class SchemaPath extends LogicalExpressionBase { @Override public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((rootSegment == null) ? 0 : rootSegment.hashCode()); - return result; + return ((rootSegment == null) ? 0 : rootSegment.hashCode()); } @Override @@ -127,15 +121,14 @@ public class SchemaPath extends LogicalExpressionBase { return true; if (obj == null) return false; - if ( !(obj instanceof SchemaPath)) + if (!(obj instanceof SchemaPath)) return false; + SchemaPath other = (SchemaPath) obj; if (rootSegment == null) { - if (other.rootSegment != null) - return false; - } else if (!rootSegment.equals(other.rootSegment)) - return false; - return true; + return (other.rootSegment == null); + } + return rootSegment.equals(other.rootSegment); } @Override