Skip to content

Commit 5a1d4da

Browse files
committed
Fix state request for multiple applications in same repo
1 parent 5e26f73 commit 5a1d4da

4 files changed

Lines changed: 92 additions & 8 deletions

File tree

‎src/main/java/net/explorviz/persistence/grpc/StateDataServiceImpl.java‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import io.smallrye.common.annotation.Blocking;
55
import io.smallrye.mutiny.Uni;
66
import jakarta.inject.Inject;
7+
import java.util.ArrayList;
78
import java.util.List;
89
import java.util.Objects;
910
import net.explorviz.persistence.ogm.Application;
@@ -59,7 +60,8 @@ public Uni<StateData> getStateData(final StateDataRequest request) {
5960
session,
6061
request.getRepositoryName(),
6162
request.getLandscapeToken(),
62-
request.getBranchName())
63+
request.getBranchName(),
64+
new ArrayList<>(request.getApplicationPathsMap().keySet()))
6365
.map(Commit::getHash)
6466
.orElse("");
6567
stateDataBuilder.setCommitId(commitId);

‎src/main/java/net/explorviz/persistence/repository/CommitRepository.java‎

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,22 @@ public class CommitRepository {
2222
* every file included in the commit.
2323
*/
2424
public Optional<Commit> findLatestFullyPersistedCommit(
25-
final Session session, final String repoName, final String tokenId, final String branchName) {
25+
final Session session,
26+
final String repoName,
27+
final String tokenId,
28+
final String branchName,
29+
final List<String> applicationNames) {
2630
return Optional.ofNullable(
2731
session.queryForObject(
2832
Commit.class,
2933
"""
30-
MATCH (:Landscape {tokenId: $tokenId})
31-
-[:CONTAINS]->(:Repository {name: $repoName})
32-
-[:CONTAINS]->(c:Commit)
33-
-[:BELONGS_TO]->(:Branch {name: $branchName})
34+
MATCH (l:Landscape {tokenId: $tokenId})
35+
MATCH (repo:Repository {name: $repoName})<-[:CONTAINS]-(l)
36+
MATCH (repo)-[:CONTAINS]->(c:Commit)-[:BELONGS_TO]->(:Branch {name: $branchName})
37+
WHERE all(appName IN $applicationNames WHERE EXISTS {
38+
MATCH (l)-[:CONTAINS]->(a:Application {name: appName})-[:HAS_ROOT]->(root:Directory)
39+
MATCH (root)-[:CONTAINS*1..]->(f:FileRevision)<-[:CONTAINS]-(c)
40+
})
3441
WITH c, [(c)-[:CONTAINS]->(f:FileRevision) | f] AS filesInCommit
3542
WHERE
3643
all(file IN filesInCommit WHERE file.hasFileData) AND
@@ -39,7 +46,15 @@ NOT isEmpty(filesInCommit)
3946
ORDER BY c.commitDate DESC
4047
LIMIT 1;
4148
""",
42-
Map.of("tokenId", tokenId, "repoName", repoName, "branchName", branchName)));
49+
Map.of(
50+
"tokenId",
51+
tokenId,
52+
"repoName",
53+
repoName,
54+
"branchName",
55+
branchName,
56+
"applicationNames",
57+
applicationNames)));
4358
}
4459

4560
public Optional<Commit> findCommitByHashAndLandscapeToken(

‎src/test/java/net/explorviz/persistence/CommitRepositoryTest.java‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import io.quarkus.test.junit.QuarkusTest;
77
import jakarta.inject.Inject;
88
import java.time.Instant;
9+
import java.util.List;
910
import java.util.Optional;
1011
import net.explorviz.persistence.ogm.Branch;
1112
import net.explorviz.persistence.ogm.Commit;
@@ -77,7 +78,8 @@ void testFindLatestCommit() {
7778
session.save(landscape);
7879

7980
Optional<Commit> latestCommit =
80-
commitRepository.findLatestFullyPersistedCommit(session, "myrepo", "mytokenvalue", "main");
81+
commitRepository.findLatestFullyPersistedCommit(
82+
session, "myrepo", "mytokenvalue", "main", List.of());
8183

8284
assertTrue(latestCommit.isPresent());
8385
assertEquals("commit2", latestCommit.get().getHash());

‎src/test/java/net/explorviz/persistence/StateDataServiceTest.java‎

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,4 +437,69 @@ void testGetStateDataForTwoDifferentReposInOneLandscape() {
437437
.directories(2)
438438
.build());
439439
}
440+
441+
@Test
442+
void testGetStateDataForNewApplicationInExistingRepo() {
443+
String appNameOne = "app1";
444+
String appNameTwo = "app2";
445+
String commitHash = "commit1";
446+
447+
// 1. Setup app1 and a commit with a file
448+
StateDataRequest prepRequest =
449+
StateDataRequest.newBuilder()
450+
.setLandscapeToken(landscapeToken)
451+
.setRepositoryName(repoName)
452+
.setBranchName(branchName)
453+
.putAllApplicationPaths(Map.of(appNameOne, "app1"))
454+
.build();
455+
stateDataService
456+
.getStateData(prepRequest)
457+
.await()
458+
.atMost(Duration.ofSeconds(GRPC_AWAIT_SECONDS));
459+
460+
CommitData commitData =
461+
CommitData.newBuilder()
462+
.setCommitId(commitHash)
463+
.setRepositoryName(repoName)
464+
.setBranchName(branchName)
465+
.setLandscapeToken(landscapeToken)
466+
.setAuthorDate(Timestamp.newBuilder().setSeconds(1).build())
467+
.setCommitDate(Timestamp.newBuilder().setSeconds(1).build())
468+
.build();
469+
commitService.persistCommit(commitData).await().atMost(Duration.ofSeconds(GRPC_AWAIT_SECONDS));
470+
471+
FileData fileData =
472+
FileData.newBuilder()
473+
.setLandscapeToken(landscapeToken)
474+
.setRepositoryName(repoName)
475+
.setCommitId(commitHash)
476+
.setFileHash("hash1")
477+
.setFilePath("app1/File1.java")
478+
.setLanguage(Language.JAVA)
479+
.build();
480+
fileDataService.persistFile(fileData).await().atMost(Duration.ofSeconds(GRPC_AWAIT_SECONDS));
481+
482+
// 2. Request state for app1 - should return commit1
483+
StateData state1 =
484+
stateDataService
485+
.getStateData(prepRequest)
486+
.await()
487+
.atMost(Duration.ofSeconds(GRPC_AWAIT_SECONDS));
488+
assertEquals(commitHash, state1.getCommitId());
489+
490+
// 3. Request state for app1 AND app2 - should return ""
491+
StateDataRequest bothRequest =
492+
StateDataRequest.newBuilder()
493+
.setLandscapeToken(landscapeToken)
494+
.setRepositoryName(repoName)
495+
.setBranchName(branchName)
496+
.putAllApplicationPaths(Map.of(appNameOne, "app1", appNameTwo, "app2"))
497+
.build();
498+
StateData stateBoth =
499+
stateDataService
500+
.getStateData(bothRequest)
501+
.await()
502+
.atMost(Duration.ofSeconds(GRPC_AWAIT_SECONDS));
503+
assertEquals("", stateBoth.getCommitId());
504+
}
440505
}

0 commit comments

Comments
 (0)