private List getMappingsToPurge()

in elastic-db-tools/src/main/java/com/microsoft/azure/elasticdb/shard/storeops/recovery/ReplaceMappingsLocalOperation.java [137:205]


    private List<StoreMapping> getMappingsToPurge(IStoreTransactionScope ts) {
        List<StoreMapping> lsmMappings;

        StoreResults result;

        if (rangesToRemove == null) {
            // If no ranges are specified, get all the mappings for the shard.
            result = ts.executeOperation(StoreOperationRequestBuilder.SP_GET_ALL_SHARD_MAPPINGS_LOCAL,
                    StoreOperationRequestBuilder.getAllShardMappingsLocal(shardMap, shard, null));

            if (result.getResult() != StoreResult.Success) {
                // Possible errors are:
                // StoreResult.ShardMapDoesNotExist
                // StoreResult.StoreVersionMismatch
                // StoreResult.MissingParametersForStoredProcedure
                throw StoreOperationErrorHandler.onRecoveryErrorLocal(result, shardMap, this.getLocation(), ShardManagementErrorCategory.Recovery,
                        this.getOperationName(), StoreOperationRequestBuilder.SP_GET_ALL_SHARD_MAPPINGS_LOCAL);
            }

            lsmMappings = result.getStoreMappings();
        }
        else {
            // If any ranges are specified, only delete intersected ranges.
            Map<ShardRange, StoreMapping> mappingsToPurge = new HashMap<>();

            for (ShardRange range : rangesToRemove) {
                switch (shardMap.getMapType()) {
                    case Range:
                        result = ts.executeOperation(StoreOperationRequestBuilder.SP_GET_ALL_SHARD_MAPPINGS_LOCAL,
                                StoreOperationRequestBuilder.getAllShardMappingsLocal(shardMap, shard, range));
                        break;

                    default:
                        assert shardMap.getMapType() == ShardMapType.List;
                        result = ts.executeOperation(StoreOperationRequestBuilder.SP_FIND_SHARD_MAPPING_BY_KEY_LOCAL, StoreOperationRequestBuilder
                                .findShardMappingByKeyLocal(shardMap, ShardKey.fromRawValue(shardMap.getKeyType(), range.getLow().getRawValue())));
                        break;
                }

                if (result.getResult() != StoreResult.Success) {
                    if (result.getResult() != StoreResult.MappingNotFoundForKey) {
                        // Possible errors are:
                        // StoreResult.ShardMapDoesNotExist
                        // StoreResult.StoreVersionMismatch
                        // StoreResult.MissingParametersForStoredProcedure
                        throw StoreOperationErrorHandler.onRecoveryErrorLocal(result, shardMap, this.getLocation(),
                                ShardManagementErrorCategory.Recovery, this.getOperationName(),
                                shardMap.getMapType() == ShardMapType.Range ? StoreOperationRequestBuilder.SP_GET_ALL_SHARD_MAPPINGS_LOCAL
                                        : StoreOperationRequestBuilder.SP_FIND_SHARD_MAPPING_BY_KEY_LOCAL);
                    }
                    else {
                        // No intersections being found is fine. Skip to the next mapping.
                        assert shardMap.getMapType() == ShardMapType.List;
                    }
                }
                else {
                    for (StoreMapping mapping : result.getStoreMappings()) {
                        ShardRange intersectedRange = new ShardRange(ShardKey.fromRawValue(shardMap.getKeyType(), mapping.getMinValue()),
                                ShardKey.fromRawValue(shardMap.getKeyType(), mapping.getMaxValue()));

                        mappingsToPurge.put(intersectedRange, mapping);
                    }
                }
            }
            lsmMappings = new ArrayList<>(mappingsToPurge.values());
        }

        return lsmMappings;
    }