public void saveMetadata()

in metacat-metadata-mysql/src/main/java/com/netflix/metacat/metadata/mysql/MysqlUserMetadataService.java [668:787]


    public void saveMetadata(final String user, final List<? extends HasMetadata> metadatas, final boolean merge) {
        try {
            @SuppressWarnings("unchecked") final List<List<HasMetadata>> subLists = Lists.partition(
                (List<HasMetadata>) metadatas,
                config.getUserMetadataMaxInClauseItems()
            );
            for (List<HasMetadata> hasMetadatas : subLists) {
                final List<String> uris = Lists.newArrayList();
                final List<QualifiedName> names = Lists.newArrayList();
                // Get the names and uris
                final List<HasDefinitionMetadata> definitionMetadatas = Lists.newArrayList();
                final List<HasDataMetadata> dataMetadatas = Lists.newArrayList();
                hasMetadatas.forEach(hasMetadata -> {
                    if (hasMetadata instanceof HasDefinitionMetadata) {
                        final HasDefinitionMetadata oDef = (HasDefinitionMetadata) hasMetadata;
                        names.add(oDef.getDefinitionName());
                        if (oDef.getDefinitionMetadata() != null) {
                            definitionMetadatas.add(oDef);
                        }
                    }
                    if (hasMetadata instanceof HasDataMetadata) {
                        final HasDataMetadata oData = (HasDataMetadata) hasMetadata;
                        if (oData.isDataExternal() && oData.getDataMetadata() != null
                            && oData.getDataMetadata().size() > 0) {
                            uris.add(oData.getDataUri());
                            dataMetadatas.add(oData);
                        }
                    }
                });
                if (!definitionMetadatas.isEmpty() || !dataMetadatas.isEmpty()) {
                    // Get the existing metadata based on the names and uris
                    final Map<String, ObjectNode> definitionMap = getDefinitionMetadataMap(names);
                    final Map<String, ObjectNode> dataMap = getDataMetadataMap(uris);
                    // Curate the list of existing and new metadatas
                    final List<Object[]> insertDefinitionMetadatas = Lists.newArrayList();
                    final List<Object[]> updateDefinitionMetadatas = Lists.newArrayList();
                    final List<Object[]> insertPartitionDefinitionMetadatas = Lists.newArrayList();
                    final List<Object[]> updatePartitionDefinitionMetadatas = Lists.newArrayList();
                    final List<Object[]> insertDataMetadatas = Lists.newArrayList();
                    final List<Object[]> updateDataMetadatas = Lists.newArrayList();
                    definitionMetadatas.forEach(oDef -> {
                        final QualifiedName qualifiedName = oDef.getDefinitionName();
                        if (qualifiedName != null && oDef.getDefinitionMetadata() != null
                            && oDef.getDefinitionMetadata().size() != 0) {
                            final String name = qualifiedName.toString();
                            final ObjectNode oNode = definitionMap.get(name);
                            if (oNode == null) {
                                final Object[] o = new Object[]{
                                    metacatJson.toJsonString(oDef.getDefinitionMetadata()), user, user, name, };
                                if (qualifiedName.isPartitionDefinition()) {
                                    insertPartitionDefinitionMetadatas.add(o);
                                } else {
                                    insertDefinitionMetadatas.add(o);
                                }
                            } else {
                                metacatJson.mergeIntoPrimary(oNode, oDef.getDefinitionMetadata());
                                final Object[] o = new Object[]{metacatJson.toJsonString(oNode), user, name};
                                if (qualifiedName.isPartitionDefinition()) {
                                    updatePartitionDefinitionMetadatas.add(o);
                                } else {
                                    updateDefinitionMetadatas.add(o);
                                }
                            }
                        }
                    });
                    dataMetadatas.forEach(oData -> {
                        final String uri = oData.getDataUri();
                        final ObjectNode oNode = dataMap.get(uri);
                        if (oData.getDataMetadata() != null && oData.getDataMetadata().size() != 0) {
                            if (oNode == null) {
                                insertDataMetadatas.add(
                                    new Object[]{
                                        metacatJson.toJsonString(oData.getDataMetadata()),
                                        user,
                                        user,
                                        uri,
                                    }
                                );
                            } else {
                                metacatJson.mergeIntoPrimary(oNode, oData.getDataMetadata());
                                updateDataMetadatas
                                    .add(new Object[]{metacatJson.toJsonString(oNode), user, uri});
                            }
                        }
                    });
                    if (!insertDefinitionMetadatas.isEmpty()) {
                        jdbcTemplate.batchUpdate(SQL.INSERT_DEFINITION_METADATA, insertDefinitionMetadatas,
                            new int[]{Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR});
                    }
                    if (!updateDefinitionMetadatas.isEmpty()) {
                        jdbcTemplate.batchUpdate(SQL.UPDATE_DEFINITION_METADATA, updateDefinitionMetadatas,
                            new int[]{Types.VARCHAR, Types.VARCHAR, Types.VARCHAR});
                    }
                    if (!insertPartitionDefinitionMetadatas.isEmpty()) {
                        throwIfPartitionDefinitionMetadataDisabled();
                        jdbcTemplate.batchUpdate(SQL.INSERT_PARTITION_DEFINITION_METADATA,
                            insertPartitionDefinitionMetadatas,
                            new int[]{Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR});
                    }
                    if (!updatePartitionDefinitionMetadatas.isEmpty()) {
                        throwIfPartitionDefinitionMetadataDisabled();
                        jdbcTemplate.batchUpdate(SQL.UPDATE_PARTITION_DEFINITION_METADATA,
                            updatePartitionDefinitionMetadatas,
                            new int[]{Types.VARCHAR, Types.VARCHAR, Types.VARCHAR});
                    }
                    if (!insertDataMetadatas.isEmpty()) {
                        jdbcTemplate.batchUpdate(SQL.INSERT_DATA_METADATA, insertDataMetadatas,
                            new int[]{Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR});
                    }
                    if (!updateDataMetadatas.isEmpty()) {
                        jdbcTemplate.batchUpdate(SQL.UPDATE_DATA_METADATA, updateDataMetadatas,
                            new int[]{Types.VARCHAR, Types.VARCHAR, Types.VARCHAR});
                    }
                }
            }
        } catch (Exception e) {
            log.error("Failed to save metadata", e);
            throw new UserMetadataServiceException("Failed to save metadata", e);
        }
    }