>From Ritik Raj <ritik....@couchbase.com>: Ritik Raj has uploaded this change for review. ( https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/20130 )
Change subject: [ASTERIXDB-3548][COMP] Introduce ordering in the IAType ...................................................................... [ASTERIXDB-3548][COMP] Introduce ordering in the IAType - user model changes: no - storage format changes: no - interface changes: yes Details: Introduced ordering in the IAType, so that the ordering is maintained when sent to the runtime. Patch-seq: 5 Ext-ref: MB-63032 Change-Id: Ib2972d56b65931de3805bfd5a974694be9f7d05e --- A asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/PositionedAType.java A asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AnyType.java M asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AOrderedListType.java M asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/visitor/ExpectedSchemaNodeToIATypeTranslatorVisitor.java M asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/ARecordType.java M asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AbstractComplexType.java M asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/BuiltinType.java M asterixdb/asterix-om/src/main/java/org/apache/asterix/om/utils/ProjectionFiltrationTypeUtil.java M asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/IAType.java M asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AUnionType.java M asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AUnorderedListType.java 11 files changed, 183 insertions(+), 10 deletions(-) git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb refs/changes/30/20130/1 diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/visitor/ExpectedSchemaNodeToIATypeTranslatorVisitor.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/visitor/ExpectedSchemaNodeToIATypeTranslatorVisitor.java index a16229f..e56da22 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/visitor/ExpectedSchemaNodeToIATypeTranslatorVisitor.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/visitor/ExpectedSchemaNodeToIATypeTranslatorVisitor.java @@ -28,7 +28,7 @@ import org.apache.asterix.om.types.AOrderedListType; import org.apache.asterix.om.types.ARecordType; import org.apache.asterix.om.types.AUnionType; -import org.apache.asterix.om.types.BuiltinType; +import org.apache.asterix.om.types.AnyType; import org.apache.asterix.om.types.IAType; import org.apache.asterix.optimizer.rules.pushdown.schema.AbstractComplexExpectedSchemaNode; import org.apache.asterix.optimizer.rules.pushdown.schema.AnyExpectedSchemaNode; @@ -52,6 +52,8 @@ private final Map<String, FunctionCallInformation> sourceInformationMap; //To give a unique name for each type private int counter; + // since currently we are not traversing in an array. this flag helps tracking that. + private boolean enteredArray; public ExpectedSchemaNodeToIATypeTranslatorVisitor(Map<String, FunctionCallInformation> sourceInformationMap) { this.sourceInformationMap = sourceInformationMap; @@ -76,9 +78,12 @@ @Override public IAType visit(ArrayExpectedSchemaNode node, String arg) throws AlgebricksException { + enteredArray = true; IAType itemType = node.getChild().accept(this, String.valueOf(counter++)); IAType listType = new AOrderedListType(itemType, arg); + listType.setOrdinal(node.getFieldOrdinal()); sourceInformationMap.put(arg, createFunctionCallInformation(node)); + enteredArray = false; return listType; } @@ -95,7 +100,11 @@ @Override public IAType visit(AnyExpectedSchemaNode node, String arg) { - return BuiltinType.ANY; + IAType anyType = new AnyType(); + if (!enteredArray) { + anyType.setOrdinal(node.getFieldOrdinal()); + } + return anyType; } private ARecordType createRecordType(ObjectExpectedSchemaNode node, String arg) throws AlgebricksException { diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AOrderedListType.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AOrderedListType.java index 426d361..18a2b1b 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AOrderedListType.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AOrderedListType.java @@ -53,7 +53,7 @@ @Override public String toString() { - return "[ " + getItemType() + " ]"; + return super.toString() + "[ " + getItemType() + " ]"; } @Override diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/ARecordType.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/ARecordType.java index ba352ac..96298f3 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/ARecordType.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/ARecordType.java @@ -192,6 +192,7 @@ sb.append(typeName).append(": "); } sb.append(isOpen ? "open" : "closed"); + sb.append(super.toString()); sb.append(" {\n"); int n = fieldNames.length; for (int i = 0; i < n; i++) { diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AUnionType.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AUnionType.java index caa926d..4f36b53 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AUnionType.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AUnionType.java @@ -70,6 +70,16 @@ return false; } + @Override + public void setOrdinal(int ordinal) { + throw new UnsupportedOperationException("AUnionType does not support setOrdinal"); + } + + @Override + public int getOrdinal() { + throw new UnsupportedOperationException("AUnionType does not support getOrdinal"); + } + public IAType getType(ATypeTag typeTag) { for (int i = 0; i < unionList.size(); i++) { IAType type = unionList.get(i); diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AUnorderedListType.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AUnorderedListType.java index 6d72119..a6394c1 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AUnorderedListType.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AUnorderedListType.java @@ -53,7 +53,7 @@ @Override public String toString() { - return "{{ " + getItemType() + " }}"; + return super.toString() + "{{ " + getItemType() + " }}"; } @Override diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AbstractComplexType.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AbstractComplexType.java index 16f83f5..31937d7 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AbstractComplexType.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AbstractComplexType.java @@ -23,7 +23,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; -public abstract class AbstractComplexType implements IAType { +public abstract class AbstractComplexType extends PositionedAType { private static final long serialVersionUID = 1L; protected static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AnyType.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AnyType.java new file mode 100644 index 0000000..4e4b22f --- /dev/null +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AnyType.java @@ -0,0 +1,71 @@ +/* + * 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.asterix.om.types; + +import org.apache.hyracks.api.io.IPersistedResourceRegistry; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; + +public class AnyType extends BuiltinType { + private static final long serialVersionUID = 1L; + + @Override + public ATypeTag getTypeTag() { + return ATypeTag.ANY; + } + + @Override + public String getTypeName() { + return "any"; + } + + @Override + public String getDisplayName() { + return "ANY"; + } + + @Override + public String getConstructor() { + return null; + } + + @Override + public JsonNode toJson(IPersistedResourceRegistry registry) { + return convertToJson(registry, getTypeTag().serialize(), serialVersionUID); + } + + @Override + public ObjectNode toJSON() { + ObjectMapper om = new ObjectMapper(); + ObjectNode type = om.createObjectNode(); + type.put("type", "ANY"); + return type; + } + + @Override + public boolean equals(Object object) { + if (!(object instanceof BuiltinType)) { + return false; + } + BuiltinType t = (BuiltinType) object; + return t.getTypeTag() == ATypeTag.ANY; + } +} diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/BuiltinType.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/BuiltinType.java index 2404ac2d..3806721 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/BuiltinType.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/BuiltinType.java @@ -28,9 +28,9 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; -public abstract class BuiltinType implements IAType { +public abstract class BuiltinType extends PositionedAType { + private static final long serialVersionUID = 5770246838953329916L; - private static final long serialVersionUID = 1L; private static final String TAG_FIELD = "tag"; public abstract static class LowerCaseConstructorType extends BuiltinType { @@ -1003,6 +1003,15 @@ type.put("type", "ANY"); return type; } + + @Override + public boolean equals(Object object) { + if (!(object instanceof BuiltinType)) { + return false; + } + BuiltinType t = (BuiltinType) object; + return t.getTypeTag() == ATypeTag.ANY; + } }; public static final BuiltinType SHORTWITHOUTTYPEINFO = new BuiltinType() { @@ -1052,7 +1061,7 @@ @Override public String toString() { - return getTypeTag().toString(); + return fieldOrdinal == -1 ? getTypeTag().toString() : "(" + getOrdinal() + ") " + getTypeTag().toString(); } @Override @@ -1089,7 +1098,7 @@ return visitor.visitFlat(this, arg); } - private static JsonNode convertToJson(IPersistedResourceRegistry registry, short tag, long version) { + protected static JsonNode convertToJson(IPersistedResourceRegistry registry, short tag, long version) { ObjectNode jsonNode = registry.getClassIdentifier(BuiltinType.class, version); jsonNode.put(TAG_FIELD, tag); return jsonNode; diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/IAType.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/IAType.java index ed4c2bb..6f3c237 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/IAType.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/IAType.java @@ -32,6 +32,16 @@ public String getTypeName(); /** + * set the field position of the type in a nested type + */ + public void setOrdinal(int ordinal); + + /** + * @return the field's position in a nested type + */ + public int getOrdinal(); + + /** * Allow for additional traversal and processing for {@link IAType} * * @param visitor visitor diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/PositionedAType.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/PositionedAType.java new file mode 100644 index 0000000..4fc1a21 --- /dev/null +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/PositionedAType.java @@ -0,0 +1,42 @@ +/* + * 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.asterix.om.types; + +public abstract class PositionedAType implements IAType { + private static final long serialVersionUID = 5770246838953329916L; + protected int fieldOrdinal = -1; + + @Override + public void setOrdinal(int ordinal) { + this.fieldOrdinal = ordinal; + } + + @Override + public int getOrdinal() { + return fieldOrdinal; + } + + @Override + public String toString() { + if (fieldOrdinal != -1) { + return "(" + fieldOrdinal + ") "; + } + return ""; + } +} diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/utils/ProjectionFiltrationTypeUtil.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/utils/ProjectionFiltrationTypeUtil.java index 94ff865..2e47710 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/utils/ProjectionFiltrationTypeUtil.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/utils/ProjectionFiltrationTypeUtil.java @@ -28,6 +28,7 @@ import org.apache.asterix.om.types.BuiltinType; import org.apache.asterix.om.types.IAType; import org.apache.asterix.om.types.IATypeVisitor; +import org.apache.asterix.om.types.PositionedAType; import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -165,7 +166,7 @@ return new ARecordType(typeName, new String[] {}, new IAType[] {}, true); } - public static class RenamedType implements IAType { + public static class RenamedType extends PositionedAType { private static final long serialVersionUID = 992690669300951839L; private final IAType originalType; private final String name; -- To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/20130 To unsubscribe, or for help writing mail filters, visit https://asterix-gerrit.ics.uci.edu/settings Gerrit-Project: asterixdb Gerrit-Branch: ionic Gerrit-Change-Id: Ib2972d56b65931de3805bfd5a974694be9f7d05e Gerrit-Change-Number: 20130 Gerrit-PatchSet: 1 Gerrit-Owner: Ritik Raj <ritik....@couchbase.com> Gerrit-MessageType: newchange