2727import java .io .InputStream ;
2828import java .io .UncheckedIOException ;
2929import java .time .OffsetDateTime ;
30- import java .util .ArrayList ;
3130import java .util .Iterator ;
3231import java .util .List ;
3332import java .util .Map ;
3837import java .util .regex .Matcher ;
3938import java .util .regex .Pattern ;
4039import java .util .stream .Collectors ;
40+ import java .util .stream .IntStream ;
4141import java .util .stream .Stream ;
4242import javax .annotation .Nullable ;
4343import org .geotools .util .logging .Logging ;
@@ -193,15 +193,14 @@ public boolean delete(TileRange tileRange) throws StorageException {
193193 return false ;
194194 }
195195
196- List <BlobItem > blobsToDelete = findTileBlobsToDelete (tileRange , coordsPrefix );
196+ Stream <BlobItem > blobsToDelete = findTileBlobsToDelete (tileRange , coordsPrefix );
197197
198198 if (listeners .isEmpty ()) {
199199 // if there are no listeners, don't bother requesting every tile
200200 // metadata to notify the listeners
201- // split the iteration in parts to avoid memory accumulation
202- List <String > keysToDelete =
203- blobsToDelete .stream ().map (BlobItem ::getName ).collect (Collectors .toList ());
201+ List <String > keysToDelete = blobsToDelete .map (BlobItem ::getName ).collect (Collectors .toList ());
204202
203+ // split the iteration in parts to avoid memory accumulation
205204 Iterator <List <String >> partition = Iterators .partition (keysToDelete .iterator (), DeleteManager .PAGE_SIZE );
206205
207206 while (partition .hasNext () && !shutDown ) {
@@ -212,7 +211,7 @@ public boolean delete(TileRange tileRange) throws StorageException {
212211 // if we need to gather info, we'll end up just calling "delete" on each tile
213212 // this is run here instead of inside the delete manager as we need high level info
214213 // about tiles, e.g., TileObject, to inform the listeners
215- List <Callable <?>> tilesDeletions = blobsToDelete . stream ()
214+ List <Callable <?>> tilesDeletions = blobsToDelete
216215 .map (blobItem -> {
217216 TileObject tile = createTileObject (blobItem , tileRange );
218217 tile .setParametersId (tileRange .getParametersId ());
@@ -226,27 +225,24 @@ public boolean delete(TileRange tileRange) throws StorageException {
226225 return true ;
227226 }
228227
229- private List <BlobItem > findTileBlobsToDelete (TileRange tileRange , String coordsPrefix ) {
230-
231- List <BlobItem > blobsToDelete = new ArrayList <>();
232-
233- for (int zoom = tileRange .getZoomStart (); zoom <= tileRange .getZoomStop (); zoom ++) {
234-
235- String zoomPrefix = coordsPrefix + "/" + zoom ;
228+ private Stream <BlobItem > findTileBlobsToDelete (TileRange tileRange , String coordsPrefix ) {
229+ return IntStream .rangeClosed (tileRange .getZoomStart (), tileRange .getZoomStop ())
230+ .boxed ()
231+ .flatMap (zoom -> {
232+ String zoomPrefix = coordsPrefix + "/" + zoom ;
236233
237- if (!client .prefixExists (zoomPrefix )) {
238- // empty level, skipping
239- continue ;
240- }
241-
242- long [] rangeBoundsAtZoom = tileRange .rangeBounds (zoom );
234+ if (!client .prefixExists (zoomPrefix )) {
235+ // empty level, skipping
236+ return Stream .empty ();
237+ }
243238
244- client .listBlobs (zoomPrefix )
245- .filter (tb -> isTileBlobInBounds (tb , rangeBoundsAtZoom ))
246- .forEach (blobsToDelete ::add );
247- }
239+ long [] rangeBoundsAtZoom = tileRange .rangeBounds (zoom );
248240
249- return blobsToDelete ;
241+ return client .listBlobs (zoomPrefix )
242+ .filter (tb ->
243+ TILE_BLOB_NAME_REGEXP .matcher (tb .getName ()).find ())
244+ .filter (tb -> isTileBlobInBounds (tb , rangeBoundsAtZoom ));
245+ });
250246 }
251247
252248 private boolean isTileBlobInBounds (BlobItem tileBlob , long [] bounds ) {
0 commit comments