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 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<DatasourceStorageStructure>
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<Integer> 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));
}
}

View File

@ -10,5 +10,5 @@ public interface DatasourceStructureServiceCE {
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
public Mono<Integer> saveStructure(String datasourceId, String environmentId, DatasourceStructure structure) {
return repository.updateStructure(datasourceId, environmentId, structure);
public Mono<Void> 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();
});
}
}