[NO ISSUE]Introduce convenience methods for pointables - user model changes: no - storage format changes: no - interface changes: no
Details: - Introduce utils to convert pointables into adm nodes. - Such functions can be useful for tuple translation of Metadata entities, reading constant records in with clauses in DDLs, and for debugging runtime. Change-Id: I705e75d573a7f2c888dd7d83b4c24a2c7050eb88 Reviewed-on: https://asterix-gerrit.ics.uci.edu/2733 Tested-by: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Contrib: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Integration-Tests: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Reviewed-by: Till Westmann <ti...@apache.org> Project: http://git-wip-us.apache.org/repos/asf/asterixdb/repo Commit: http://git-wip-us.apache.org/repos/asf/asterixdb/commit/5ff3230e Tree: http://git-wip-us.apache.org/repos/asf/asterixdb/tree/5ff3230e Diff: http://git-wip-us.apache.org/repos/asf/asterixdb/diff/5ff3230e Branch: refs/heads/master Commit: 5ff3230e7b3f51e787f432ff098d0b02c961a808 Parents: ac3a16a Author: Abdullah Alamoudi <bamou...@gmail.com> Authored: Tue Jul 3 14:12:07 2018 -0700 Committer: abdullah alamoudi <bamou...@gmail.com> Committed: Tue Jul 3 16:27:40 2018 -0700 ---------------------------------------------------------------------- .../asterix/app/translator/QueryTranslator.java | 56 ++++--- .../asterix/common/exceptions/ErrorCode.java | 3 + .../main/resources/asx_errormsg/en.properties | 3 + asterixdb/asterix-lang-common/pom.xml | 5 - .../lang/common/util/LangRecordParseUtil.java | 125 ++++++-------- .../asterix/metadata/MetadataManager.java | 30 +++- .../apache/asterix/metadata/MetadataNode.java | 26 ++- .../asterix/metadata/entities/Dataset.java | 16 +- .../asterix/metadata/entities/Dataverse.java | 15 ++ .../SerializerDeserializerProvider.java | 7 +- .../formats/nontagged/TypeTraitProvider.java | 2 +- .../asterix/object/base/AdmArrayNode.java | 32 +++- .../asterix/object/base/AdmBigIntNode.java | 10 ++ .../asterix/object/base/AdmBooleanNode.java | 9 + .../asterix/object/base/AdmDoubleNode.java | 9 + .../apache/asterix/object/base/AdmNullNode.java | 9 + .../asterix/object/base/AdmObjectNode.java | 72 +++++++- .../asterix/object/base/AdmStringNode.java | 11 ++ .../apache/asterix/object/base/IAdmNode.java | 25 ++- .../nonvisitor/AIntervalPointable.java | 1 + .../pointables/nonvisitor/AListPointable.java | 14 +- .../pointables/nonvisitor/ARecordPointable.java | 25 ++- .../apache/asterix/om/utils/AdmNodeUtils.java | 163 +++++++++++++++++++ .../hyracks/data/std/api/AbstractPointable.java | 1 + .../hyracks/data/std/api/IPointableFactory.java | 4 +- .../data/std/primitive/BooleanPointable.java | 5 +- .../data/std/primitive/BytePointable.java | 1 + .../data/std/primitive/DoublePointable.java | 11 +- .../data/std/primitive/FloatPointable.java | 1 + .../data/std/primitive/IntegerPointable.java | 1 + .../std/primitive/RawUTF8StringPointable.java | 1 + .../data/std/primitive/ShortPointable.java | 1 + .../std/primitive/TaggedValuePointable.java | 26 +-- .../primitive/UTF8StringLowercasePointable.java | 1 + .../UTF8StringLowercaseTokenPointable.java | 1 + .../data/std/primitive/UTF8StringPointable.java | 9 +- .../java/org/apache/hyracks/util/ExitUtil.java | 3 + .../org/apache/hyracks/util/NetworkUtil.java | 2 +- .../hyracks/util/string/UTF8StringUtil.java | 11 +- .../hyracks/util/string/UTF8StringWriter.java | 15 +- 40 files changed, 596 insertions(+), 166 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java index 6bb6f35..4d71715 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java @@ -459,26 +459,13 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen } protected void handleCreateDataverseStatement(MetadataProvider metadataProvider, Statement stmt) throws Exception { - CreateDataverseStatement stmtCreateDataverse = (CreateDataverseStatement) stmt; String dvName = stmtCreateDataverse.getDataverseName().getValue(); MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction(); metadataProvider.setMetadataTxnContext(mdTxnCtx); - lockManager.acquireDataverseReadLock(metadataProvider.getLocks(), dvName); try { - Dataverse dv = MetadataManager.INSTANCE.getDataverse(metadataProvider.getMetadataTxnContext(), dvName); - if (dv != null) { - if (stmtCreateDataverse.getIfNotExists()) { - MetadataManager.INSTANCE.commitTransaction(mdTxnCtx); - return; - } else { - throw new CompilationException(ErrorCode.DATAVERSE_EXISTS, stmt.getSourceLocation(), dvName); - } - } - MetadataManager.INSTANCE.addDataverse(metadataProvider.getMetadataTxnContext(), - new Dataverse(dvName, stmtCreateDataverse.getFormat(), MetadataUtil.PENDING_NO_OP)); - MetadataManager.INSTANCE.commitTransaction(mdTxnCtx); + doCreateDataverseStatement(mdTxnCtx, metadataProvider, stmtCreateDataverse); } catch (Exception e) { abort(e, e, mdTxnCtx); throw e; @@ -487,6 +474,26 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen } } + @SuppressWarnings("squid:S00112") + protected boolean doCreateDataverseStatement(MetadataTransactionContext mdTxnCtx, MetadataProvider metadataProvider, + CreateDataverseStatement stmtCreateDataverse) throws Exception { + String dvName = stmtCreateDataverse.getDataverseName().getValue(); + Dataverse dv = MetadataManager.INSTANCE.getDataverse(metadataProvider.getMetadataTxnContext(), dvName); + if (dv != null) { + if (stmtCreateDataverse.getIfNotExists()) { + MetadataManager.INSTANCE.commitTransaction(mdTxnCtx); + return false; + } else { + throw new CompilationException(ErrorCode.DATAVERSE_EXISTS, stmtCreateDataverse.getSourceLocation(), + dvName); + } + } + MetadataManager.INSTANCE.addDataverse(metadataProvider.getMetadataTxnContext(), + new Dataverse(dvName, stmtCreateDataverse.getFormat(), MetadataUtil.PENDING_NO_OP)); + MetadataManager.INSTANCE.commitTransaction(mdTxnCtx); + return true; + } + protected static void validateCompactionPolicy(String compactionPolicy, Map<String, String> compactionPolicyProperties, MetadataTransactionContext mdTxnCtx, boolean isExternalDataset, SourceLocation sourceLoc) throws CompilationException, Exception { @@ -1220,19 +1227,29 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen throw new CompilationException(ErrorCode.COMPILATION_ERROR, sourceLoc, MetadataBuiltinEntities.DEFAULT_DATAVERSE_NAME + " dataverse can't be dropped"); } + lockManager.acquireDataverseWriteLock(metadataProvider.getLocks(), dataverseName); + try { + doDropDataverse(stmtDelete, sourceLoc, metadataProvider, hcc); + } finally { + metadataProvider.getLocks().unlock(); + ExternalDatasetsRegistry.INSTANCE.releaseAcquiredLocks(metadataProvider); + } + } + protected boolean doDropDataverse(DataverseDropStatement stmtDelete, SourceLocation sourceLoc, + MetadataProvider metadataProvider, IHyracksClientConnection hcc) throws Exception { + String dataverseName = stmtDelete.getDataverseName().getValue(); ProgressState progress = ProgressState.NO_PROGRESS; MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction(); boolean bActiveTxn = true; metadataProvider.setMetadataTxnContext(mdTxnCtx); List<JobSpecification> jobsToExecute = new ArrayList<>(); - lockManager.acquireDataverseWriteLock(metadataProvider.getLocks(), dataverseName); try { Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, dataverseName); if (dv == null) { if (stmtDelete.getIfExists()) { MetadataManager.INSTANCE.commitTransaction(mdTxnCtx); - return; + return false; } else { throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, sourceLoc, dataverseName); } @@ -1336,6 +1353,7 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen activeDataverse = null; } MetadataManager.INSTANCE.commitTransaction(mdTxnCtx); + return true; } catch (Exception e) { if (bActiveTxn) { abort(e, e, mdTxnCtx); @@ -1369,11 +1387,7 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen + ") couldn't be removed from the metadata", e); } } - throw e; - } finally { - metadataProvider.getLocks().unlock(); - ExternalDatasetsRegistry.INSTANCE.releaseAcquiredLocks(metadataProvider); } } @@ -2871,7 +2885,7 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen @Override public String getActiveDataverseName(String dataverse) { - return (dataverse != null) ? dataverse : activeDataverse.getDataverseName(); + return (dataverse != null && !dataverse.isEmpty()) ? dataverse : activeDataverse.getDataverseName(); } @Override http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java index 447f851..d919d0e 100644 --- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java +++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java @@ -168,6 +168,9 @@ public class ErrorCode { public static final int TYPE_EXISTS = 1085; public static final int PARAMETER_NO_VALUE = 1086; public static final int COMPILATION_INVALID_NUM_OF_ARGS = 1087; + public static final int FIELD_NOT_FOUND = 1088; + public static final int FIELD_NOT_OF_TYPE = 1089; + public static final int ARRAY_FIELD_ELEMENTS_MUST_BE_OF_TYPE = 1090; // Feed errors public static final int DATAFLOW_ILLEGAL_STATE = 3001; http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties b/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties index 720ff57..ac51570 100644 --- a/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties +++ b/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties @@ -155,6 +155,9 @@ 1085 = A datatype with this name %1$s already exists 1086 = No value for parameter: %1$s 1087 = Invalid number of arguments: at least %1$d arguments are required for function %2$s +1088 = Required field %1$s was not found +1089 = Field %1$s must be of type %2$s but found to be of type %3$s +1090 = Field %1$s must be of an array of type %2$s but found to contain an item of type %3$s # Feed Errors 3001 = Illegal state. http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-lang-common/pom.xml ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-lang-common/pom.xml b/asterixdb/asterix-lang-common/pom.xml index b20bd58..96123d0 100644 --- a/asterixdb/asterix-lang-common/pom.xml +++ b/asterixdb/asterix-lang-common/pom.xml @@ -103,10 +103,5 @@ <groupId>org.apache.hyracks</groupId> <artifactId>hyracks-api</artifactId> </dependency> - <dependency> - <groupId>org.apache.hyracks</groupId> - <artifactId>hyracks-data-std</artifactId> - </dependency> </dependencies> - </project> http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/LangRecordParseUtil.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/LangRecordParseUtil.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/LangRecordParseUtil.java index 8367fa0..c358444 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/LangRecordParseUtil.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/LangRecordParseUtil.java @@ -23,66 +23,53 @@ import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Map.Entry; -import org.apache.asterix.builders.OrderedListBuilder; -import org.apache.asterix.builders.RecordBuilder; import org.apache.asterix.common.exceptions.CompilationException; import org.apache.asterix.common.exceptions.ErrorCode; -import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider; import org.apache.asterix.lang.common.base.Expression; import org.apache.asterix.lang.common.base.Literal; import org.apache.asterix.lang.common.expression.FieldBinding; import org.apache.asterix.lang.common.expression.ListConstructor; import org.apache.asterix.lang.common.expression.LiteralExpr; import org.apache.asterix.lang.common.expression.RecordConstructor; +import org.apache.asterix.object.base.AdmArrayNode; +import org.apache.asterix.object.base.AdmBigIntNode; +import org.apache.asterix.object.base.AdmBooleanNode; +import org.apache.asterix.object.base.AdmDoubleNode; +import org.apache.asterix.object.base.AdmNullNode; +import org.apache.asterix.object.base.AdmObjectNode; +import org.apache.asterix.object.base.AdmStringNode; +import org.apache.asterix.object.base.IAdmNode; import org.apache.asterix.om.base.ABoolean; import org.apache.asterix.om.base.ADouble; import org.apache.asterix.om.base.AInt64; import org.apache.asterix.om.base.AMutableString; -import org.apache.asterix.om.base.ANull; import org.apache.asterix.om.base.AOrderedList; import org.apache.asterix.om.base.ARecord; import org.apache.asterix.om.base.AString; import org.apache.asterix.om.base.IACursor; import org.apache.asterix.om.base.IAObject; -import org.apache.asterix.om.types.BuiltinType; -import org.apache.asterix.om.utils.RecordUtil; +import org.apache.asterix.om.types.ATypeTag; import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException; import org.apache.hyracks.algebricks.common.utils.Pair; -import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer; import org.apache.hyracks.api.exceptions.HyracksDataException; -import org.apache.hyracks.data.std.util.ArrayBackedValueStorage; -@SuppressWarnings("unchecked") public class LangRecordParseUtil { private static final String NOT_ALLOWED_EXPRESSIONS_ERROR_MESSAGE = "JSON record can only have expressions [%1$s, %2$s, %3$s]"; - private static final ISerializerDeserializer<ADouble> doubleSerde = - SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADOUBLE); - private static final ISerializerDeserializer<AString> stringSerde = - SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ASTRING); - private static final ISerializerDeserializer<AInt64> intSerde = - SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64); - private static final ISerializerDeserializer<ABoolean> booleanSerde = - SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ABOOLEAN); - private static final ISerializerDeserializer<ANull> nullSerde = - SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ANULL); private LangRecordParseUtil() { } - private static void parseExpression(Expression expr, ArrayBackedValueStorage serialized) - throws HyracksDataException, CompilationException { + private static IAdmNode parseExpression(Expression expr) throws HyracksDataException, CompilationException { switch (expr.getKind()) { case LITERAL_EXPRESSION: - parseLiteral((LiteralExpr) expr, serialized); - break; + return parseLiteral((LiteralExpr) expr); case RECORD_CONSTRUCTOR_EXPRESSION: - parseRecord((RecordConstructor) expr, serialized, true, Collections.emptyList()); - break; + return parseRecord((RecordConstructor) expr, Collections.emptyList()); case LIST_CONSTRUCTOR_EXPRESSION: - parseList((ListConstructor) expr, serialized); - break; + return parseList((ListConstructor) expr); default: throw new HyracksDataException(ErrorCode.ASTERIX, ErrorCode.PARSE_ERROR, NOT_ALLOWED_EXPRESSIONS_ERROR_MESSAGE, @@ -92,41 +79,30 @@ public class LangRecordParseUtil { } } - public static void parseRecord(RecordConstructor recordValue, ArrayBackedValueStorage serialized, boolean tagged, - List<Pair<String, String>> defaults) throws HyracksDataException, CompilationException { + public static AdmObjectNode parseRecord(RecordConstructor recordValue, List<Pair<String, String>> defaults) + throws HyracksDataException, CompilationException { + AdmObjectNode record = new AdmObjectNode(); AMutableString fieldNameString = new AMutableString(null); - ArrayBackedValueStorage fieldName = new ArrayBackedValueStorage(); - ArrayBackedValueStorage fieldValue = new ArrayBackedValueStorage(); - RecordBuilder recordBuilder = new RecordBuilder(); - recordBuilder.reset(RecordUtil.FULLY_OPEN_RECORD_TYPE); - recordBuilder.init(); List<FieldBinding> fbList = recordValue.getFbList(); HashSet<String> fieldNames = new HashSet<>(); for (FieldBinding fb : fbList) { - fieldName.reset(); - fieldValue.reset(); // get key fieldNameString.setValue(exprToStringLiteral(fb.getLeftExpr()).getStringValue()); if (!fieldNames.add(fieldNameString.getStringValue())) { throw new HyracksDataException( "Field " + fieldNameString.getStringValue() + " was specified multiple times"); } - stringSerde.serialize(fieldNameString, fieldName.getDataOutput()); // get value - parseExpression(fb.getRightExpr(), fieldValue); - recordBuilder.addField(fieldName, fieldValue); + IAdmNode value = parseExpression(fb.getRightExpr()); + record.set(fieldNameString.getStringValue(), value); } // defaults for (Pair<String, String> kv : defaults) { if (!fieldNames.contains(kv.first)) { - fieldName.reset(); - fieldValue.reset(); - stringSerde.serialize(new AString(kv.first), fieldName.getDataOutput()); - stringSerde.serialize(new AString(kv.second), fieldValue.getDataOutput()); - recordBuilder.addField(fieldName, fieldValue); + record.set(kv.first, new AdmStringNode(kv.second)); } } - recordBuilder.write(serialized.getDataOutput(), tagged); + return record; } public static Literal exprToStringLiteral(Expression expr) throws CompilationException { @@ -143,51 +119,37 @@ public class LangRecordParseUtil { return keyLiteral; } - private static void parseList(ListConstructor valueExpr, ArrayBackedValueStorage serialized) - throws CompilationException, HyracksDataException { + private static AdmArrayNode parseList(ListConstructor valueExpr) throws CompilationException, HyracksDataException { if (valueExpr.getType() != ListConstructor.Type.ORDERED_LIST_CONSTRUCTOR) { throw new HyracksDataException(ErrorCode.ASTERIX, ErrorCode.PARSE_ERROR, "JSON List can't be of type %1$s", valueExpr.getType()); } - ArrayBackedValueStorage serializedValue = new ArrayBackedValueStorage(); - OrderedListBuilder listBuilder = new OrderedListBuilder(); - listBuilder.reset(null); - for (Expression expr : valueExpr.getExprList()) { - serializedValue.reset(); - parseExpression(expr, serializedValue); - listBuilder.addItem(serializedValue); + List<Expression> exprs = valueExpr.getExprList(); + AdmArrayNode list = new AdmArrayNode(exprs.size()); + for (Expression expr : exprs) { + list.add(parseExpression(expr)); } - listBuilder.write(serialized.getDataOutput(), true); + return list; } - private static void parseLiteral(LiteralExpr objectExpr, ArrayBackedValueStorage serialized) - throws HyracksDataException { + private static IAdmNode parseLiteral(LiteralExpr objectExpr) throws HyracksDataException { Literal value = objectExpr.getValue(); switch (value.getLiteralType()) { case DOUBLE: - doubleSerde.serialize(new ADouble((Double) value.getValue()), serialized.getDataOutput()); - break; + case FLOAT: + return new AdmDoubleNode((Double) value.getValue()); case TRUE: - booleanSerde.serialize(ABoolean.TRUE, serialized.getDataOutput()); - break; + return AdmBooleanNode.TRUE; case FALSE: - booleanSerde.serialize(ABoolean.FALSE, serialized.getDataOutput()); - break; - case FLOAT: - doubleSerde.serialize(new ADouble((Float) value.getValue()), serialized.getDataOutput()); - break; + return AdmBooleanNode.FALSE; case INTEGER: - intSerde.serialize(new AInt64(((Integer) value.getValue()).longValue()), serialized.getDataOutput()); - break; + return new AdmBigIntNode((Integer) value.getValue()); case LONG: - intSerde.serialize(new AInt64((Long) value.getValue()), serialized.getDataOutput()); - break; + return new AdmBigIntNode((Long) value.getValue()); case NULL: - nullSerde.serialize(ANull.NULL, serialized.getDataOutput()); - break; + return AdmNullNode.INSTANCE; case STRING: - stringSerde.serialize(new AString((String) value.getValue()), serialized.getDataOutput()); - break; + return new AdmStringNode((String) value.getValue()); default: throw new HyracksDataException(ErrorCode.ASTERIX, ErrorCode.PARSE_ERROR, "Unknown Literal Type %1$s", value.getLiteralType()); @@ -203,6 +165,21 @@ public class LangRecordParseUtil { } } + public static void recordToMap(Map<String, String> map, AdmObjectNode record) throws AlgebricksException { + for (Entry<String, IAdmNode> field : record.getFields()) { + String value = aObjToString(field.getValue()); + map.put(field.getKey(), value); + } + } + + private static String aObjToString(IAdmNode aObj) { + if (aObj.getType() == ATypeTag.STRING) { + return ((AdmStringNode) aObj).get(); + } else { + return aObj.toString(); + } + } + public static String aObjToString(IAObject aObj) throws AlgebricksException { switch (aObj.getType().getTypeTag()) { case DOUBLE: http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataManager.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataManager.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataManager.java index 4474684..e5ee163 100644 --- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataManager.java +++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataManager.java @@ -25,8 +25,6 @@ import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.concurrent.TimeUnit; -import java.util.concurrent.locks.ReadWriteLock; -import java.util.concurrent.locks.ReentrantReadWriteLock; import org.apache.asterix.common.config.MetadataProperties; import org.apache.asterix.common.dataflow.ICcApplicationContext; @@ -60,6 +58,9 @@ import org.apache.asterix.om.types.ARecordType; import org.apache.asterix.transaction.management.opcallbacks.AbstractIndexModificationOperationCallback.Operation; import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException; import org.apache.hyracks.api.exceptions.HyracksDataException; +import org.apache.hyracks.util.ExitUtil; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; /** * Provides access to Asterix metadata via remote methods to the metadata node. @@ -94,6 +95,7 @@ import org.apache.hyracks.api.exceptions.HyracksDataException; * with transaction ids of regular jobs or other metadata transactions. */ public abstract class MetadataManager implements IMetadataManager { + private static final Logger LOGGER = LogManager.getLogger(); private final MetadataCache cache = new MetadataCache(); protected final Collection<IAsterixStateProxy> proxies; protected IMetadataNode metadataNode; @@ -132,15 +134,29 @@ public abstract class MetadataManager implements IMetadataManager { return new MetadataTransactionContext(txnId); } + @SuppressWarnings("squid:S1181") @Override - public void commitTransaction(MetadataTransactionContext ctx) throws RemoteException, ACIDException { - metadataNode.commitTransaction(ctx.getTxnId()); - cache.commit(ctx); + public void commitTransaction(MetadataTransactionContext ctx) { + try { + metadataNode.commitTransaction(ctx.getTxnId()); + cache.commit(ctx); + } catch (Throwable th) { + // Metadata node should abort all transactions on re-joining the new CC + LOGGER.fatal("Failure committing a metadata transaction", th); + ExitUtil.halt(ExitUtil.EC_FAILED_TO_COMMIT_METADATA_TXN); + } } + @SuppressWarnings("squid:S1181") @Override - public void abortTransaction(MetadataTransactionContext ctx) throws RemoteException, ACIDException { - metadataNode.abortTransaction(ctx.getTxnId()); + public void abortTransaction(MetadataTransactionContext ctx) { + try { + metadataNode.abortTransaction(ctx.getTxnId()); + } catch (Throwable th) { + // Metadata node should abort all transactions on re-joining the new CC + LOGGER.fatal("Failure aborting a metadata transaction", th); + ExitUtil.halt(ExitUtil.EC_FAILED_TO_ABORT_METADATA_TXN); + } } @Override http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java index 543b794..164c867 100644 --- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java +++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java @@ -30,18 +30,15 @@ import org.apache.asterix.common.api.IDatasetLifecycleManager; import org.apache.asterix.common.api.INcApplicationContext; import org.apache.asterix.common.config.DatasetConfig.DatasetType; import org.apache.asterix.common.config.DatasetConfig.IndexType; -import org.apache.asterix.common.context.PrimaryIndexOperationTracker; import org.apache.asterix.common.dataflow.LSMIndexUtil; import org.apache.asterix.common.exceptions.ACIDException; import org.apache.asterix.common.functions.FunctionSignature; import org.apache.asterix.common.metadata.MetadataIndexImmutableProperties; -import org.apache.asterix.common.transactions.DatasetId; import org.apache.asterix.common.transactions.IRecoveryManager.ResourceType; import org.apache.asterix.common.transactions.ITransactionContext; import org.apache.asterix.common.transactions.ITransactionManager.AtomicityLevel; import org.apache.asterix.common.transactions.ITransactionSubsystem; import org.apache.asterix.common.transactions.ITxnIdFactory; -import org.apache.asterix.common.transactions.ImmutableDatasetId; import org.apache.asterix.common.transactions.TransactionOptions; import org.apache.asterix.common.transactions.TxnId; import org.apache.asterix.common.utils.StoragePathUtil; @@ -124,10 +121,13 @@ import org.apache.hyracks.storage.common.IIndexAccessor; import org.apache.hyracks.storage.common.IIndexCursor; import org.apache.hyracks.storage.common.IModificationOperationCallback; import org.apache.hyracks.storage.common.MultiComparator; +import org.apache.hyracks.util.ExitUtil; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; public class MetadataNode implements IMetadataNode { private static final long serialVersionUID = 1L; - + private static final Logger LOGGER = LogManager.getLogger(); // shared between core and extension private IDatasetLifecycleManager datasetLifecycleManager; private ITransactionSubsystem transactionSubsystem; @@ -172,14 +172,28 @@ public class MetadataNode implements IMetadataNode { transactionSubsystem.getTransactionManager().beginTransaction(transactionId, options); } + @SuppressWarnings("squid:S1181") @Override public void commitTransaction(TxnId txnId) throws RemoteException, ACIDException { - transactionSubsystem.getTransactionManager().commitTransaction(txnId); + try { + transactionSubsystem.getTransactionManager().commitTransaction(txnId); + } catch (Throwable th) { + // Metadata node should abort all Metadata transactions on re-start + LOGGER.fatal("Failure committing a metadata transaction", th); + ExitUtil.halt(ExitUtil.EC_FAILED_TO_COMMIT_METADATA_TXN); + } } + @SuppressWarnings("squid:S1181") @Override public void abortTransaction(TxnId txnId) throws RemoteException, ACIDException { - transactionSubsystem.getTransactionManager().abortTransaction(txnId); + try { + transactionSubsystem.getTransactionManager().abortTransaction(txnId); + } catch (Throwable th) { + // Metadata node should abort all uncommitted transactions on re-start + LOGGER.fatal("Failure committing a metadata transaction", th); + ExitUtil.halt(ExitUtil.EC_FAILED_TO_ABORT_METADATA_TXN); + } } // TODO(amoudi): make all metadata operations go through the generic methods http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataset.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataset.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataset.java index bcd05ee..d0a22b7 100644 --- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataset.java +++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataset.java @@ -127,9 +127,6 @@ public class Dataset implements IMetadataEntity<Dataset>, IDataset { */ private static final long serialVersionUID = 1L; private static final Logger LOGGER = LogManager.getLogger(); - //TODO: Remove Singletons - private static final BTreeResourceFactoryProvider bTreeResourceFactoryProvider = - BTreeResourceFactoryProvider.INSTANCE; private static final RTreeResourceFactoryProvider rTreeResourceFactoryProvider = RTreeResourceFactoryProvider.INSTANCE; private static final InvertedIndexResourceFactoryProvider invertedIndexResourceFactoryProvider = @@ -153,10 +150,6 @@ public class Dataset implements IMetadataEntity<Dataset>, IDataset { private final long rebalanceCount; private int pendingOp; - /* - * Transient (For caching) - */ - public Dataset(String dataverseName, String datasetName, String recordTypeDataverseName, String recordTypeName, String nodeGroupName, String compactionPolicy, Map<String, String> compactionPolicyProperties, IDatasetDetails datasetDetails, Map<String, String> hints, DatasetType datasetType, int datasetId, @@ -473,8 +466,9 @@ public class Dataset implements IMetadataEntity<Dataset>, IDataset { IResourceFactory resourceFactory; switch (index.getIndexType()) { case BTREE: - resourceFactory = bTreeResourceFactoryProvider.getResourceFactory(mdProvider, this, index, recordType, - metaType, mergePolicyFactory, mergePolicyProperties, filterTypeTraits, filterCmpFactories); + resourceFactory = BTreeResourceFactoryProvider.INSTANCE.getResourceFactory(mdProvider, this, index, + recordType, metaType, mergePolicyFactory, mergePolicyProperties, filterTypeTraits, + filterCmpFactories); break; case RTREE: resourceFactory = rTreeResourceFactoryProvider.getResourceFactory(mdProvider, this, index, recordType, @@ -853,4 +847,8 @@ public class Dataset implements IMetadataEntity<Dataset>, IDataset { } return partitions; } + + public String getFullyQualifiedName() { + return dataverseName + '.' + datasetName; + } } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataverse.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataverse.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataverse.java index 1b40484..35d21a0 100644 --- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataverse.java +++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataverse.java @@ -65,4 +65,19 @@ public class Dataverse implements IMetadataEntity<Dataverse> { public String toString() { return getClass().getSimpleName() + ":" + dataverseName; } + + @Override + public boolean equals(Object o) { + if (!(o instanceof Dataverse)) { + return false; + } + Dataverse other = (Dataverse) o; + return dataverseName.equals(other.getDataverseName()); + } + + @Override + public int hashCode() { + return dataverseName.hashCode(); + } + } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/SerializerDeserializerProvider.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/SerializerDeserializerProvider.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/SerializerDeserializerProvider.java index d66673d..0cba8b6 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/SerializerDeserializerProvider.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/SerializerDeserializerProvider.java @@ -81,8 +81,7 @@ public class SerializerDeserializerProvider implements ISerializerDeserializerPr // Can't be shared among threads <Stateful> @SuppressWarnings("rawtypes") public ISerializerDeserializer getAStringSerializerDeserializer() { - return addTag(new AStringSerializerDeserializer(new UTF8StringWriter(), new UTF8StringReader()), - ATypeTag.STRING); + return addTag(new AStringSerializerDeserializer(new UTF8StringWriter(), new UTF8StringReader())); } @SuppressWarnings("rawtypes") @@ -98,7 +97,7 @@ public class SerializerDeserializerProvider implements ISerializerDeserializerPr // we could do smth better for nullable fields return AObjectSerializerDeserializer.INSTANCE; default: - return addTag(getNonTaggedSerializerDeserializer(aqlType), aqlType.getTypeTag()); + return addTag(getNonTaggedSerializerDeserializer(aqlType)); } } @@ -172,7 +171,7 @@ public class SerializerDeserializerProvider implements ISerializerDeserializerPr } @SuppressWarnings("rawtypes") - private ISerializerDeserializer addTag(final ISerializerDeserializer nonTaggedSerde, final ATypeTag typeTag) { + private ISerializerDeserializer addTag(final ISerializerDeserializer nonTaggedSerde) { return new ISerializerDeserializer<IAObject>() { private static final long serialVersionUID = 1L; http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/TypeTraitProvider.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/TypeTraitProvider.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/TypeTraitProvider.java index 9ec5a08..1836cfa 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/TypeTraitProvider.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/TypeTraitProvider.java @@ -36,7 +36,7 @@ public class TypeTraitProvider implements ITypeTraitProvider { private static final ITypeTraits THIRTYTWOBYTETYPETRAIT = new TypeTrait(32 + 1); private static final ITypeTraits TWENTYFOURBYTETYPETRAIT = new TypeTrait(24 + 1); - private static final ITypeTraits VARLENTYPETRAIT = new TypeTrait(false, -1); + public static final ITypeTraits VARLENTYPETRAIT = new TypeTrait(false, -1); public static final TypeTraitProvider INSTANCE = new TypeTraitProvider(); http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmArrayNode.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmArrayNode.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmArrayNode.java index e489cd5..60ef41a 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmArrayNode.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmArrayNode.java @@ -18,12 +18,19 @@ */ package org.apache.asterix.object.base; +import java.io.DataOutput; +import java.io.IOException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; +import org.apache.asterix.builders.OrderedListBuilder; +import org.apache.asterix.om.types.AOrderedListType; import org.apache.asterix.om.types.ATypeTag; +import org.apache.hyracks.data.std.util.ArrayBackedValueStorage; -public class AdmArrayNode implements IAdmNode { +public class AdmArrayNode implements IAdmNode, Iterable<IAdmNode> { + private static final long serialVersionUID = 1L; private final List<IAdmNode> children; public AdmArrayNode() { @@ -42,6 +49,10 @@ public class AdmArrayNode implements IAdmNode { add(AdmBooleanNode.get(value)); } + public int size() { + return children.size(); + } + public void add(IAdmNode value) { if (value == null) { value = AdmNullNode.INSTANCE; // NOSONAR @@ -74,4 +85,23 @@ public class AdmArrayNode implements IAdmNode { public String toString() { return children.toString(); } + + @Override + public void serializeValue(DataOutput dataOutput) throws IOException { + OrderedListBuilder listBuilder = new OrderedListBuilder(); + listBuilder.reset(AOrderedListType.FULL_OPEN_ORDEREDLIST_TYPE); + ArrayBackedValueStorage itemValue = new ArrayBackedValueStorage(); + for (int i = 0; i < children.size(); i++) { + itemValue.reset(); + IAdmNode next = children.get(i); + next.serialize(itemValue.getDataOutput()); + listBuilder.addItem(itemValue); + } + listBuilder.write(dataOutput, false); + } + + @Override + public Iterator<IAdmNode> iterator() { + return children.iterator(); + } } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmBigIntNode.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmBigIntNode.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmBigIntNode.java index 0006668..61afc74 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmBigIntNode.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmBigIntNode.java @@ -18,9 +18,14 @@ */ package org.apache.asterix.object.base; +import java.io.DataOutput; +import java.io.IOException; + import org.apache.asterix.om.types.ATypeTag; public class AdmBigIntNode implements IAdmNode { + + private static final long serialVersionUID = 1L; private long value; public AdmBigIntNode() { @@ -52,4 +57,9 @@ public class AdmBigIntNode implements IAdmNode { public String toString() { return Long.toString(value); } + + @Override + public void serializeValue(DataOutput dataOutput) throws IOException { + dataOutput.writeLong(value); + } } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmBooleanNode.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmBooleanNode.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmBooleanNode.java index aeebd86..721ce4c 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmBooleanNode.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmBooleanNode.java @@ -18,10 +18,14 @@ */ package org.apache.asterix.object.base; +import java.io.DataOutput; +import java.io.IOException; + import org.apache.asterix.om.types.ATypeTag; public class AdmBooleanNode implements IAdmNode { + private static final long serialVersionUID = 1L; public static final AdmBooleanNode TRUE = new AdmBooleanNode(true); public static final AdmBooleanNode FALSE = new AdmBooleanNode(false); private final boolean value; @@ -56,4 +60,9 @@ public class AdmBooleanNode implements IAdmNode { public String toString() { return Boolean.toString(value); } + + @Override + public void serializeValue(DataOutput dataOutput) throws IOException { + dataOutput.writeBoolean(value); + } } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmDoubleNode.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmDoubleNode.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmDoubleNode.java index 0150b4e..0601e63 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmDoubleNode.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmDoubleNode.java @@ -18,9 +18,13 @@ */ package org.apache.asterix.object.base; +import java.io.DataOutput; +import java.io.IOException; + import org.apache.asterix.om.types.ATypeTag; public class AdmDoubleNode implements IAdmNode { + private static final long serialVersionUID = 1L; private double value; public AdmDoubleNode() { @@ -53,4 +57,9 @@ public class AdmDoubleNode implements IAdmNode { public String toString() { return Double.toString(value); } + + @Override + public void serializeValue(DataOutput dataOutput) throws IOException { + dataOutput.writeDouble(value); + } } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmNullNode.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmNullNode.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmNullNode.java index 2804ca3..6fe8357 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmNullNode.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmNullNode.java @@ -18,10 +18,14 @@ */ package org.apache.asterix.object.base; +import java.io.DataOutput; +import java.io.IOException; + import org.apache.asterix.om.types.ATypeTag; public class AdmNullNode implements IAdmNode { + private static final long serialVersionUID = 1L; public static final AdmNullNode INSTANCE = new AdmNullNode(); private AdmNullNode() { @@ -41,4 +45,9 @@ public class AdmNullNode implements IAdmNode { public String toString() { return "null"; } + + @Override + public void serializeValue(DataOutput dataOutput) throws IOException { + // Nothing to write + } } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmObjectNode.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmObjectNode.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmObjectNode.java index e35b28f..99b7176 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmObjectNode.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmObjectNode.java @@ -18,23 +18,43 @@ */ package org.apache.asterix.object.base; +import java.io.DataOutput; +import java.io.IOException; +import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import org.apache.asterix.builders.RecordBuilder; +import org.apache.asterix.common.exceptions.CompilationException; +import org.apache.asterix.common.exceptions.ErrorCode; +import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider; +import org.apache.asterix.om.base.AString; import org.apache.asterix.om.types.ATypeTag; +import org.apache.asterix.om.types.BuiltinType; +import org.apache.asterix.om.utils.RecordUtil; +import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer; +import org.apache.hyracks.api.exceptions.HyracksDataException; +import org.apache.hyracks.data.std.util.ArrayBackedValueStorage; /** * An adm object instance */ public class AdmObjectNode implements IAdmNode { + + private static final long serialVersionUID = 1L; + public static final AdmObjectNode EMPTY = new AdmObjectNode(Collections.emptyMap()); private final Map<String, IAdmNode> children; public AdmObjectNode() { children = new HashMap<>(); } + public AdmObjectNode(Map<String, IAdmNode> children) { + this.children = children; + } + @Override public ATypeTag getType() { return ATypeTag.OBJECT; @@ -56,10 +76,13 @@ public class AdmObjectNode implements IAdmNode { return children.entrySet(); } - public AdmObjectNode set(String fieldName, IAdmNode value) { + public AdmObjectNode set(String fieldName, IAdmNode value) throws CompilationException { if (value == null) { value = AdmNullNode.INSTANCE; // NOSONAR } + if (children.containsKey(fieldName)) { + throw new CompilationException(ErrorCode.DUPLICATE_FIELD_NAME, fieldName); + } children.put(fieldName, value); return this; } @@ -92,4 +115,51 @@ public class AdmObjectNode implements IAdmNode { sb.append("}"); return sb.toString(); } + + public static AdmObjectNode from(Map<String, IAdmNode> fields) { + return fields.isEmpty() ? EMPTY : new AdmObjectNode(fields); + } + + public boolean isEmpty() { + return children.isEmpty(); + } + + @Override + public void serializeValue(DataOutput dataOutput) throws IOException { + ISerializerDeserializer<AString> stringSerde = + SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ASTRING); + RecordBuilder confRecordBuilder = new RecordBuilder(); + confRecordBuilder.reset(RecordUtil.FULLY_OPEN_RECORD_TYPE); + confRecordBuilder.init(); + ArrayBackedValueStorage fieldNameBytes = new ArrayBackedValueStorage(); + ArrayBackedValueStorage fieldValueBytes = new ArrayBackedValueStorage(); + for (Entry<String, IAdmNode> field : getFields()) { + String fieldName = field.getKey(); + fieldValueBytes.reset(); + fieldNameBytes.reset(); + stringSerde.serialize(new AString(fieldName), fieldNameBytes.getDataOutput()); + IAdmNode value = field.getValue(); + value.serialize(fieldValueBytes.getDataOutput()); + confRecordBuilder.addField(fieldNameBytes, fieldValueBytes); + } + confRecordBuilder.write(dataOutput, false); + } + + public boolean contains(String fieldName) { + return children.containsKey(fieldName); + } + + public String getString(String field) throws HyracksDataException { + return getString(this, field); + } + + public static String getString(AdmObjectNode openFields, String field) throws HyracksDataException { + IAdmNode node = openFields.get(field); + if (node == null) { + throw HyracksDataException.create(ErrorCode.FIELD_NOT_FOUND, field); + } else if (node.getType() != ATypeTag.STRING) { + throw HyracksDataException.create(ErrorCode.FIELD_NOT_OF_TYPE, field, ATypeTag.STRING, node.getType()); + } + return ((AdmStringNode) node).get(); + } } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmStringNode.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmStringNode.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmStringNode.java index 4c92f09..3dc70d1 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmStringNode.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmStringNode.java @@ -18,9 +18,15 @@ */ package org.apache.asterix.object.base; +import java.io.DataOutput; +import java.io.IOException; + import org.apache.asterix.om.types.ATypeTag; +import org.apache.hyracks.util.string.UTF8StringUtil; public class AdmStringNode implements IAdmNode { + + private static final long serialVersionUID = 1L; private String value; public AdmStringNode() { @@ -49,4 +55,9 @@ public class AdmStringNode implements IAdmNode { return "\"" + value + "\""; } + @Override + public void serializeValue(DataOutput dataOutput) throws IOException { + UTF8StringUtil.writeUTF8(value, dataOutput, null); + } + } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/IAdmNode.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/IAdmNode.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/IAdmNode.java index c382fd2..98d7fe4 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/IAdmNode.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/IAdmNode.java @@ -18,12 +18,16 @@ */ package org.apache.asterix.object.base; +import java.io.DataOutput; +import java.io.IOException; +import java.io.Serializable; + import org.apache.asterix.om.types.ATypeTag; /** * An interface representing an adm node */ -public interface IAdmNode { +public interface IAdmNode extends Serializable { /** * @return true if the object is a value, false if the object is a container @@ -62,4 +66,23 @@ public interface IAdmNode { * reset the node */ void reset(); + + /** + * Serialize the field with a type tag + * + * @param dataOutput + * @throws IOException + */ + default void serialize(DataOutput dataOutput) throws IOException { + dataOutput.writeByte(getType().serialize()); + serializeValue(dataOutput); + } + + /** + * Serialize the value without a type tag + * + * @param dataOutput + * @throws IOException + */ + void serializeValue(DataOutput dataOutput) throws IOException; } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/AIntervalPointable.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/AIntervalPointable.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/AIntervalPointable.java index ce04f6d..299649b 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/AIntervalPointable.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/AIntervalPointable.java @@ -99,6 +99,7 @@ public class AIntervalPointable extends AbstractPointable { start.set(bytes, getStartOffset(), getStartSize()); } + @Override public int getStartOffset() { return getTypeOffset() + getTypeSize(); } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/AListPointable.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/AListPointable.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/AListPointable.java index 7c74a69..8d525f3 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/AListPointable.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/AListPointable.java @@ -22,7 +22,6 @@ package org.apache.asterix.om.pointables.nonvisitor; import java.io.DataOutput; import java.io.IOException; -import org.apache.asterix.common.exceptions.AsterixException; import org.apache.asterix.om.types.AOrderedListType; import org.apache.asterix.om.types.ATypeTag; import org.apache.asterix.om.types.AbstractCollectionType; @@ -40,6 +39,7 @@ import org.apache.hyracks.data.std.primitive.IntegerPointable; * This class interprets the binary data representation of a list. * * List { + * byte tag; * byte type; * int length; * int numberOfItems; @@ -62,11 +62,16 @@ public class AListPointable extends AbstractPointable { } }; - public static final IPointableFactory FACTORY = new IPointableFactory() { + public static final AListPointableFactory FACTORY = new AListPointableFactory(); + + public static class AListPointableFactory implements IPointableFactory { private static final long serialVersionUID = 1L; + private AListPointableFactory() { + } + @Override - public IPointable createPointable() { + public AListPointable createPointable() { return new AListPointable(); } @@ -169,7 +174,7 @@ public class AListPointable extends AbstractPointable { return getItemCountOffset() + getItemCountSize() + index * getFixedLength(inputType); } else { int offset = getItemCountOffset() + getItemCountSize() + index * ITEM_OFFSET_SIZE; - return IntegerPointable.getInteger(bytes, offset); + return start + IntegerPointable.getInteger(bytes, offset); } } @@ -195,5 +200,4 @@ public class AListPointable extends AbstractPointable { } dOut.write(bytes, getItemOffset(inputType, index), getItemSize(inputType, index)); } - } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/ARecordPointable.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/ARecordPointable.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/ARecordPointable.java index 77491e8..8ae533b 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/ARecordPointable.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/ARecordPointable.java @@ -22,7 +22,6 @@ package org.apache.asterix.om.pointables.nonvisitor; import java.io.DataOutput; import java.io.IOException; -import org.apache.asterix.common.exceptions.AsterixException; import org.apache.asterix.om.types.ARecordType; import org.apache.asterix.om.types.ATypeTag; import org.apache.asterix.om.types.AUnionType; @@ -230,6 +229,21 @@ public class ARecordPointable extends AbstractPointable { } } + /** + * This is always untagged + * + * @param recordType + * @param fieldId + * @param pointable + * @throws IOException + */ + public void getClosedFieldValue(ARecordType recordType, int fieldId, IPointable pointable) throws IOException { + if (isClosedFieldNull(recordType, fieldId) || isClosedFieldMissing(recordType, fieldId)) { + throw new IllegalStateException("Can't read a null or missing field"); + } + pointable.set(bytes, getClosedFieldOffset(recordType, fieldId), getClosedFieldSize(recordType, fieldId)); + } + public String getClosedFieldName(ARecordType recordType, int fieldId) { return recordType.getFieldNames()[fieldId]; } @@ -304,6 +318,14 @@ public class ARecordPointable extends AbstractPointable { dOut.write(bytes, getOpenFieldNameOffset(recordType, fieldId), getOpenFieldNameSize(recordType, fieldId)); } + public String getOpenFieldName(ARecordType recordType, int fieldId) throws IOException { + StringBuilder str = new StringBuilder(); + int offset = getOpenFieldNameOffset(recordType, fieldId); + UTF8StringUtil.toString(str, bytes, offset); + String fieldName = str.toString(); + return fieldName; + } + public int getOpenFieldNameSize(ARecordType recordType, int fieldId) { int utfleng = UTF8StringUtil.getUTFLength(bytes, getOpenFieldNameOffset(recordType, fieldId)); return utfleng + UTF8StringUtil.getNumBytesToStoreLength(utfleng); @@ -340,5 +362,4 @@ public class ARecordPointable extends AbstractPointable { public int getOpenFieldOffsetSize(ARecordType recordType, int fieldId) { return OPEN_FIELD_HASH_SIZE; } - } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/utils/AdmNodeUtils.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/utils/AdmNodeUtils.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/utils/AdmNodeUtils.java new file mode 100644 index 0000000..6f4ee17 --- /dev/null +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/utils/AdmNodeUtils.java @@ -0,0 +1,163 @@ +/* + * 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.utils; + +import java.io.IOException; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import org.apache.asterix.object.base.AdmArrayNode; +import org.apache.asterix.object.base.AdmBigIntNode; +import org.apache.asterix.object.base.AdmBooleanNode; +import org.apache.asterix.object.base.AdmDoubleNode; +import org.apache.asterix.object.base.AdmNullNode; +import org.apache.asterix.object.base.AdmObjectNode; +import org.apache.asterix.object.base.AdmStringNode; +import org.apache.asterix.object.base.IAdmNode; +import org.apache.asterix.om.pointables.nonvisitor.AListPointable; +import org.apache.asterix.om.pointables.nonvisitor.ARecordPointable; +import org.apache.asterix.om.types.AOrderedListType; +import org.apache.asterix.om.types.ARecordType; +import org.apache.asterix.om.types.ATypeTag; +import org.apache.hyracks.data.std.primitive.BooleanPointable; +import org.apache.hyracks.data.std.primitive.DoublePointable; +import org.apache.hyracks.data.std.primitive.LongPointable; +import org.apache.hyracks.data.std.primitive.UTF8StringPointable; + +public class AdmNodeUtils { + + private AdmNodeUtils() { + } + + public static Map<String, IAdmNode> getOpenFields(ARecordPointable recPointable, ARecordType recordType) + throws IOException { + int openFieldCount = recPointable.getOpenFieldCount(recordType); + Map<String, IAdmNode> map = (openFieldCount == 0) ? Collections.emptyMap() : new HashMap<>(); + for (int i = 0; i < openFieldCount; i++) { + map.put(recPointable.getOpenFieldName(recordType, i), getOpenField(recPointable, recordType, i)); + } + return map; + } + + private static IAdmNode getOpenField(ARecordPointable recPointable, ARecordType type, int i) throws IOException { + byte tagByte = recPointable.getOpenFieldTag(type, i); + ATypeTag tag = ATypeTag.VALUE_TYPE_MAPPING[tagByte]; + switch (tag) { + case ARRAY: + return getOpenFieldAsArray(recPointable, type, i); + case BIGINT: + return new AdmBigIntNode(LongPointable.getLong(recPointable.getByteArray(), + recPointable.getOpenFieldValueOffset(type, i) + 1)); + case BOOLEAN: + return AdmBooleanNode.get(BooleanPointable.getBoolean(recPointable.getByteArray(), + recPointable.getOpenFieldValueOffset(type, i) + 1)); + case DOUBLE: + return new AdmDoubleNode(DoublePointable.getDouble(recPointable.getByteArray(), + recPointable.getOpenFieldValueOffset(type, i) + 1)); + case NULL: + return AdmNullNode.INSTANCE; + case OBJECT: + return getOpenFieldAsObject(recPointable, type, i); + case STRING: + UTF8StringPointable str = UTF8StringPointable.FACTORY.createPointable(); + str.set(recPointable.getByteArray(), recPointable.getOpenFieldValueOffset(type, i) + 1, + recPointable.getOpenFieldValueSize(type, i) - 1); + return new AdmStringNode(str.toString()); + default: + throw new UnsupportedOperationException("Unsupported item type: " + tag); + } + } + + private static AdmObjectNode getOpenFieldAsObject(ARecordPointable recPointable, ARecordType type, int i) + throws IOException { + ARecordPointable pointable = ARecordPointable.FACTORY.createPointable(); + int offset = recPointable.getOpenFieldValueOffset(type, i); + int len = recPointable.getOpenFieldValueSize(type, i); + pointable.set(recPointable.getByteArray(), offset, len); + return new AdmObjectNode(getOpenFields(pointable, RecordUtil.FULLY_OPEN_RECORD_TYPE)); + } + + private static AdmArrayNode getOpenFieldAsArray(ARecordPointable recPointable, ARecordType type, int i) + throws IOException { + AListPointable pointable = AListPointable.FACTORY.createPointable(); + int offset = recPointable.getOpenFieldValueOffset(type, i); + int len = recPointable.getOpenFieldValueSize(type, i); + pointable.set(recPointable.getByteArray(), offset, len); + return getAsAdmNode(pointable); + } + + public static AdmArrayNode getAsAdmNode(AListPointable listPointable) throws IOException { + int count = listPointable.getItemCount(); + AdmArrayNode node = new AdmArrayNode(count); + for (int i = 0; i < count; i++) { + byte tagByte = listPointable.getItemTag(AOrderedListType.FULL_OPEN_ORDEREDLIST_TYPE, i); + ATypeTag itemTag = ATypeTag.VALUE_TYPE_MAPPING[tagByte]; + switch (itemTag) { + case ARRAY: + node.add(getOpenFieldAsArray(listPointable, i)); + break; + case BIGINT: + node.add(new AdmBigIntNode(LongPointable.getLong(listPointable.getByteArray(), + listPointable.getItemOffset(AOrderedListType.FULL_OPEN_ORDEREDLIST_TYPE, i) + 1))); + break; + case BOOLEAN: + node.add(AdmBooleanNode.get(BooleanPointable.getBoolean(listPointable.getByteArray(), + listPointable.getItemOffset(AOrderedListType.FULL_OPEN_ORDEREDLIST_TYPE, i) + 1))); + break; + case DOUBLE: + node.add(new AdmDoubleNode(DoublePointable.getDouble(listPointable.getByteArray(), + listPointable.getItemOffset(AOrderedListType.FULL_OPEN_ORDEREDLIST_TYPE, i) + 1))); + break; + case NULL: + node.add(AdmNullNode.INSTANCE); + break; + case OBJECT: + node.add(getOpenFieldAsObject(listPointable, i)); + break; + case STRING: + UTF8StringPointable str = UTF8StringPointable.FACTORY.createPointable(); + str.set(listPointable.getByteArray(), + listPointable.getItemOffset(AOrderedListType.FULL_OPEN_ORDEREDLIST_TYPE, i) + 1, + listPointable.getItemSize(AOrderedListType.FULL_OPEN_ORDEREDLIST_TYPE, i)); + node.add(new AdmStringNode(str.toString())); + break; + default: + throw new UnsupportedOperationException("Unsupported item type: " + itemTag); + } + } + return node; + } + + private static IAdmNode getOpenFieldAsObject(AListPointable listPointable, int i) throws IOException { + ARecordPointable pointable = ARecordPointable.FACTORY.createPointable(); + int offset = listPointable.getItemOffset(AOrderedListType.FULL_OPEN_ORDEREDLIST_TYPE, i); + int len = listPointable.getItemSize(AOrderedListType.FULL_OPEN_ORDEREDLIST_TYPE, i); + pointable.set(listPointable.getByteArray(), offset, len); + return new AdmObjectNode(AdmNodeUtils.getOpenFields(pointable, RecordUtil.FULLY_OPEN_RECORD_TYPE)); + } + + private static AdmArrayNode getOpenFieldAsArray(AListPointable listPointable, int i) throws IOException { + AListPointable pointable = AListPointable.FACTORY.createPointable(); + int offset = listPointable.getItemOffset(AOrderedListType.FULL_OPEN_ORDEREDLIST_TYPE, i); + int len = listPointable.getItemSize(AOrderedListType.FULL_OPEN_ORDEREDLIST_TYPE, i); + pointable.set(listPointable.getByteArray(), offset, len); + return getAsAdmNode(pointable); + } +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/api/AbstractPointable.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/api/AbstractPointable.java b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/api/AbstractPointable.java index 05417a8..2e21048 100644 --- a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/api/AbstractPointable.java +++ b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/api/AbstractPointable.java @@ -19,6 +19,7 @@ package org.apache.hyracks.data.std.api; public abstract class AbstractPointable implements IPointable { + protected byte[] bytes; protected int start; http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/api/IPointableFactory.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/api/IPointableFactory.java b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/api/IPointableFactory.java index 5294d17..aee3047 100644 --- a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/api/IPointableFactory.java +++ b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/api/IPointableFactory.java @@ -23,7 +23,7 @@ import java.io.Serializable; import org.apache.hyracks.api.dataflow.value.ITypeTraits; public interface IPointableFactory extends Serializable { - public IPointable createPointable(); + IPointable createPointable(); - public ITypeTraits getTypeTraits(); + ITypeTraits getTypeTraits(); } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/BooleanPointable.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/BooleanPointable.java b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/BooleanPointable.java index bd18ea0..ea6086d 100644 --- a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/BooleanPointable.java +++ b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/BooleanPointable.java @@ -26,7 +26,6 @@ import org.apache.hyracks.data.std.api.IPointable; import org.apache.hyracks.data.std.api.IPointableFactory; public final class BooleanPointable extends AbstractPointable implements IHashable, IComparable { - public static final BooleanPointableFactory FACTORY = new BooleanPointableFactory(); public static final ITypeTraits TYPE_TRAITS = new ITypeTraits() { @@ -47,11 +46,11 @@ public final class BooleanPointable extends AbstractPointable implements IHashab private static final long serialVersionUID = 1L; @Override - public IPointable createPointable() { + public BooleanPointable createPointable() { return new BooleanPointable(); } - public IPointable createPointable(boolean value) { + public BooleanPointable createPointable(boolean value) { BooleanPointable pointable = new BooleanPointable(); pointable.setBoolean(value); return pointable; http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/BytePointable.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/BytePointable.java b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/BytePointable.java index 5b623e7..9e81083 100644 --- a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/BytePointable.java +++ b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/BytePointable.java @@ -27,6 +27,7 @@ import org.apache.hyracks.data.std.api.IPointable; import org.apache.hyracks.data.std.api.IPointableFactory; public final class BytePointable extends AbstractPointable implements IHashable, IComparable, INumeric { + public static final ITypeTraits TYPE_TRAITS = new ITypeTraits() { private static final long serialVersionUID = 1L; http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/DoublePointable.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/DoublePointable.java b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/DoublePointable.java index 3464a9f..16294b3 100644 --- a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/DoublePointable.java +++ b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/DoublePointable.java @@ -27,14 +27,15 @@ import org.apache.hyracks.data.std.api.IPointable; import org.apache.hyracks.data.std.api.IPointableFactory; public final class DoublePointable extends AbstractPointable implements IHashable, IComparable, INumeric { - private final static double machineEpsilon; - static { - float epsilon = 1.0f; + private static final double MACHINE_EPSILON = getMachineEpsilon(); + + private static double getMachineEpsilon() { + float epsilon = 1.0f; do { epsilon /= 2.0f; } while ((float) (1.0 + (epsilon / 2.0)) != 1.0); - machineEpsilon = epsilon; + return epsilon; } public static final ITypeTraits TYPE_TRAITS = new ITypeTraits() { @@ -150,6 +151,6 @@ public final class DoublePointable extends AbstractPointable implements IHashabl } public static double getEpsilon() { - return machineEpsilon; + return MACHINE_EPSILON; } } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/FloatPointable.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/FloatPointable.java b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/FloatPointable.java index b0f686f..4cb298f 100644 --- a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/FloatPointable.java +++ b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/FloatPointable.java @@ -27,6 +27,7 @@ import org.apache.hyracks.data.std.api.IPointable; import org.apache.hyracks.data.std.api.IPointableFactory; public final class FloatPointable extends AbstractPointable implements IHashable, IComparable, INumeric { + public static final ITypeTraits TYPE_TRAITS = new ITypeTraits() { private static final long serialVersionUID = 1L; http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/IntegerPointable.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/IntegerPointable.java b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/IntegerPointable.java index a3b9f44..03aaa97 100644 --- a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/IntegerPointable.java +++ b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/IntegerPointable.java @@ -27,6 +27,7 @@ import org.apache.hyracks.data.std.api.IPointable; import org.apache.hyracks.data.std.api.IPointableFactory; public final class IntegerPointable extends AbstractPointable implements IHashable, IComparable, INumeric { + public static final ITypeTraits TYPE_TRAITS = new ITypeTraits() { private static final long serialVersionUID = 1L; http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/RawUTF8StringPointable.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/RawUTF8StringPointable.java b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/RawUTF8StringPointable.java index 70bac4d..f75db9d 100644 --- a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/RawUTF8StringPointable.java +++ b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/RawUTF8StringPointable.java @@ -32,6 +32,7 @@ import org.apache.hyracks.util.string.UTF8StringUtil; * But it works for single-byte character languages. */ public final class RawUTF8StringPointable extends AbstractPointable implements IHashable, IComparable { + public static final ITypeTraits TYPE_TRAITS = new ITypeTraits() { private static final long serialVersionUID = 1L; http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/ShortPointable.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/ShortPointable.java b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/ShortPointable.java index 70ad44c..55e6201 100644 --- a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/ShortPointable.java +++ b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/ShortPointable.java @@ -27,6 +27,7 @@ import org.apache.hyracks.data.std.api.IPointable; import org.apache.hyracks.data.std.api.IPointableFactory; public final class ShortPointable extends AbstractPointable implements IHashable, IComparable, INumeric { + public static final ITypeTraits TYPE_TRAITS = new ITypeTraits() { private static final long serialVersionUID = 1L; http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/TaggedValuePointable.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/TaggedValuePointable.java b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/TaggedValuePointable.java index 7acd32c..dcb1e75 100644 --- a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/TaggedValuePointable.java +++ b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/TaggedValuePointable.java @@ -20,29 +20,33 @@ import org.apache.hyracks.api.dataflow.value.ITypeTraits; import org.apache.hyracks.data.std.api.AbstractPointable; import org.apache.hyracks.data.std.api.IPointable; import org.apache.hyracks.data.std.api.IPointableFactory; -import org.apache.hyracks.data.std.primitive.BytePointable; -import org.apache.hyracks.data.std.primitive.VoidPointable; public class TaggedValuePointable extends AbstractPointable { - public static final IPointableFactory FACTORY = new IPointableFactory() { + public static final TaggedValuePointableFactory FACTORY = new TaggedValuePointableFactory(); + + public byte getTag() { + return BytePointable.getByte(bytes, start); + } + + public void getValue(IPointable value) { + value.set(bytes, start + 1, length - 1); + } + + public static final class TaggedValuePointableFactory implements IPointableFactory { private static final long serialVersionUID = 1L; + private TaggedValuePointableFactory() { + } + @Override public ITypeTraits getTypeTraits() { return VoidPointable.TYPE_TRAITS; } @Override - public IPointable createPointable() { + public TaggedValuePointable createPointable() { return new TaggedValuePointable(); } - }; - - public byte getTag() { - return BytePointable.getByte(bytes, start); - } - public void getValue(IPointable value) { - value.set(bytes, start + 1, length - 1); } } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringLowercasePointable.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringLowercasePointable.java b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringLowercasePointable.java index 6e4810c..57d704f 100644 --- a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringLowercasePointable.java +++ b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringLowercasePointable.java @@ -27,6 +27,7 @@ import org.apache.hyracks.data.std.api.IPointableFactory; import org.apache.hyracks.util.string.UTF8StringUtil; public final class UTF8StringLowercasePointable extends AbstractPointable implements IHashable, IComparable { + public static final ITypeTraits TYPE_TRAITS = new ITypeTraits() { private static final long serialVersionUID = 1L; http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringLowercaseTokenPointable.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringLowercaseTokenPointable.java b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringLowercaseTokenPointable.java index 66c1ab9..01af13e 100644 --- a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringLowercaseTokenPointable.java +++ b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringLowercaseTokenPointable.java @@ -29,6 +29,7 @@ import org.apache.hyracks.util.string.UTF8StringUtil; * Instead, the length of this string is provided as a parameter. */ public final class UTF8StringLowercaseTokenPointable extends AbstractPointable implements IHashable, IComparable { + public static final ITypeTraits TYPE_TRAITS = new ITypeTraits() { private static final long serialVersionUID = 1L; http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ff3230e/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringPointable.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringPointable.java b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringPointable.java index 376307d..518e688 100644 --- a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringPointable.java +++ b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringPointable.java @@ -70,11 +70,16 @@ public final class UTF8StringPointable extends AbstractPointable implements IHas } }; - public static final IPointableFactory FACTORY = new IPointableFactory() { + public static final UTF8StringPointableFactory FACTORY = new UTF8StringPointableFactory(); + + public static class UTF8StringPointableFactory implements IPointableFactory { private static final long serialVersionUID = 1L; + private UTF8StringPointableFactory() { + } + @Override - public IPointable createPointable() { + public UTF8StringPointable createPointable() { return new UTF8StringPointable(); }