diff --git a/src/main/java/org/tailormap/api/configuration/dev/PopulateTestData.java b/src/main/java/org/tailormap/api/configuration/dev/PopulateTestData.java index ce2460e769..fb88ac1b04 100644 --- a/src/main/java/org/tailormap/api/configuration/dev/PopulateTestData.java +++ b/src/main/java/org/tailormap/api/configuration/dev/PopulateTestData.java @@ -116,7 +116,7 @@ public class PopulateTestData { private final CatalogRepository catalogRepository; private final GeoServiceRepository geoServiceRepository; private final GeoServiceHelper geoServiceHelper; - + private final SolrService solrService; private final FeatureSourceRepository featureSourceRepository; private final ApplicationRepository applicationRepository; private final ConfigurationRepository configurationRepository; @@ -136,6 +136,7 @@ public PopulateTestData( ConfigurationRepository configurationRepository, FeatureSourceFactoryHelper featureSourceFactoryHelper, SearchIndexRepository searchIndexRepository, + SolrService solrService, UploadRepository uploadRepository) { this.appContext = appContext; this.userRepository = userRepository; @@ -148,6 +149,7 @@ public PopulateTestData( this.configurationRepository = configurationRepository; this.featureSourceFactoryHelper = featureSourceFactoryHelper; this.searchIndexRepository = searchIndexRepository; + this.solrService = solrService; this.uploadRepository = uploadRepository; } @@ -1348,19 +1350,7 @@ public void createSolrIndex() throws Exception { + (connectToSpatialDbsAtLocalhost ? "127.0.0.1" : "solr") + ":8983/solr/" + solrCoreName; - SolrHelper solrHelper = - new SolrHelper( - new ConcurrentUpdateHttp2SolrClient.Builder( - solrUrl, - new Http2SolrClient.Builder() - .useHttp1_1(true) - .withFollowRedirects(true) - .withConnectionTimeout(10000, TimeUnit.MILLISECONDS) - .withRequestTimeout(60000, TimeUnit.MILLISECONDS) - .build()) - .withQueueSize(SolrHelper.SOLR_BATCH_SIZE * 2) - .withThreadCount(10) - .build()); + SolrHelper solrHelper = new SolrHelper(this.solrService.getSolrClientForIndexing()); GeoService geoService = geoServiceRepository.findById("snapshot-geoserver").orElseThrow(); Application defaultApp = applicationRepository.findByName("default"); diff --git a/src/main/java/org/tailormap/api/repository/ApplicationRepository.java b/src/main/java/org/tailormap/api/repository/ApplicationRepository.java index 7fe9fc88eb..179e0b0a2a 100644 --- a/src/main/java/org/tailormap/api/repository/ApplicationRepository.java +++ b/src/main/java/org/tailormap/api/repository/ApplicationRepository.java @@ -5,8 +5,11 @@ */ package org.tailormap.api.repository; +import java.util.List; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.lang.NonNull; import org.springframework.security.access.prepost.PreAuthorize; import org.tailormap.api.persistence.Application; @@ -21,4 +24,18 @@ public interface ApplicationRepository extends JpaRepository @Override @NonNull Optional findById(@NonNull Long aLong); + + /** + * Find all applications that have a layer that is linked to a specific (Solr) index. + * + * @param indexId The index id to search for //TODO: This query is not working as expected. It + * should return all applications that have a layer that is linked to a specific (Solr) index. + */ + @NonNull + @PreAuthorize("permitAll()") + @Query( + value = + "select * from application app, lateral jsonb_path_query(gs.settings, ('$.layerSettings.**{1}.searchIndex.searchIndexId ? (@ == '||:indexId||')')::jsonpath)", + nativeQuery = true) + List findByIndexId(@Param("indexId") @NonNull Long indexId); } diff --git a/src/main/java/org/tailormap/api/repository/GeoServiceRepository.java b/src/main/java/org/tailormap/api/repository/GeoServiceRepository.java index 396ca76b9b..6a33806d02 100644 --- a/src/main/java/org/tailormap/api/repository/GeoServiceRepository.java +++ b/src/main/java/org/tailormap/api/repository/GeoServiceRepository.java @@ -52,17 +52,4 @@ public interface GeoServiceRepository extends JpaRepository @PreAuthorize("permitAll()") @Query("from GeoService s where id not in :ids") List getAllExcludingIds(@Param("ids") List ids); - - /** - * Find all geo-services that have a layer that is linked to a specific (Solr) index. - * - * @param indexId The index id to search for - */ - @NonNull - @PreAuthorize("permitAll()") - @Query( - value = - "select * from geo_service gs, lateral jsonb_path_query(gs.settings, ('$.layerSettings.**{1}.searchIndex.searchIndexId ? (@ == '||:indexId||')')::jsonpath)", - nativeQuery = true) - List findByIndexId(@Param("indexId") @NonNull Long indexId); } diff --git a/src/main/java/org/tailormap/api/repository/events/SolrTMFeatureTypeEventHandler.java b/src/main/java/org/tailormap/api/repository/events/SolrTMFeatureTypeEventHandler.java index 4ddac47bf3..ef8402d806 100644 --- a/src/main/java/org/tailormap/api/repository/events/SolrTMFeatureTypeEventHandler.java +++ b/src/main/java/org/tailormap/api/repository/events/SolrTMFeatureTypeEventHandler.java @@ -10,7 +10,8 @@ import nl.b3p.tailormap.api.geotools.featuresources.FeatureSourceFactoryHelper; import nl.b3p.tailormap.api.persistence.SearchIndex; import nl.b3p.tailormap.api.persistence.TMFeatureType; -import nl.b3p.tailormap.api.repository.GeoServiceRepository; +import nl.b3p.tailormap.api.persistence.json.AppLayerSettings; +import nl.b3p.tailormap.api.repository.ApplicationRepository; import nl.b3p.tailormap.api.repository.SearchIndexRepository; import nl.b3p.tailormap.api.solr.SolrHelper; import nl.b3p.tailormap.api.solr.SolrService; @@ -32,17 +33,17 @@ public class SolrTMFeatureTypeEventHandler { private final SearchIndexRepository searchIndexRepository; private final SolrService solrService; private final FeatureSourceFactoryHelper featureSourceFactoryHelper; - private final GeoServiceRepository geoServiceRepository; + private final ApplicationRepository applicationRepository; public SolrTMFeatureTypeEventHandler( SearchIndexRepository searchIndexRepository, SolrService solrService, FeatureSourceFactoryHelper featureSourceFactoryHelper, - GeoServiceRepository geoServiceRepository) { + ApplicationRepository applicationRepository) { this.searchIndexRepository = searchIndexRepository; this.solrService = solrService; this.featureSourceFactoryHelper = featureSourceFactoryHelper; - this.geoServiceRepository = geoServiceRepository; + this.applicationRepository = applicationRepository; } /** @@ -104,36 +105,26 @@ public void handleTMFeatureTypeDeleteForSolr(TMFeatureType tmFeatureType) { try (SolrHelper solrHelper = new SolrHelper(solrService.getSolrClientForIndexing())) { solrHelper.clearIndexForLayer(searchIndex.getId()); searchIndexRepository.delete(searchIndex); - // find layers that use this index in the layer settings and clear them - geoServiceRepository + // find any application layers that use this index clear the index from them + applicationRepository .findByIndexId(searchIndex.getId()) .forEach( - geoService -> - geoService - .getLayers() - .forEach( - layer -> { - logger.debug( - "Checking layer {} for search index {}", - layer.getName(), - searchIndex.getName()); - geoService - .findSearchIndexForLayer(layer, searchIndexRepository) - .ifPresent( - searchIndex1 -> { - if (searchIndex1 - .getId() - .equals(searchIndex.getId())) { - logger.debug( - "Clearing search index for layer {}", - layer.getName()); - geoService - .getLayerSettings(layer.getName()) - .setSearchIndex(null); - geoServiceRepository.save(geoService); - } - }); - })); + application -> { + application + .getAllAppTreeLayerNode() + .forEach( + appTreeLayerNode -> { + AppLayerSettings appLayerSettings = + application.getAppLayerSettings(appTreeLayerNode); + if (null != appLayerSettings.getSearchIndexId() + && appLayerSettings + .getSearchIndexId() + .equals(searchIndex.getId())) { + appLayerSettings.setSearchIndexId(null); + } + }); + applicationRepository.save(application); + }); } catch (UnsupportedOperationException | IOException | SolrServerException