Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[backend] Improve latency on atomicTestings #1733

Merged
merged 10 commits into from
Oct 29, 2024
Prev Previous commit
Next Next commit
[backend] Add subqueries for atomicTestings
  • Loading branch information
savacano28 committed Oct 29, 2024
commit 07a5af3f83fefb83d6b3f51f17f27f98e91e8f2d
Original file line number Diff line number Diff line change
Expand Up @@ -399,14 +399,10 @@ public Page<AtomicTestingOutput> atomicTestings(
return new PageImpl<>(injects, pageable, total);
}

private void selectForAtomicTesting(
CriteriaBuilder cb, CriteriaQuery<Tuple> cq, Root<Inject> injectRoot) {
// Joins
Join<Inject, InjectorContract> injectorContractJoin =
createLeftJoin(injectRoot, "injectorContract");
Join<InjectorContract, Injector> injectorJoin =
injectorContractJoin.join("injector", JoinType.LEFT);
//Join<Inject, InjectStatus> injectStatusJoin = createLeftJoin(injectRoot, "status");
private void selectForAtomicTesting(CriteriaBuilder cb, CriteriaQuery<Tuple> cq, Root<Inject> injectRoot) {
// Joins
Join<Inject, InjectorContract> injectorContractJoin = createLeftJoin(injectRoot, "injectorContract");
Join<InjectorContract, Injector> injectorJoin = injectorContractJoin.join("injector", JoinType.LEFT);

// Subquery for InjectStatus
Subquery<Tuple> statusSubquery = cq.subquery(Tuple.class);
Expand All @@ -422,21 +418,19 @@ private void selectForAtomicTesting(
)
.where(cb.equal(dateRoot.get("inject").get("id"), injectRoot.get("id")));


// Array aggregations
Expression<String[]> injectExpectationIdsExpression = createJoinArrayAggOnId(cb, injectRoot, EXPECTATIONS);
Expression<String[]> teamIdsExpression = createJoinArrayAggOnId(cb, injectRoot, "teams");
Expression<String[]> assetIdsExpression = createJoinArrayAggOnId(cb, injectRoot, "assets");
Expression<String[]> assetGroupIdsExpression = createJoinArrayAggOnId(cb, injectRoot, "assetGroups");

// SELECT
cq.multiselect(
injectRoot.get("id").alias("inject_id"),
injectRoot.get("title").alias("inject_title"),
injectRoot.get("updatedAt").alias("inject_updated_at"),
injectorJoin.get("type").alias("inject_type"),
injectorContractJoin.alias("inject_injector_contract"),
//injectStatusJoin.alias("inject_status"),
// SELECT
cq.multiselect(
injectRoot.get("id").alias("inject_id"),
injectRoot.get("title").alias("inject_title"),
injectRoot.get("updatedAt").alias("inject_updated_at"),
injectorJoin.get("type").alias("inject_type"),
injectorContractJoin.alias("inject_injector_contract"),
cb.selectCase()
.when(cb.exists(statusSubquery), statusSubquery.select(statusRoot.get("name")))
.otherwise(cb.nullLiteral(ExecutionStatus.class)).alias("inject_status"),
Expand All @@ -459,12 +453,7 @@ private void selectForAtomicTesting(
}

private List<AtomicTestingOutput> execAtomicTesting(TypedQuery<Tuple> query) {
long start = System.currentTimeMillis();
List<Tuple> resultList = query.getResultList();
long executionTime = System.currentTimeMillis() - start;
logger.info("Execution time of execution query true + raw query: " + executionTime + " ms");

return resultList
return query.getResultList()
.stream()
.map(tuple -> {
InjectStatus injectStatus = new InjectStatus();
Expand Down