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 75d2f2a8c4,
which was accidentally pushed to `release` branch.
This commit is contained in:
Shrikant Sharat Kandula 2024-02-29 12:17:57 +05:30 committed by GitHub
parent d831f289e5
commit e387aa2f4a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 20 additions and 19 deletions

View File

@ -6,18 +6,17 @@ import com.appsmith.server.repositories.BaseAppsmithRepositoryImpl;
import com.appsmith.server.repositories.CacheableRepositoryHelper; import com.appsmith.server.repositories.CacheableRepositoryHelper;
import org.springframework.data.mongodb.core.ReactiveMongoOperations; import org.springframework.data.mongodb.core.ReactiveMongoOperations;
import org.springframework.data.mongodb.core.convert.MongoConverter; 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.data.mongodb.core.query.Update;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono; 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 @Component
public class CustomDatasourceStorageStructureRepositoryCEImpl public class CustomDatasourceStorageStructureRepositoryCEImpl
extends BaseAppsmithRepositoryImpl<DatasourceStorageStructure> extends BaseAppsmithRepositoryImpl<DatasourceStorageStructure>
implements CustomDatasourceStorageStructureRepositoryCE { implements CustomDatasourceStorageStructureRepositoryCE {
public CustomDatasourceStorageStructureRepositoryCEImpl( public CustomDatasourceStorageStructureRepositoryCEImpl(
ReactiveMongoOperations mongoOperations, ReactiveMongoOperations mongoOperations,
MongoConverter mongoConverter, MongoConverter mongoConverter,
@ -25,20 +24,11 @@ public class CustomDatasourceStorageStructureRepositoryCEImpl
super(mongoOperations, mongoConverter, cacheableRepositoryHelper); 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 @Override
public Mono<Integer> updateStructure(String datasourceId, String environmentId, DatasourceStructure structure) { public Mono<Integer> updateStructure(String datasourceId, String environmentId, DatasourceStructure structure) {
return mongoOperations return queryBuilder()
.upsert( .criteria(bridge().equal(DatasourceStorageStructure.Fields.datasourceId, datasourceId)
new Query().addCriteria(getDatasourceIdAndEnvironmentIdCriteria(datasourceId, environmentId)), .equal(DatasourceStorageStructure.Fields.environmentId, environmentId))
Update.update(DatasourceStorageStructure.Fields.structure, structure), .updateFirst(Update.update(DatasourceStorageStructure.Fields.structure, structure));
DatasourceStorageStructure.class)
.map(updateResult -> Math.toIntExact(updateResult.getModifiedCount()));
} }
} }

View File

@ -10,5 +10,5 @@ public interface DatasourceStructureServiceCE {
Mono<DatasourceStorageStructure> save(DatasourceStorageStructure datasourceStorageStructure); Mono<DatasourceStorageStructure> save(DatasourceStorageStructure datasourceStorageStructure);
Mono<Integer> saveStructure(String datasourceId, String environmentId, DatasourceStructure structure); Mono<Void> saveStructure(String datasourceId, String environmentId, DatasourceStructure structure);
} }

View File

@ -25,7 +25,18 @@ public class DatasourceStructureServiceCEImpl implements DatasourceStructureServ
} }
@Override @Override
public Mono<Integer> saveStructure(String datasourceId, String environmentId, DatasourceStructure structure) { public Mono<Void> saveStructure(String datasourceId, String environmentId, DatasourceStructure structure) {
return repository.updateStructure(datasourceId, environmentId, 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();
});
} }
} }