From fd35acb63a55b50de0c6e3dfa9346fef26c183b8 Mon Sep 17 00:00:00 2001 From: Hyunsik Choi Date: Mon, 28 Mar 2016 20:59:24 +0900 Subject: [PATCH 1/2] TAJO-2105: Apply new identifier system to new schema. --- .../org/apache/tajo/schema/Identifier.java | 16 ++++++++ .../tajo/schema/QualifiedIdentifier.java | 30 +++++++++++++- .../java/org/apache/tajo/schema/Schema.java | 16 ++++---- .../schema/TestANSISQLIdentifierPolicy.java | 14 +++---- .../apache/tajo/schema/TestIdentifier.java | 41 +++++++++++++++++++ .../org/apache/tajo/schema/TestSchema.java | 24 ++++++++--- ...ier.java => TestTajoIdentifierPolicy.java} | 12 +++--- 7 files changed, 125 insertions(+), 28 deletions(-) create mode 100644 tajo-common/src/test/java/org/apache/tajo/schema/TestIdentifier.java rename tajo-common/src/test/java/org/apache/tajo/schema/{TestTajoIdentifier.java => TestTajoIdentifierPolicy.java} (75%) diff --git a/tajo-common/src/main/java/org/apache/tajo/schema/Identifier.java b/tajo-common/src/main/java/org/apache/tajo/schema/Identifier.java index ef4c2bfd3f..592f2b9ca0 100644 --- a/tajo-common/src/main/java/org/apache/tajo/schema/Identifier.java +++ b/tajo-common/src/main/java/org/apache/tajo/schema/Identifier.java @@ -20,6 +20,8 @@ import org.apache.tajo.schema.IdentifierPolicy.IdentifierCase; +import java.util.Objects; + /** * Identifier Element */ @@ -67,7 +69,21 @@ private void appendByCase(StringBuilder sb, IdentifierCase c) { } } + @Override public String toString() { return displayString(IdentifierPolicy.DefaultPolicy()); } + + public int hashCode() { + return Objects.hash(name, quoted); + } + + public boolean equals(Object obj) { + if (obj instanceof Identifier) { + Identifier other = (Identifier) obj; + return other.name == other.name && quoted == other.quoted; + } + + return false; + } } diff --git a/tajo-common/src/main/java/org/apache/tajo/schema/QualifiedIdentifier.java b/tajo-common/src/main/java/org/apache/tajo/schema/QualifiedIdentifier.java index 6f00ee9e6f..79eed3ccce 100644 --- a/tajo-common/src/main/java/org/apache/tajo/schema/QualifiedIdentifier.java +++ b/tajo-common/src/main/java/org/apache/tajo/schema/QualifiedIdentifier.java @@ -18,7 +18,9 @@ package org.apache.tajo.schema; +import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Function; +import com.google.common.collect.Collections2; import com.google.common.collect.ImmutableList; import org.apache.tajo.util.StringUtils; @@ -43,15 +45,39 @@ public String apply(@Nullable Identifier identifier) { }); } + @Override public String toString() { return displayString(DefaultPolicy()); } - public static QualifiedIdentifier QualifiedIdentifier(Collection names) { + @Override + public int hashCode() { + return names.hashCode(); + } + + public boolean equals(Object obj) { + if (obj instanceof QualifiedIdentifier) { + QualifiedIdentifier other = (QualifiedIdentifier) obj; + return names.equals(other.names); + } + + return false; + } + + public static QualifiedIdentifier $(Collection names) { return new QualifiedIdentifier(ImmutableList.copyOf(names)); } - public static QualifiedIdentifier QualifiedIdentifier(Identifier...names) { + public static QualifiedIdentifier $(Identifier...names) { return new QualifiedIdentifier(ImmutableList.copyOf(names)); } + + @VisibleForTesting + public static QualifiedIdentifier $(String...names) { + ImmutableList.Builder builder = new ImmutableList.Builder(); + for (String n :names) { + builder.add(Identifier._(n)); + } + return new QualifiedIdentifier(builder.build()); + } } diff --git a/tajo-common/src/main/java/org/apache/tajo/schema/Schema.java b/tajo-common/src/main/java/org/apache/tajo/schema/Schema.java index 332f622e52..b939f3093a 100644 --- a/tajo-common/src/main/java/org/apache/tajo/schema/Schema.java +++ b/tajo-common/src/main/java/org/apache/tajo/schema/Schema.java @@ -51,26 +51,26 @@ public String toString() { return StringUtils.join(namedTypes, ","); } - public static NamedStructType Struct(String name, NamedType... namedTypes) { + public static NamedStructType Struct(QualifiedIdentifier name, NamedType... namedTypes) { return Struct(name, Arrays.asList(namedTypes)); } - public static NamedStructType Struct(String name, Collection namedTypes) { + public static NamedStructType Struct(QualifiedIdentifier name, Collection namedTypes) { return new NamedStructType(name, namedTypes); } - public static NamedPrimitiveType Field(String name, Type type) { + public static NamedPrimitiveType Field(QualifiedIdentifier name, Type type) { return new NamedPrimitiveType(name, type); } public static abstract class NamedType { - protected final String name; + protected final QualifiedIdentifier name; - public NamedType(String name) { + public NamedType(QualifiedIdentifier name) { this.name = name; } - public String name() { + public QualifiedIdentifier name() { return this.name; } } @@ -78,7 +78,7 @@ public String name() { public static class NamedPrimitiveType extends NamedType { private final Type type; - NamedPrimitiveType(String name, Type type) { + NamedPrimitiveType(QualifiedIdentifier name, Type type) { super(name); Preconditions.checkArgument(type.baseType() != RECORD); this.type = type; @@ -93,7 +93,7 @@ public String toString() { public static class NamedStructType extends NamedType { private final ImmutableList namedTypes; - public NamedStructType(String name, Collection namedTypes) { + public NamedStructType(QualifiedIdentifier name, Collection namedTypes) { super(name); this.namedTypes = ImmutableList.copyOf(namedTypes); } diff --git a/tajo-common/src/test/java/org/apache/tajo/schema/TestANSISQLIdentifierPolicy.java b/tajo-common/src/test/java/org/apache/tajo/schema/TestANSISQLIdentifierPolicy.java index 9643a8954d..f7dca276fc 100644 --- a/tajo-common/src/test/java/org/apache/tajo/schema/TestANSISQLIdentifierPolicy.java +++ b/tajo-common/src/test/java/org/apache/tajo/schema/TestANSISQLIdentifierPolicy.java @@ -22,9 +22,9 @@ import static org.apache.tajo.schema.Identifier._; import static org.apache.tajo.schema.IdentifierPolicy.ANSISQLPolicy; -import static org.apache.tajo.schema.QualifiedIdentifier.QualifiedIdentifier; -import static org.apache.tajo.schema.TestTajoIdentifier.assertIdentifier; -import static org.apache.tajo.schema.TestTajoIdentifier.assertQualifiedIdentifier; +import static org.apache.tajo.schema.QualifiedIdentifier.$; +import static org.apache.tajo.schema.TestTajoIdentifierPolicy.assertIdentifier; +import static org.apache.tajo.schema.TestTajoIdentifierPolicy.assertQualifiedIdentifier; public class TestANSISQLIdentifierPolicy { @@ -39,10 +39,10 @@ public void displayString() throws Exception { @Test public void testQualifiedIdentifiers() throws Exception { - assertQualifiedIdentifier(ANSISQLPolicy(), QualifiedIdentifier(_("xyz"), _("opq")), "XYZ.OPQ"); - assertQualifiedIdentifier(ANSISQLPolicy(), QualifiedIdentifier(_("XYZ"), _("opq")), "XYZ.OPQ"); + assertQualifiedIdentifier(ANSISQLPolicy(), $(_("xyz"), _("opq")), "XYZ.OPQ"); + assertQualifiedIdentifier(ANSISQLPolicy(), $(_("XYZ"), _("opq")), "XYZ.OPQ"); - assertQualifiedIdentifier(ANSISQLPolicy(), QualifiedIdentifier(_("xyz", true), _("opq", false)), "'xyz'.OPQ"); - assertQualifiedIdentifier(ANSISQLPolicy(), QualifiedIdentifier(_("xYz", true), _("opq", true)), "'xYz'.'opq'"); + assertQualifiedIdentifier(ANSISQLPolicy(), $(_("xyz", true), _("opq", false)), "'xyz'.OPQ"); + assertQualifiedIdentifier(ANSISQLPolicy(), $(_("xYz", true), _("opq", true)), "'xYz'.'opq'"); } } \ No newline at end of file diff --git a/tajo-common/src/test/java/org/apache/tajo/schema/TestIdentifier.java b/tajo-common/src/test/java/org/apache/tajo/schema/TestIdentifier.java new file mode 100644 index 0000000000..c1acf49482 --- /dev/null +++ b/tajo-common/src/test/java/org/apache/tajo/schema/TestIdentifier.java @@ -0,0 +1,41 @@ +/* + * Lisensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.tajo.schema; + +import org.junit.Test; + +import static org.junit.Assert.*; + +public class TestIdentifier { + + @Test + public void testHashCode() throws Exception { + Identifier aId = Identifier._("xyz"); + Identifier same = Identifier._("xyz"); + Identifier sameButQuoted = Identifier._("xyz", true); + + assertEquals(aId.hashCode(), same.hashCode()); + assertNotEquals(aId.hashCode(), sameButQuoted.hashCode()); + } + + @Test + public void equals() throws Exception { + + } +} \ No newline at end of file diff --git a/tajo-common/src/test/java/org/apache/tajo/schema/TestSchema.java b/tajo-common/src/test/java/org/apache/tajo/schema/TestSchema.java index da5a4d357f..03cc223359 100644 --- a/tajo-common/src/test/java/org/apache/tajo/schema/TestSchema.java +++ b/tajo-common/src/test/java/org/apache/tajo/schema/TestSchema.java @@ -20,7 +20,11 @@ import org.junit.Test; +import static org.apache.tajo.schema.Identifier._; +import static org.apache.tajo.schema.QualifiedIdentifier.$; import static org.apache.tajo.schema.Schema.*; +import static org.apache.tajo.schema.Schema.Schema; +import static org.apache.tajo.schema.Schema.Struct; import static org.apache.tajo.type.Type.*; import static org.junit.Assert.assertEquals; @@ -28,8 +32,8 @@ public class TestSchema { @Test public final void testSchema1() { - NamedType struct1 = Struct("f12", Field("f1", Int8()), Field("f2", Int4())); - NamedType struct2 = Struct("f34", Field("f3", Int8()), Field("f4", Int4())); + NamedType struct1 = Struct($("f12"), Field($("f1"), Int8()), Field($("f2"), Int4())); + NamedType struct2 = Struct($("f34"), Field($("f3"), Int8()), Field($("f4"), Int4())); Schema schema = Schema(struct1, struct2); assertEquals(schema.toString(), "f12 record (f1 int8,f2 int4),f34 record (f3 int8,f4 int4)"); @@ -37,11 +41,21 @@ public final void testSchema1() { @Test public final void testSchema2() { - NamedType f1 = Field("x", Array(Int8())); - NamedType f2 = Field("y", Int8()); - NamedType f3 = Struct("z", Field("z-1", Time()), Field("z-2", Array(Int8()))); + NamedType f1 = Field($("x"), Array(Int8())); + NamedType f2 = Field($("y"), Int8()); + NamedType f3 = Struct($("z"), Field($("z-1"), Time()), Field($("z-2"), Array(Int8()))); Schema schema = Schema(f1, f2, f3); assertEquals(schema.toString(), "x array,y int8,z record (z-1 time,z-2 array)"); } + + @Test + public final void testSchemaWithIdentifiers() { + NamedType f1 = Field($("x", "y"), Array(Int8())); + NamedType f2 = Field($(_("y"), _("B", true)), Int8()); + NamedType f3 = Struct($("z"), Field($("z-1"), Time()), Field($("z-2"), Array(Int8()))); + Schema schema = Schema(f1, f2, f3); + + assertEquals(schema.toString(), "x.y array,y.'B' int8,z record (z-1 time,z-2 array)"); + } } \ No newline at end of file diff --git a/tajo-common/src/test/java/org/apache/tajo/schema/TestTajoIdentifier.java b/tajo-common/src/test/java/org/apache/tajo/schema/TestTajoIdentifierPolicy.java similarity index 75% rename from tajo-common/src/test/java/org/apache/tajo/schema/TestTajoIdentifier.java rename to tajo-common/src/test/java/org/apache/tajo/schema/TestTajoIdentifierPolicy.java index 675f63191c..72027fe824 100644 --- a/tajo-common/src/test/java/org/apache/tajo/schema/TestTajoIdentifier.java +++ b/tajo-common/src/test/java/org/apache/tajo/schema/TestTajoIdentifierPolicy.java @@ -22,10 +22,10 @@ import static org.apache.tajo.schema.Identifier._; import static org.apache.tajo.schema.IdentifierPolicy.DefaultPolicy; -import static org.apache.tajo.schema.QualifiedIdentifier.QualifiedIdentifier; +import static org.apache.tajo.schema.QualifiedIdentifier.$; import static org.junit.Assert.assertEquals; -public class TestTajoIdentifier { +public class TestTajoIdentifierPolicy { @Test public void testIdentifiers() throws Exception { assertIdentifier(DefaultPolicy(), _("xyz"), "xyz"); @@ -37,11 +37,11 @@ public void testIdentifiers() throws Exception { @Test public void testQualifiedIdentifiers() throws Exception { - assertQualifiedIdentifier(DefaultPolicy(), QualifiedIdentifier(_("xyz"), _("opq")), "xyz.opq"); - assertQualifiedIdentifier(DefaultPolicy(), QualifiedIdentifier(_("XYZ"), _("opq")), "xyz.opq"); + assertQualifiedIdentifier(DefaultPolicy(), $(_("xyz"), _("opq")), "xyz.opq"); + assertQualifiedIdentifier(DefaultPolicy(), $(_("XYZ"), _("opq")), "xyz.opq"); - assertQualifiedIdentifier(DefaultPolicy(), QualifiedIdentifier(_("xyz", true), _("opq", false)), "'xyz'.opq"); - assertQualifiedIdentifier(DefaultPolicy(), QualifiedIdentifier(_("xYz", true), _("opq", true)), "'xYz'.'opq'"); + assertQualifiedIdentifier(DefaultPolicy(), $(_("xyz", true), _("opq", false)), "'xyz'.opq"); + assertQualifiedIdentifier(DefaultPolicy(), $(_("xYz", true), _("opq", true)), "'xYz'.'opq'"); } public static void assertIdentifier(IdentifierPolicy p, Identifier id, String expected) { From 0db29ccbdfcc169c4db23c44f07880320b4db04d Mon Sep 17 00:00:00 2001 From: Hyunsik Choi Date: Mon, 28 Mar 2016 21:00:35 +0900 Subject: [PATCH 2/2] Removed unused import. --- .../main/java/org/apache/tajo/schema/QualifiedIdentifier.java | 1 - 1 file changed, 1 deletion(-) diff --git a/tajo-common/src/main/java/org/apache/tajo/schema/QualifiedIdentifier.java b/tajo-common/src/main/java/org/apache/tajo/schema/QualifiedIdentifier.java index 79eed3ccce..16f6f6c373 100644 --- a/tajo-common/src/main/java/org/apache/tajo/schema/QualifiedIdentifier.java +++ b/tajo-common/src/main/java/org/apache/tajo/schema/QualifiedIdentifier.java @@ -20,7 +20,6 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Function; -import com.google.common.collect.Collections2; import com.google.common.collect.ImmutableList; import org.apache.tajo.util.StringUtils;