protected Dataset createMetadataEntityFromARecord()

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);
    }