From e387aa2f4ab5e60afc602cfeb4601bfc8e797728 Mon Sep 17 00:00:00 2001 From: Shrikant Sharat Kandula Date: Thu, 29 Feb 2024 12:17:57 +0530 Subject: [PATCH] chore: No upsert when saving datasource structure (#31320) Instead of `upsert`, we `update` first, which is arguably the most used operation in this context, and if that fails, then we attempt an insert. We're not expecting a performance hit, since most operations here would be an actual `update` only. cherry picked from commit 75d2f2a8c455cd900aff83b5f1ac5b76ae72cce3, which was accidentally pushed to `release` branch. --- ...ourceStorageStructureRepositoryCEImpl.java | 22 +++++-------------- .../ce/DatasourceStructureServiceCE.java | 2 +- .../ce/DatasourceStructureServiceCEImpl.java | 15 +++++++++++-- 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CustomDatasourceStorageStructureRepositoryCEImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CustomDatasourceStorageStructureRepositoryCEImpl.java index 30d388e673..06163a9b94 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CustomDatasourceStorageStructureRepositoryCEImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CustomDatasourceStorageStructureRepositoryCEImpl.java @@ -6,18 +6,17 @@ import com.appsmith.server.repositories.BaseAppsmithRepositoryImpl; import com.appsmith.server.repositories.CacheableRepositoryHelper; import org.springframework.data.mongodb.core.ReactiveMongoOperations; import org.springframework.data.mongodb.core.convert.MongoConverter; -import org.springframework.data.mongodb.core.query.Criteria; -import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import org.springframework.stereotype.Component; import reactor.core.publisher.Mono; -import static org.springframework.data.mongodb.core.query.Criteria.where; +import static com.appsmith.server.helpers.ce.bridge.Bridge.bridge; @Component public class CustomDatasourceStorageStructureRepositoryCEImpl extends BaseAppsmithRepositoryImpl implements CustomDatasourceStorageStructureRepositoryCE { + public CustomDatasourceStorageStructureRepositoryCEImpl( ReactiveMongoOperations mongoOperations, MongoConverter mongoConverter, @@ -25,20 +24,11 @@ public class CustomDatasourceStorageStructureRepositoryCEImpl super(mongoOperations, mongoConverter, cacheableRepositoryHelper); } - public static Criteria getDatasourceIdAndEnvironmentIdCriteria(String datasourceId, String environmentId) { - return new Criteria() - .andOperator( - where(DatasourceStorageStructure.Fields.datasourceId).is(datasourceId), - where(DatasourceStorageStructure.Fields.environmentId).is(environmentId)); - } - @Override public Mono updateStructure(String datasourceId, String environmentId, DatasourceStructure structure) { - return mongoOperations - .upsert( - new Query().addCriteria(getDatasourceIdAndEnvironmentIdCriteria(datasourceId, environmentId)), - Update.update(DatasourceStorageStructure.Fields.structure, structure), - DatasourceStorageStructure.class) - .map(updateResult -> Math.toIntExact(updateResult.getModifiedCount())); + return queryBuilder() + .criteria(bridge().equal(DatasourceStorageStructure.Fields.datasourceId, datasourceId) + .equal(DatasourceStorageStructure.Fields.environmentId, environmentId)) + .updateFirst(Update.update(DatasourceStorageStructure.Fields.structure, structure)); } } diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/DatasourceStructureServiceCE.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/DatasourceStructureServiceCE.java index 62def45a09..d54ccc0a4e 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/DatasourceStructureServiceCE.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/DatasourceStructureServiceCE.java @@ -10,5 +10,5 @@ public interface DatasourceStructureServiceCE { Mono save(DatasourceStorageStructure datasourceStorageStructure); - Mono saveStructure(String datasourceId, String environmentId, DatasourceStructure structure); + Mono saveStructure(String datasourceId, String environmentId, DatasourceStructure structure); } diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/DatasourceStructureServiceCEImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/DatasourceStructureServiceCEImpl.java index 7862fc3c35..2f7bc600b6 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/DatasourceStructureServiceCEImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/DatasourceStructureServiceCEImpl.java @@ -25,7 +25,18 @@ public class DatasourceStructureServiceCEImpl implements DatasourceStructureServ } @Override - public Mono saveStructure(String datasourceId, String environmentId, DatasourceStructure structure) { - return repository.updateStructure(datasourceId, environmentId, structure); + public Mono saveStructure(String datasourceId, String environmentId, DatasourceStructure structure) { + return repository + .updateStructure(datasourceId, environmentId, structure) + .flatMap(count -> { + if (count == 0) { + DatasourceStorageStructure dss = new DatasourceStorageStructure(); + dss.setDatasourceId(datasourceId); + dss.setEnvironmentId(environmentId); + dss.setStructure(structure); + return repository.save(dss).then(); + } + return Mono.empty(); + }); } }