in asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatasetTupleTranslator.java [109:422]
protected Dataset createMetadataEntityFromARecord(ARecord datasetRecord) throws AlgebricksException {
ARecordType recType = datasetRecord.getType();
String dataverseCanonicalName =
((AString) datasetRecord.getValueByPos(datasetEntity.dataverseNameIndex())).getStringValue();
DataverseName dataverseName = DataverseName.createFromCanonicalForm(dataverseCanonicalName);
int databaseNameIndex = datasetEntity.databaseNameIndex();
String databaseName;
if (databaseNameIndex >= 0) {
databaseName = ((AString) datasetRecord.getValueByPos(databaseNameIndex)).getStringValue();
} else {
databaseName = MetadataUtil.databaseFor(dataverseName);
}
String datasetName = ((AString) datasetRecord.getValueByPos(datasetEntity.datasetNameIndex())).getStringValue();
String typeName = ((AString) datasetRecord.getValueByPos(datasetEntity.datatypeNameIndex())).getStringValue();
String typeDataverseCanonicalName =
((AString) datasetRecord.getValueByPos(datasetEntity.datatypeDataverseNameIndex())).getStringValue();
DataverseName typeDataverseName = DataverseName.createFromCanonicalForm(typeDataverseCanonicalName);
String itemTypeDatabaseName;
int typeDatabaseIdx = recType.getFieldIndex(MetadataRecordTypes.FIELD_NAME_DATATYPE_DATABASE_NAME);
if (typeDatabaseIdx >= 0) {
itemTypeDatabaseName = ((AString) datasetRecord.getValueByPos(typeDatabaseIdx)).getStringValue();
} else {
itemTypeDatabaseName = MetadataUtil.databaseFor(typeDataverseName);
}
DatasetType datasetType = DatasetType
.valueOf(((AString) datasetRecord.getValueByPos(datasetEntity.datasetTypeIndex())).getStringValue());
IDatasetDetails datasetDetails = null;
int datasetId = ((AInt32) datasetRecord.getValueByPos(datasetEntity.datasetIdIndex())).getIntegerValue();
int pendingOp = ((AInt32) datasetRecord.getValueByPos(datasetEntity.pendingOpIndex())).getIntegerValue();
String nodeGroupName = ((AString) datasetRecord.getValueByPos(datasetEntity.groupNameIndex())).getStringValue();
Pair<String, Map<String, String>> compactionPolicy = readCompactionPolicy(datasetType, datasetRecord);
switch (datasetType) {
case INTERNAL: {
ARecord datasetDetailsRecord =
(ARecord) datasetRecord.getValueByPos(datasetEntity.internalDetailsIndex());
FileStructure fileStructure = FileStructure.valueOf(((AString) datasetDetailsRecord
.getValueByPos(MetadataRecordTypes.INTERNAL_DETAILS_ARECORD_FILESTRUCTURE_FIELD_INDEX))
.getStringValue());
PartitioningStrategy partitioningStrategy = PartitioningStrategy.valueOf(((AString) datasetDetailsRecord
.getValueByPos(MetadataRecordTypes.INTERNAL_DETAILS_ARECORD_PARTITIONSTRATEGY_FIELD_INDEX))
.getStringValue());
IACursor cursor = ((AOrderedList) datasetDetailsRecord
.getValueByPos(MetadataRecordTypes.INTERNAL_DETAILS_ARECORD_PARTITIONKEY_FIELD_INDEX))
.getCursor();
List<List<String>> partitioningKey = new ArrayList<>();
while (cursor.next()) {
AOrderedList fieldNameList = (AOrderedList) cursor.get();
IACursor nestedFieldNameCursor = (fieldNameList.getCursor());
List<String> nestedFieldName = new ArrayList<>();
while (nestedFieldNameCursor.next()) {
nestedFieldName.add(((AString) nestedFieldNameCursor.get()).getStringValue());
}
partitioningKey.add(nestedFieldName);
}
// Check if there is a primary key types field
List<IAType> primaryKeyTypes = null;
int primaryKeyTypesPos = datasetDetailsRecord.getType()
.getFieldIndex(InternalDatasetDetails.PRIMARY_KEY_TYPES_FIELD_NAME);
if (primaryKeyTypesPos >= 0) {
cursor = ((AOrderedList) datasetDetailsRecord.getValueByPos(primaryKeyTypesPos)).getCursor();
primaryKeyTypes = new ArrayList<>();
while (cursor.next()) {
String primaryKeyTypeName = ((AString) cursor.get()).getStringValue();
IAType primaryKeyType = BuiltinTypeMap.getBuiltinType(primaryKeyTypeName);
primaryKeyTypes.add(primaryKeyType);
}
}
boolean autogenerated = ((ABoolean) datasetDetailsRecord
.getValueByPos(MetadataRecordTypes.INTERNAL_DETAILS_ARECORD_AUTOGENERATED_FIELD_INDEX))
.getBoolean();
// check if there is a filter source indicator
Integer filterSourceIndicator = null;
int filterSourceIndicatorPos = datasetDetailsRecord.getType()
.getFieldIndex(InternalDatasetDetails.FILTER_SOURCE_INDICATOR_FIELD_NAME);
if (filterSourceIndicatorPos >= 0) {
filterSourceIndicator =
(int) ((AInt8) datasetDetailsRecord.getValueByPos(filterSourceIndicatorPos)).getByteValue();
}
// Check if there is a filter field.
List<String> filterField = null;
int filterFieldPos =
datasetDetailsRecord.getType().getFieldIndex(InternalDatasetDetails.FILTER_FIELD_NAME);
if (filterFieldPos >= 0) {
// backward compatibility, if a dataset contains filter field but no filter source indicator
// we set the indicator to 0 by default.
if (filterSourceIndicator == null) {
filterSourceIndicator = 0;
}
filterField = new ArrayList<>();
cursor = ((AOrderedList) datasetDetailsRecord.getValueByPos(filterFieldPos)).getCursor();
while (cursor.next()) {
filterField.add(((AString) cursor.get()).getStringValue());
}
}
// Read a field-source-indicator field.
List<Integer> keyFieldSourceIndicator = new ArrayList<>();
int keyFieldSourceIndicatorIndex = datasetDetailsRecord.getType()
.getFieldIndex(InternalDatasetDetails.KEY_FILD_SOURCE_INDICATOR_FIELD_NAME);
if (keyFieldSourceIndicatorIndex >= 0) {
cursor = ((AOrderedList) datasetDetailsRecord.getValueByPos(keyFieldSourceIndicatorIndex))
.getCursor();
while (cursor.next()) {
keyFieldSourceIndicator.add((int) ((AInt8) cursor.get()).getByteValue());
}
} else {
for (int index = 0; index < partitioningKey.size(); ++index) {
keyFieldSourceIndicator.add(0);
}
}
boolean isDatasetWithoutTypeSpec = primaryKeyTypes != null && !primaryKeyTypes.isEmpty();
datasetDetails = new InternalDatasetDetails(fileStructure, partitioningStrategy, partitioningKey,
partitioningKey, keyFieldSourceIndicator, primaryKeyTypes, autogenerated, filterSourceIndicator,
filterField, isDatasetWithoutTypeSpec);
break;
}
case EXTERNAL: {
ARecord datasetDetailsRecord =
(ARecord) datasetRecord.getValueByPos(datasetEntity.externalDetailsIndex());
String adapter = ((AString) datasetDetailsRecord
.getValueByPos(MetadataRecordTypes.EXTERNAL_DETAILS_ARECORD_DATASOURCE_ADAPTER_FIELD_INDEX))
.getStringValue();
IACursor cursor = ((AOrderedList) datasetDetailsRecord
.getValueByPos(MetadataRecordTypes.EXTERNAL_DETAILS_ARECORD_PROPERTIES_FIELD_INDEX))
.getCursor();
Map<String, String> properties = new HashMap<>();
while (cursor.next()) {
ARecord field = (ARecord) cursor.get();
String key = ((AString) field.getValueByPos(MetadataRecordTypes.PROPERTIES_NAME_FIELD_INDEX))
.getStringValue();
String value = ((AString) field.getValueByPos(MetadataRecordTypes.PROPERTIES_VALUE_FIELD_INDEX))
.getStringValue();
properties.put(key, value);
}
// Timestamp
Date timestamp = new Date((((ADateTime) datasetDetailsRecord
.getValueByPos(MetadataRecordTypes.EXTERNAL_DETAILS_ARECORD_LAST_REFRESH_TIME_FIELD_INDEX)))
.getChrononTime());
// State
TransactionState state = TransactionState.values()[((AInt32) datasetDetailsRecord
.getValueByPos(MetadataRecordTypes.EXTERNAL_DETAILS_ARECORD_TRANSACTION_STATE_FIELD_INDEX))
.getIntegerValue()];
datasetDetails = new ExternalDatasetDetails(adapter, properties, timestamp, state);
break;
}
case VIEW: {
int datasetDetailsFieldPos = recType.getFieldIndex(MetadataRecordTypes.FIELD_NAME_VIEW_DETAILS);
ARecord datasetDetailsRecord = (ARecord) datasetRecord.getValueByPos(datasetDetailsFieldPos);
// Definition
int definitionFieldPos =
datasetDetailsRecord.getType().getFieldIndex(MetadataRecordTypes.FIELD_NAME_DEFINITION);
String definition = ((AString) datasetDetailsRecord.getValueByPos(definitionFieldPos)).getStringValue();
// Dependencies
List<List<DependencyFullyQualifiedName>> dependencies = Collections.emptyList();
int dependenciesFieldPos =
datasetDetailsRecord.getType().getFieldIndex(MetadataRecordTypes.FIELD_NAME_DEPENDENCIES);
if (dependenciesFieldPos >= 0) {
dependencies = new ArrayList<>();
IACursor dependenciesCursor =
((AOrderedList) datasetDetailsRecord.getValueByPos(dependenciesFieldPos)).getCursor();
while (dependenciesCursor.next()) {
List<DependencyFullyQualifiedName> dependencyList = new ArrayList<>();
IACursor qualifiedDependencyCursor = ((AOrderedList) dependenciesCursor.get()).getCursor();
while (qualifiedDependencyCursor.next()) {
DependencyFullyQualifiedName dependency =
getDependency((AOrderedList) qualifiedDependencyCursor.get());
dependencyList.add(dependency);
}
dependencies.add(dependencyList);
}
}
// Default Null
Boolean defaultNull = null;
int defaultFieldPos =
datasetDetailsRecord.getType().getFieldIndex(MetadataRecordTypes.FIELD_NAME_DEFAULT);
if (defaultFieldPos >= 0) {
IAObject defaultValue = datasetDetailsRecord.getValueByPos(defaultFieldPos);
defaultNull = defaultValue.getType().getTypeTag() == ATypeTag.NULL;
}
// Primary Key
List<String> primaryKeyFields = null;
int primaryKeyFieldPos =
datasetDetailsRecord.getType().getFieldIndex(MetadataRecordTypes.FIELD_NAME_PRIMARY_KEY);
if (primaryKeyFieldPos >= 0) {
AOrderedList primaryKeyFieldList =
((AOrderedList) datasetDetailsRecord.getValueByPos(primaryKeyFieldPos));
int n = primaryKeyFieldList.size();
primaryKeyFields = new ArrayList<>(n);
for (int i = 0; i < n; i++) {
AOrderedList list = (AOrderedList) primaryKeyFieldList.getItem(i);
if (list.size() != 1) {
throw new AsterixException(ErrorCode.METADATA_ERROR, list.toJSON());
}
AString str = (AString) list.getItem(0);
primaryKeyFields.add(str.getStringValue());
}
}
// Foreign Keys
List<ViewDetails.ForeignKey> foreignKeys = null;
int foreignKeysFieldPos =
datasetDetailsRecord.getType().getFieldIndex(MetadataRecordTypes.FIELD_NAME_FOREIGN_KEYS);
if (foreignKeysFieldPos >= 0) {
AOrderedList foreignKeyRecordsList =
((AOrderedList) datasetDetailsRecord.getValueByPos(foreignKeysFieldPos));
int nForeignKeys = foreignKeyRecordsList.size();
foreignKeys = new ArrayList<>(nForeignKeys);
for (int i = 0; i < nForeignKeys; i++) {
ARecord foreignKeyRecord = (ARecord) foreignKeyRecordsList.getItem(i);
// 'ForeignKey'
int foreignKeyFieldPos =
foreignKeyRecord.getType().getFieldIndex(MetadataRecordTypes.FIELD_NAME_FOREIGN_KEY);
AOrderedList foreignKeyFieldList =
((AOrderedList) foreignKeyRecord.getValueByPos(foreignKeyFieldPos));
int nForeignKeyFields = foreignKeyFieldList.size();
List<String> foreignKeyFields = new ArrayList<>(nForeignKeyFields);
for (int j = 0; j < nForeignKeyFields; j++) {
AOrderedList list = (AOrderedList) foreignKeyFieldList.getItem(j);
if (list.size() != 1) {
throw new AsterixException(ErrorCode.METADATA_ERROR, list.toJSON());
}
AString str = (AString) list.getItem(0);
foreignKeyFields.add(str.getStringValue());
}
// 'RefDataverseName'
int refDataverseNameFieldPos = foreignKeyRecord.getType()
.getFieldIndex(MetadataRecordTypes.FIELD_NAME_REF_DATAVERSE_NAME);
String refDataverseCanonicalName =
((AString) foreignKeyRecord.getValueByPos(refDataverseNameFieldPos)).getStringValue();
DataverseName refDataverseName =
DataverseName.createFromCanonicalForm(refDataverseCanonicalName);
// 'RefDatabaseName'
String refDatabase;
int refDatabaseNameFieldPos = foreignKeyRecord.getType()
.getFieldIndex(MetadataRecordTypes.FIELD_NAME_REF_DATABASE_NAME);
if (refDatabaseNameFieldPos >= 0) {
refDatabase = ((AString) foreignKeyRecord.getValueByPos(refDatabaseNameFieldPos))
.getStringValue();
} else {
refDatabase = MetadataUtil.databaseFor(refDataverseName);
}
// 'RefDatasetName'
int refDatasetNameFieldPos = foreignKeyRecord.getType()
.getFieldIndex(MetadataRecordTypes.FIELD_NAME_REF_DATASET_NAME);
String refDatasetName =
((AString) foreignKeyRecord.getValueByPos(refDatasetNameFieldPos)).getStringValue();
foreignKeys.add(new ViewDetails.ForeignKey(foreignKeyFields,
new DatasetFullyQualifiedName(refDatabase, refDataverseName, refDatasetName)));
}
}
// Format fields
Triple<String, String, String> dateTimeFormats = getDateTimeFormats(datasetDetailsRecord);
String datetimeFormat = dateTimeFormats.first;
String dateFormat = dateTimeFormats.second;
String timeFormat = dateTimeFormats.third;
datasetDetails = new ViewDetails(definition, dependencies, defaultNull, primaryKeyFields, foreignKeys,
datetimeFormat, dateFormat, timeFormat);
break;
}
}
Map<String, String> hints = getDatasetHints(datasetRecord);
String metaItemTypeDatabaseName = null;
DataverseName metaTypeDataverseName = null;
String metaTypeName = null;
int metaTypeDataverseNameIndex = recType.getFieldIndex(MetadataRecordTypes.FIELD_NAME_METATYPE_DATAVERSE_NAME);
if (metaTypeDataverseNameIndex >= 0) {
String metaTypeDataverseCanonicalName =
((AString) datasetRecord.getValueByPos(metaTypeDataverseNameIndex)).getStringValue();
metaTypeDataverseName = DataverseName.createFromCanonicalForm(metaTypeDataverseCanonicalName);
int metaTypeNameIndex = recType.getFieldIndex(MetadataRecordTypes.FIELD_NAME_METATYPE_NAME);
metaTypeName = ((AString) datasetRecord.getValueByPos(metaTypeNameIndex)).getStringValue();
int metaTypeDatabaseIdx = recType.getFieldIndex(MetadataRecordTypes.FIELD_NAME_METATYPE_DATABASE_NAME);
if (metaTypeDatabaseIdx >= 0) {
metaItemTypeDatabaseName =
((AString) datasetRecord.getValueByPos(metaTypeDatabaseIdx)).getStringValue();
} else {
metaItemTypeDatabaseName = MetadataUtil.databaseFor(metaTypeDataverseName);
}
}
long rebalanceCount = getRebalanceCount(datasetRecord);
String compressionScheme = getCompressionScheme(datasetRecord);
DatasetFormatInfo datasetFormatInfo = getDatasetFormatInfo(datasetRecord);
Creator creator = Creator.createOrDefault(datasetRecord);
return new Dataset(databaseName, dataverseName, datasetName, itemTypeDatabaseName, typeDataverseName, typeName,
metaItemTypeDatabaseName, metaTypeDataverseName, metaTypeName, nodeGroupName, compactionPolicy.first,
compactionPolicy.second, datasetDetails, hints, datasetType, datasetId, pendingOp, rebalanceCount,
compressionScheme, datasetFormatInfo, creator);
}