TAJO-2043: Implement new data type and schema.
Closes #934
diff --git a/CHANGES b/CHANGES
index 4f43450..b5ff5f4 100644
--- a/CHANGES
+++ b/CHANGES
@@ -8,6 +8,8 @@
IMPROVEMENT
+ TAJO-2043: Implement new data type and schema. (hyunsik)
+
TAJO-2090: Bump up orc version to 0.141. (hyunsik)
TAJO-2089: Improve null handling in UDF. (jinho)
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
new file mode 100644
index 0000000..d505062
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/schema/Schema.java
@@ -0,0 +1,106 @@
+/**
+ * Licensed 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 com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+import org.apache.tajo.type.Type;
+import org.apache.tajo.util.StringUtils;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+import static org.apache.tajo.common.TajoDataTypes.Type.RECORD;
+
+/**
+ * A field is a pair of a name and a type. Schema is an ordered list of fields.
+ */
+public class Schema {
+ private final ImmutableList<NamedType> namedTypes;
+
+ public Schema(Collection<NamedType> namedTypes) {
+ this.namedTypes = ImmutableList.copyOf(namedTypes);
+ }
+
+ public static Schema Schema(NamedType...fields) {
+ return new Schema(Arrays.asList(fields));
+ }
+
+ public static Schema Schema(Collection<NamedType> fields) {
+ return new Schema(fields);
+ }
+
+ @Override
+ public String toString() {
+ return StringUtils.join(namedTypes, ",");
+ }
+
+ public static NamedStructType Struct(String name, NamedType... namedTypes) {
+ return new NamedStructType(name, Arrays.asList(namedTypes));
+ }
+
+ public static NamedStructType Struct(String name, Collection<NamedType> namedTypes) {
+ return new NamedStructType(name, namedTypes);
+ }
+
+ public static NamedPrimitiveType Field(String name, Type type) {
+ return new NamedPrimitiveType(name, type);
+ }
+
+ public static abstract class NamedType {
+ protected final String name;
+
+ public NamedType(String name) {
+ this.name = name;
+ }
+
+ public String name() {
+ return this.name;
+ }
+ }
+
+ public static class NamedPrimitiveType extends NamedType {
+ private final Type type;
+
+ NamedPrimitiveType(String name, Type type) {
+ super(name);
+ Preconditions.checkArgument(type.baseType() != RECORD);
+ this.type = type;
+ }
+
+ @Override
+ public String toString() {
+ return name + " " + type;
+ }
+ }
+
+ public static class NamedStructType extends NamedType {
+ private final ImmutableList<NamedType> namedTypes;
+
+ public NamedStructType(String name, Collection<NamedType> namedTypes) {
+ super(name);
+ this.namedTypes = ImmutableList.copyOf(namedTypes);
+ }
+
+ @Override
+ public String toString() {
+ return name + " record (" + StringUtils.join(namedTypes, ",") + ")";
+ }
+ }
+}
diff --git a/tajo-common/src/main/java/org/apache/tajo/type/Array.java b/tajo-common/src/main/java/org/apache/tajo/type/Array.java
new file mode 100644
index 0000000..cd02d1e
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/type/Array.java
@@ -0,0 +1,59 @@
+/**
+ * Licensed 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.type;
+
+import org.apache.tajo.common.TajoDataTypes;
+
+import java.util.Objects;
+
+public class Array extends Type {
+ private final Type elementType;
+
+ public Array(Type elementType) {
+ this.elementType = elementType;
+ }
+
+ public Type elementType() {
+ return this.elementType;
+ }
+
+ @Override
+ public TajoDataTypes.Type baseType() {
+ return TajoDataTypes.Type.ARRAY;
+ }
+
+ @Override
+ public String toString() {
+ return "array<" + elementType + ">";
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(baseType(), elementType);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ if (object instanceof Array) {
+ return elementType.equals(((Array)object).elementType);
+ }
+
+ return false;
+ }
+}
diff --git a/tajo-common/src/main/java/org/apache/tajo/type/Blob.java b/tajo-common/src/main/java/org/apache/tajo/type/Blob.java
new file mode 100644
index 0000000..104dd12
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/type/Blob.java
@@ -0,0 +1,28 @@
+/**
+ * Licensed 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.type;
+
+import org.apache.tajo.common.TajoDataTypes;
+
+public class Blob extends Type {
+ @Override
+ public TajoDataTypes.Type baseType() {
+ return TajoDataTypes.Type.BLOB;
+ }
+}
diff --git a/tajo-common/src/main/java/org/apache/tajo/type/Bool.java b/tajo-common/src/main/java/org/apache/tajo/type/Bool.java
new file mode 100644
index 0000000..ddd7300
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/type/Bool.java
@@ -0,0 +1,28 @@
+/**
+ * Licensed 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.type;
+
+import org.apache.tajo.common.TajoDataTypes;
+
+public class Bool extends Type {
+ @Override
+ public TajoDataTypes.Type baseType() {
+ return TajoDataTypes.Type.BOOLEAN;
+ }
+}
diff --git a/tajo-common/src/main/java/org/apache/tajo/type/Char.java b/tajo-common/src/main/java/org/apache/tajo/type/Char.java
new file mode 100644
index 0000000..04857ec
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/type/Char.java
@@ -0,0 +1,59 @@
+/**
+ * Licensed 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.type;
+
+import org.apache.tajo.common.TajoDataTypes;
+
+import java.util.Objects;
+
+public class Char extends Type {
+ private final int length;
+
+ public Char(int length) {
+ this.length = length;
+ }
+
+ public int length() {
+ return length;
+ }
+
+ @Override
+ public TajoDataTypes.Type baseType() {
+ return TajoDataTypes.Type.CHAR;
+ }
+
+ @Override
+ public String toString() {
+ return "char(" + length + ")";
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(baseType(), length);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ if (object instanceof Char) {
+ return length == ((Char) object).length;
+ }
+
+ return false;
+ }
+}
diff --git a/tajo-common/src/main/java/org/apache/tajo/type/Date.java b/tajo-common/src/main/java/org/apache/tajo/type/Date.java
new file mode 100644
index 0000000..0febc1a
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/type/Date.java
@@ -0,0 +1,28 @@
+/**
+ * Licensed 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.type;
+
+import org.apache.tajo.common.TajoDataTypes;
+
+public class Date extends Type {
+ @Override
+ public TajoDataTypes.Type baseType() {
+ return TajoDataTypes.Type.DATE;
+ }
+}
diff --git a/tajo-common/src/main/java/org/apache/tajo/type/Float4.java b/tajo-common/src/main/java/org/apache/tajo/type/Float4.java
new file mode 100644
index 0000000..47ccd6b
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/type/Float4.java
@@ -0,0 +1,28 @@
+/**
+ * Licensed 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.type;
+
+import org.apache.tajo.common.TajoDataTypes;
+
+public class Float4 extends Type {
+ @Override
+ public TajoDataTypes.Type baseType() {
+ return TajoDataTypes.Type.FLOAT4;
+ }
+}
diff --git a/tajo-common/src/main/java/org/apache/tajo/type/Float8.java b/tajo-common/src/main/java/org/apache/tajo/type/Float8.java
new file mode 100644
index 0000000..6d2702c
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/type/Float8.java
@@ -0,0 +1,28 @@
+/**
+ * Licensed 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.type;
+
+import org.apache.tajo.common.TajoDataTypes;
+
+public class Float8 extends Type {
+ @Override
+ public TajoDataTypes.Type baseType() {
+ return TajoDataTypes.Type.FLOAT8;
+ }
+}
diff --git a/tajo-common/src/main/java/org/apache/tajo/type/Int2.java b/tajo-common/src/main/java/org/apache/tajo/type/Int2.java
new file mode 100644
index 0000000..44db4cb
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/type/Int2.java
@@ -0,0 +1,28 @@
+/**
+ * Licensed 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.type;
+
+import org.apache.tajo.common.TajoDataTypes;
+
+public class Int2 extends Type {
+ @Override
+ public TajoDataTypes.Type baseType() {
+ return TajoDataTypes.Type.INT2;
+ }
+}
diff --git a/tajo-common/src/main/java/org/apache/tajo/type/Int4.java b/tajo-common/src/main/java/org/apache/tajo/type/Int4.java
new file mode 100644
index 0000000..0837e2c
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/type/Int4.java
@@ -0,0 +1,28 @@
+/**
+ * Licensed 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.type;
+
+import org.apache.tajo.common.TajoDataTypes;
+
+public class Int4 extends Type {
+ @Override
+ public TajoDataTypes.Type baseType() {
+ return TajoDataTypes.Type.INT4;
+ }
+}
diff --git a/tajo-common/src/main/java/org/apache/tajo/type/Int8.java b/tajo-common/src/main/java/org/apache/tajo/type/Int8.java
new file mode 100644
index 0000000..3d4049c
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/type/Int8.java
@@ -0,0 +1,28 @@
+/**
+ * Licensed 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.type;
+
+import org.apache.tajo.common.TajoDataTypes;
+
+public class Int8 extends Type {
+ @Override
+ public TajoDataTypes.Type baseType() {
+ return TajoDataTypes.Type.INT8;
+ }
+}
diff --git a/tajo-common/src/main/java/org/apache/tajo/type/Map.java b/tajo-common/src/main/java/org/apache/tajo/type/Map.java
new file mode 100644
index 0000000..afc1cc3
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/type/Map.java
@@ -0,0 +1,66 @@
+/**
+ * Licensed 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.type;
+
+import org.apache.tajo.common.TajoDataTypes;
+
+import java.util.Objects;
+
+public class Map extends Type {
+ private final Type keyType;
+ private final Type valueType;
+
+ public Map(Type keyType, Type valueType) {
+ this.keyType = keyType;
+ this.valueType = valueType;
+ }
+
+ public Type keyType() {
+ return this.keyType;
+ }
+
+ public Type valueType() {
+ return this.valueType;
+ }
+
+ @Override
+ public TajoDataTypes.Type baseType() {
+ return TajoDataTypes.Type.MAP;
+ }
+
+ @Override
+ public String toString() {
+ return "map<" + keyType + "," + valueType + ">";
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(baseType(), keyType, valueType);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ if (object instanceof Map) {
+ Map other = (Map) object;
+ return keyType.equals(other.keyType) && valueType.equals(other.valueType);
+ }
+
+ return false;
+ }
+}
diff --git a/tajo-common/src/main/java/org/apache/tajo/type/Numeric.java b/tajo-common/src/main/java/org/apache/tajo/type/Numeric.java
new file mode 100644
index 0000000..75ef392
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/type/Numeric.java
@@ -0,0 +1,66 @@
+/**
+ * Licensed 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.type;
+
+import org.apache.tajo.common.TajoDataTypes;
+
+import java.util.Objects;
+
+public class Numeric extends Type {
+ private final int precision;
+ private final int scale;
+
+ public Numeric(int precision, int scale) {
+ this.precision = precision;
+ this.scale = scale;
+ }
+
+ public int precision() {
+ return this.precision;
+ }
+
+ public int scale() {
+ return this.scale;
+ }
+
+ @Override
+ public TajoDataTypes.Type baseType() {
+ return TajoDataTypes.Type.NUMERIC;
+ }
+
+ @Override
+ public String toString() {
+ return "numeric(" + precision + "," + scale + ")";
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(baseType(), precision, scale);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ if (object instanceof Numeric) {
+ Numeric other = (Numeric) object;
+ return precision == other.precision && scale == other.scale;
+ }
+
+ return false;
+ }
+}
diff --git a/tajo-common/src/main/java/org/apache/tajo/type/Struct.java b/tajo-common/src/main/java/org/apache/tajo/type/Struct.java
new file mode 100644
index 0000000..551eb81
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/type/Struct.java
@@ -0,0 +1,72 @@
+/**
+ * Licensed 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.type;
+
+import com.google.common.collect.ImmutableList;
+import org.apache.tajo.common.TajoDataTypes;
+import org.apache.tajo.util.StringUtils;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Objects;
+
+public class Struct extends Type {
+ private final ImmutableList<Type> memberTypes;
+
+ public Struct(Collection<Type> memberTypes) {
+ this.memberTypes = ImmutableList.copyOf(memberTypes);
+ }
+
+ public int size() {
+ return memberTypes.size();
+ }
+
+ public Type memberType(int idx) {
+ return memberTypes.get(idx);
+ }
+
+ public List<Type> memberTypes() {
+ return this.memberTypes;
+ }
+
+ @Override
+ public TajoDataTypes.Type baseType() {
+ return TajoDataTypes.Type.RECORD;
+ }
+
+ @Override
+ public String toString() {
+ return "struct(" + StringUtils.join(memberTypes, ",") + ")";
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(baseType(), Objects.hash(memberTypes));
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ if (object instanceof Struct) {
+ Struct other = (Struct) object;
+ return memberTypes.equals(other.memberTypes);
+ }
+
+ return false;
+ }
+}
diff --git a/tajo-common/src/main/java/org/apache/tajo/type/Text.java b/tajo-common/src/main/java/org/apache/tajo/type/Text.java
new file mode 100644
index 0000000..e523afe
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/type/Text.java
@@ -0,0 +1,28 @@
+/**
+ * Licensed 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.type;
+
+import org.apache.tajo.common.TajoDataTypes;
+
+public class Text extends Type {
+ @Override
+ public TajoDataTypes.Type baseType() {
+ return TajoDataTypes.Type.TEXT;
+ }
+}
diff --git a/tajo-common/src/main/java/org/apache/tajo/type/Time.java b/tajo-common/src/main/java/org/apache/tajo/type/Time.java
new file mode 100644
index 0000000..3b1414c
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/type/Time.java
@@ -0,0 +1,28 @@
+/**
+ * Licensed 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.type;
+
+import org.apache.tajo.common.TajoDataTypes;
+
+public class Time extends Type {
+ @Override
+ public TajoDataTypes.Type baseType() {
+ return TajoDataTypes.Type.TIME;
+ }
+}
diff --git a/tajo-common/src/main/java/org/apache/tajo/type/Timestamp.java b/tajo-common/src/main/java/org/apache/tajo/type/Timestamp.java
new file mode 100644
index 0000000..5b02314
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/type/Timestamp.java
@@ -0,0 +1,28 @@
+/**
+ * Licensed 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.type;
+
+import org.apache.tajo.common.TajoDataTypes;
+
+public class Timestamp extends Type {
+ @Override
+ public TajoDataTypes.Type baseType() {
+ return TajoDataTypes.Type.TIMESTAMP;
+ }
+}
diff --git a/tajo-common/src/main/java/org/apache/tajo/type/Type.java b/tajo-common/src/main/java/org/apache/tajo/type/Type.java
new file mode 100644
index 0000000..363ffc4
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/type/Type.java
@@ -0,0 +1,128 @@
+/**
+ * Licensed 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.type;
+
+import org.apache.tajo.common.TajoDataTypes;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+public abstract class Type {
+ public abstract TajoDataTypes.Type baseType();
+
+ protected static String typeName(TajoDataTypes.Type type) {
+ return type.name().toLowerCase();
+ }
+
+ @Override
+ public int hashCode() {
+ return baseType().hashCode();
+ }
+
+ @Override
+ public boolean equals(Object t) {
+ if (t instanceof Type) {
+ return ((Type)t).baseType() == baseType();
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return typeName(baseType());
+ }
+
+ public static Bool Bool() {
+ return new Bool();
+ }
+
+ public static Int2 Int2() {
+ return new Int2();
+ }
+
+ public static Int4 Int4() {
+ return new Int4();
+ }
+
+ public static Int8 Int8() {
+ return new Int8();
+ }
+
+ public static Float4 Float4() {
+ return new Float4();
+ }
+
+ public static Float8 Float8() {
+ return new Float8();
+ }
+
+ public static int DEFAULT_SCALE = 0;
+
+ public static Numeric Numeric(int precision) {
+ return new Numeric(precision, DEFAULT_SCALE);
+ }
+
+ public static Numeric Numeric(int precision, int scale) {
+ return new Numeric(precision, scale);
+ }
+
+ public static Date Date() {
+ return new Date();
+ }
+
+ public static Time Time() {
+ return new Time();
+ }
+
+ public static Timestamp Timestamp() {
+ return new Timestamp();
+ }
+
+ public static Char Char(int len) {
+ return new Char(len);
+ }
+
+ public static Varchar Varchar(int len) {
+ return new Varchar(len);
+ }
+
+ public static Text Text() {
+ return new Text();
+ }
+
+ public static Blob Blob() {
+ return new Blob();
+ }
+
+ public static Struct Struct(Collection<Type> types) {
+ return new Struct(types);
+ }
+
+ public static Struct Struct(Type ... types) {
+ return new Struct(Arrays.asList(types));
+ }
+
+ public static Array Array(Type type) {
+ return new Array(type);
+ }
+
+ public static Map Map(Type keyType, Type valueType) {
+ return new Map(keyType, valueType);
+ }
+}
diff --git a/tajo-common/src/main/java/org/apache/tajo/type/Varchar.java b/tajo-common/src/main/java/org/apache/tajo/type/Varchar.java
new file mode 100644
index 0000000..6dc2c50
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/type/Varchar.java
@@ -0,0 +1,59 @@
+/**
+ * Licensed 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.type;
+
+import org.apache.tajo.common.TajoDataTypes;
+
+import java.util.Objects;
+
+public class Varchar extends Type {
+ private final int length;
+
+ public Varchar(int length) {
+ this.length = length;
+ }
+
+ public int length() {
+ return length;
+ }
+
+ @Override
+ public TajoDataTypes.Type baseType() {
+ return TajoDataTypes.Type.VARCHAR;
+ }
+
+ @Override
+ public String toString() {
+ return "varchar(" + length + ")";
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(baseType(), length);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ if (object instanceof Varchar) {
+ return length == ((Varchar) object).length;
+ }
+
+ return false;
+ }
+}
diff --git a/tajo-common/src/main/proto/DataTypes.proto b/tajo-common/src/main/proto/DataTypes.proto
index 1e10be2..7cf09d3 100644
--- a/tajo-common/src/main/proto/DataTypes.proto
+++ b/tajo-common/src/main/proto/DataTypes.proto
@@ -60,7 +60,8 @@
BLOB = 45;
RECORD = 51; // nested structure type
- MAP = 52; // map type
+ ARRAY = 52; // array type
+ MAP = 53; // map type
ANY = 61; // Any type
UDT = 62; // user-defined function
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
new file mode 100644
index 0000000..da5a4d3
--- /dev/null
+++ b/tajo-common/src/test/java/org/apache/tajo/schema/TestSchema.java
@@ -0,0 +1,47 @@
+/**
+ * Licensed 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.apache.tajo.schema.Schema.*;
+import static org.apache.tajo.type.Type.*;
+import static org.junit.Assert.assertEquals;
+
+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()));
+ Schema schema = Schema(struct1, struct2);
+
+ assertEquals(schema.toString(), "f12 record (f1 int8,f2 int4),f34 record (f3 int8,f4 int4)");
+ }
+
+ @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())));
+ Schema schema = Schema(f1, f2, f3);
+
+ assertEquals(schema.toString(), "x array<int8>,y int8,z record (z-1 time,z-2 array<int8>)");
+ }
+}
\ No newline at end of file
diff --git a/tajo-common/src/test/java/org/apache/tajo/type/TestType.java b/tajo-common/src/test/java/org/apache/tajo/type/TestType.java
new file mode 100644
index 0000000..9023af0
--- /dev/null
+++ b/tajo-common/src/test/java/org/apache/tajo/type/TestType.java
@@ -0,0 +1,102 @@
+/**
+ * Licensed 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.type;
+
+import org.junit.Test;
+
+import static org.apache.tajo.common.TajoDataTypes.Type.*;
+import static org.apache.tajo.type.Type.*;
+import static org.junit.Assert.assertEquals;
+
+public class TestType {
+ @Test
+ public final void testPrimitiveTypes() {
+ assertEquals(Bool().baseType(), BOOLEAN);
+ assertEquals(Int2().baseType(), INT2);
+ assertEquals(Int4().baseType(), INT4);
+ assertEquals(Int8().baseType(), INT8);
+ assertEquals(Float4().baseType(), FLOAT4);
+ assertEquals(Float8().baseType(), FLOAT8);
+ assertEquals(Date().baseType(), DATE);
+ assertEquals(Time().baseType(), TIME);
+ assertEquals(Timestamp().baseType(), TIMESTAMP);
+
+ Numeric n = Numeric(4, 2);
+ assertEquals(n.baseType(), NUMERIC);
+ assertEquals(n.precision(), 4);
+ assertEquals(n.scale(), 2);
+
+ assertEquals(Blob().baseType(), BLOB);
+
+ Char c = Char(2);
+ assertEquals(c.baseType(), CHAR);
+ assertEquals(c.length(), 2);
+
+ Varchar varchar = Varchar(2);
+ assertEquals(varchar.baseType(), VARCHAR);
+ assertEquals(varchar.length(), 2);
+
+ Struct struct = Struct(Int8(), Array(Float8()));
+ assertEquals(struct.baseType(), RECORD);
+ assertEquals(struct.memberType(0).baseType(), INT8);
+ assertEquals(struct.memberType(1).baseType(), ARRAY);
+
+ Map map = Map(Int8(), Array(Timestamp()));
+ assertEquals(map.baseType(), MAP);
+ assertEquals(map.keyType().baseType(), INT8);
+ assertEquals(map.valueType().baseType(), ARRAY);
+
+ Array array = Array(Int8());
+ assertEquals(array.baseType(), ARRAY);
+ assertEquals(array.elementType().baseType(), INT8);
+ }
+
+ @Test
+ public final void testToString() {
+ assertEquals("boolean", Bool().toString());
+ assertEquals("int2", Int2().toString());
+ assertEquals("int4", Int4().toString());
+ assertEquals("int8", Int8().toString());
+ assertEquals("float4", Float4().toString());
+ assertEquals("float8", Float8().toString());
+ assertEquals("date", Date().toString());
+ assertEquals("time", Time().toString());
+ assertEquals("timestamp", Timestamp().toString());
+
+ Numeric n = Numeric(4, 2);
+ assertEquals("numeric(4,2)", n.toString());
+
+ assertEquals("blob", Blob().toString());
+
+ Char c = Char(2);
+ assertEquals("char(2)", c.toString());
+
+ Varchar varchar = Varchar(2);
+ assertEquals("varchar(2)", varchar.toString());
+
+ Struct struct = Struct(Int8(), Array(Float8()));
+ assertEquals("struct(int8,array<float8>)", struct.toString());
+
+ Map map = Map(Int8(), Array(Timestamp()));
+ assertEquals("map<int8,array<timestamp>>", map.toString());
+
+ Array array = Array(Int8());
+ assertEquals("array<int8>", array.toString());
+ }
+}
\ No newline at end of file