public PartitionsSaveResponse savePartitions()

in metacat-connector-hive/src/main/java/com/netflix/metacat/connector/hive/HiveConnectorPartitionService.java [251:364]


    public PartitionsSaveResponse savePartitions(
        final ConnectorRequestContext requestContext,
        final QualifiedName tableQName,
        final PartitionsSaveRequest partitionsSaveRequest
    ) {
        final String databaseName = tableQName.getDatabaseName();
        final String tableName = tableQName.getTableName();
        final Table table;
        try {
            table = metacatHiveClient.getTableByName(databaseName, tableName);
        } catch (NoSuchObjectException exception) {
            throw new TableNotFoundException(tableQName, exception);
        } catch (TException e) {
            throw new ConnectorException(String.format("Failed getting hive table %s", tableQName), e);
        }
        // New partitions
        final List<PartitionInfo> addedPartitionInfos = Lists.newArrayList();
        final List<PartitionInfo> partitionInfos = partitionsSaveRequest.getPartitions();
        final List<String> partitionNames = partitionInfos.stream()
            .map(part -> {
                final String partitionName = part.getName().getPartitionName();
                PartitionUtil.validatePartitionName(partitionName, getPartitionKeys(table.getPartitionKeys()));
                return partitionName;
            }).collect(Collectors.toList());

        // New partition names
        final List<String> addedPartitionNames = Lists.newArrayList();
        // Updated partition names
        final List<String> existingPartitionNames = Lists.newArrayList();
        // Existing partitions
        final List<PartitionHolder> existingPartitionHolders = Lists.newArrayList();

        // Existing partition map
        Map<String, PartitionHolder> existingPartitionMap = Collections.emptyMap();

        //
        // If either checkIfExists or alterIfExists is true, check to see if any of the partitions already exists.
        // If it exists and if alterIfExists=false, we will drop it before adding.
        // If it exists and if alterIfExists=true, we will alter it.
        //
        if (partitionsSaveRequest.getCheckIfExists() || partitionsSaveRequest.getAlterIfExists()) {
            existingPartitionMap = getPartitionsByNames(table, partitionNames);
        }

        for (PartitionInfo partitionInfo : partitionInfos) {
            final String partitionName = partitionInfo.getName().getPartitionName();
            final PartitionHolder existingPartitionHolder = existingPartitionMap.get(partitionName);
            if (existingPartitionHolder == null) {
                addedPartitionNames.add(partitionName);
                addedPartitionInfos.add(partitionInfo);
            } else {
                final String partitionUri =
                    partitionInfo.getSerde() != null ? partitionInfo.getSerde().getUri() : null;
                final String existingPartitionUri = getPartitionUri(existingPartitionHolder);
                if (partitionUri == null || !partitionUri.equals(existingPartitionUri)) {
                    existingPartitionNames.add(partitionName);
                    // We need to copy the existing partition info and
                    if (partitionInfo.getSerde() == null) {
                        partitionInfo.setSerde(new StorageInfo());
                    }
                    if (partitionInfo.getAudit() == null) {
                        partitionInfo.setAudit(new AuditInfo());
                    }
                    if (StringUtils.isBlank(partitionUri)) {
                        partitionInfo.getSerde().setUri(existingPartitionUri);
                    }
                    //the partition exists, we should not do anything for the partition exists
                    //unless we alterifExists
                    if (partitionsSaveRequest.getAlterIfExists()) {
                        if (existingPartitionHolder.getPartition() != null) {
                            final Partition existingPartition = existingPartitionHolder.getPartition();
                            partitionInfo.getSerde().setParameters(existingPartition.getParameters());
                            partitionInfo.getAudit().setCreatedDate(
                                HiveConnectorInfoConverter.epochSecondsToDate(existingPartition.getCreateTime()));
                            partitionInfo.getAudit().setLastModifiedDate(
                                HiveConnectorInfoConverter.epochSecondsToDate(existingPartition.getLastAccessTime()));
                        } else {
                            final PartitionInfo existingPartitionInfo = existingPartitionHolder.getPartitionInfo();
                            if (existingPartitionInfo.getSerde() != null) {
                                partitionInfo.getSerde()
                                    .setParameters(existingPartitionInfo.getSerde().getParameters());
                            }
                            if (existingPartitionInfo.getAudit() != null) {
                                partitionInfo.getAudit()
                                    .setCreatedDate(existingPartitionInfo.getAudit().getCreatedDate());
                                partitionInfo.getAudit()
                                    .setLastModifiedDate(existingPartitionInfo.getAudit().getLastModifiedDate());
                            }
                        }
                        existingPartitionHolder.setPartitionInfo(partitionInfo);
                        existingPartitionHolders.add(existingPartitionHolder);
                    } else {
                        addedPartitionInfos.add(partitionInfo);
                    }
                }
            }
        }

        final Set<String> deletePartitionNames = Sets.newHashSet();
        if (!partitionsSaveRequest.getAlterIfExists()) {
            deletePartitionNames.addAll(existingPartitionNames);
        }
        if (partitionsSaveRequest.getPartitionIdsForDeletes() != null) {
            deletePartitionNames.addAll(partitionsSaveRequest.getPartitionIdsForDeletes());
        }

        addUpdateDropPartitions(tableQName, table, partitionNames, addedPartitionInfos, existingPartitionHolders,
            deletePartitionNames);

        final PartitionsSaveResponse result = new PartitionsSaveResponse();
        result.setAdded(addedPartitionNames);
        result.setUpdated(existingPartitionNames);
        return result;
    }