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:
parent
d831f289e5
commit
e387aa2f4a
|
|
@ -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()));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user