Skip to content

Commit f3d7117

Browse files
committed
Refactors discovery and search flow
Introduces a new `DiscoveryService` to centralize the logic for processing search results and building explorer visualizations. This decouples the `DiscoveryController` from direct interaction with the `SearchService`. Simplifies the `DiscoveryController` by delegating visualization building to the `DiscoveryService`. Renames the core search method in `SearchService` to `searchTinkarData` for clearer intent. Enhances the `IkeRepository` with overloaded methods to support entity lookups using `List` identifiers, improving flexibility for composite or multi-part IDs.
1 parent d9f92e9 commit f3d7117

4 files changed

Lines changed: 142 additions & 9 deletions

File tree

src/main/java/dev/ikm/server/cosmos/discovery/DiscoveryController.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,12 @@ public class DiscoveryController {
2323
Logger LOG = LoggerFactory.getLogger(DiscoveryController.class);
2424

2525
private final DiscoveryService discoveryService;
26-
private final SearchService searchService;
2726
private final CalculatorService calculatorService;
2827

2928
@Autowired
3029
public DiscoveryController(DiscoveryService discoveryService,
31-
SearchService searchService,
3230
CalculatorService calculatorService) {
3331
this.discoveryService = discoveryService;
34-
this.searchService = searchService;
3532
this.calculatorService = calculatorService;
3633
}
3734

@@ -70,8 +67,7 @@ public ExplorerVisualization search(
7067
if (activeScopeId != null) {
7168
calculatorService.setScope(activeScopeId);
7269
}
73-
List<SearchResult> results = searchService.search(discoverySearchForm.query());
74-
return quickViz();
70+
return discoveryService.buildVisualization(discoverySearchForm);
7571
}
7672

7773
@GetMapping("/discovery/expand")

src/main/java/dev/ikm/server/cosmos/discovery/DiscoveryService.java

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,45 @@
11
package dev.ikm.server.cosmos.discovery;
22

33
import dev.ikm.server.cosmos.api.coordinate.CalculatorService;
4+
import dev.ikm.server.cosmos.ike.IkeRepository;
5+
import dev.ikm.tinkar.common.id.PublicId;
6+
import dev.ikm.tinkar.common.id.PublicIds;
7+
import dev.ikm.tinkar.coordinate.stamp.calculator.Latest;
8+
import dev.ikm.tinkar.entity.Entity;
9+
import dev.ikm.tinkar.entity.SemanticEntityVersion;
10+
import org.springframework.beans.factory.annotation.Autowired;
411
import org.springframework.stereotype.Service;
512

13+
import java.util.ArrayList;
614
import java.util.List;
715

816
@Service
917
public class DiscoveryService {
1018

1119
private final CalculatorService calculatorService;
20+
private final SearchService searchService;
21+
private final IkeRepository ikeRepository;
1222

13-
public DiscoveryService(CalculatorService calculatorService) {
23+
@Autowired
24+
public DiscoveryService(CalculatorService calculatorService, SearchService searchService, IkeRepository ikeRepository) {
1425
this.calculatorService = calculatorService;
26+
this.searchService = searchService;
27+
this.ikeRepository = ikeRepository;
1528
}
1629

17-
public List<ExplorerVisualization> buildVisualization(List<SearchResult> results) {
18-
return null;
30+
public ExplorerVisualization buildVisualization(DiscoverySearchForm discoverySearchForm) {
31+
List<Node> nodes = new ArrayList<>();
32+
List<Link> links = new ArrayList<>();
33+
34+
searchService.searchTinkarData(discoverySearchForm.query())
35+
.forEach(searchResult -> {
36+
Latest<SemanticEntityVersion> latest = ikeRepository.findLatestSemanticById(searchResult.id());
37+
if (latest.isPresent()) {
38+
SemanticEntityVersion semanticEntityVersion = latest.get();
39+
}
40+
});
41+
42+
return new ExplorerVisualization(nodes, links);
1943
}
2044

2145

src/main/java/dev/ikm/server/cosmos/discovery/SearchService.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import dev.ikm.server.cosmos.api.coordinate.CalculatorService;
44
import dev.ikm.server.cosmos.ike.IkeRepository;
5+
import dev.ikm.tinkar.common.id.PublicId;
6+
import dev.ikm.tinkar.common.id.PublicIds;
57
import dev.ikm.tinkar.coordinate.stamp.calculator.Latest;
68
import dev.ikm.tinkar.coordinate.stamp.calculator.LatestVersionSearchResult;
79
import dev.ikm.tinkar.entity.EntityVersion;
@@ -23,7 +25,7 @@ public SearchService(CalculatorService calculatorService, IkeRepository ikeRepos
2325
this.ikeRepository = ikeRepository;
2426
}
2527

26-
public List<SearchResult> search(String query) {
28+
public List<SearchResult> searchTinkarData(String query) {
2729
List<LatestVersionSearchResult> results = new ArrayList<>();
2830
try {
2931
results.addAll(calculatorService.getStampCalculator().search(query, 1000).castToList());

src/main/java/dev/ikm/server/cosmos/ike/IkeRepository.java

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,11 @@ public Latest<ConceptEntityVersion> findLatestConceptById(UUID id) {
7575
return calculatorService.getStampCalculator().latest(Entity.nid(publicId));
7676
}
7777

78+
public Latest<ConceptEntityVersion> findLatestConceptById(List<UUID> id) {
79+
PublicId publicId = PublicIds.of(id);
80+
return calculatorService.getStampCalculator().latest(Entity.nid(publicId));
81+
}
82+
7883
public Optional<ConceptEntity<? extends ConceptEntityVersion>> findConceptById(UUID id) {
7984
PublicId publicId = PublicIds.of(id);
8085
Optional<Entity<EntityVersion>> optionalEntity = Entity.get(Entity.nid(publicId));
@@ -84,11 +89,25 @@ public Optional<ConceptEntity<? extends ConceptEntityVersion>> findConceptById(U
8489
.map(entity -> (ConceptEntity<? extends ConceptEntityVersion>) entity);
8590
}
8691

92+
public Optional<ConceptEntity<? extends ConceptEntityVersion>> findConceptById(List<UUID> id) {
93+
PublicId publicId = PublicIds.of(id);
94+
Optional<Entity<EntityVersion>> optionalEntity = Entity.get(Entity.nid(publicId));
95+
return optionalEntity
96+
.map(entity -> (Entity<? extends EntityVersion>) entity)
97+
.filter(entity -> entity instanceof ConceptEntity<? extends ConceptEntityVersion>)
98+
.map(entity -> (ConceptEntity<? extends ConceptEntityVersion>) entity);
99+
}
100+
87101
public Latest<SemanticEntityVersion> findLatestSemanticById(UUID id) {
88102
PublicId publicId = PublicIds.of(id);
89103
return calculatorService.getStampCalculator().latest(Entity.nid(publicId));
90104
}
91105

106+
public Latest<SemanticEntityVersion> findLatestSemanticById(List<UUID> id) {
107+
PublicId publicId = PublicIds.of(id);
108+
return calculatorService.getStampCalculator().latest(Entity.nid(publicId));
109+
}
110+
92111
public Optional<SemanticEntity<? extends SemanticEntityVersion>> findSemanticById(UUID id) {
93112
PublicId publicId = PublicIds.of(id);
94113
Optional<Entity<EntityVersion>> optionalEntity = Entity.get(Entity.nid(publicId));
@@ -98,11 +117,25 @@ public Optional<SemanticEntity<? extends SemanticEntityVersion>> findSemanticByI
98117
.map(entity -> (SemanticEntity<? extends SemanticEntityVersion>) entity);
99118
}
100119

120+
public Optional<SemanticEntity<? extends SemanticEntityVersion>> findSemanticById(List<UUID> id) {
121+
PublicId publicId = PublicIds.of(id);
122+
Optional<Entity<EntityVersion>> optionalEntity = Entity.get(Entity.nid(publicId));
123+
return optionalEntity
124+
.map(entity -> (Entity<? extends EntityVersion>) entity)
125+
.filter(entity -> entity instanceof SemanticEntity<? extends SemanticEntityVersion>)
126+
.map(entity -> (SemanticEntity<? extends SemanticEntityVersion>) entity);
127+
}
128+
101129
public Latest<PatternEntityVersion> findLatestPatternById(UUID id) {
102130
PublicId publicId = PublicIds.of(id);
103131
return calculatorService.getStampCalculator().latest(Entity.nid(publicId));
104132
}
105133

134+
public Latest<PatternEntityVersion> findLatestPatternById(List<UUID> id) {
135+
PublicId publicId = PublicIds.of(id);
136+
return calculatorService.getStampCalculator().latest(Entity.nid(publicId));
137+
}
138+
106139
public Optional<PatternEntity<? extends PatternEntityVersion>> findPatternById(UUID id) {
107140
PublicId publicId = PublicIds.of(id);
108141
Optional<Entity<EntityVersion>> optionalEntity = Entity.get(Entity.nid(publicId));
@@ -112,11 +145,25 @@ public Optional<PatternEntity<? extends PatternEntityVersion>> findPatternById(U
112145
.map(entity -> (PatternEntity<? extends PatternEntityVersion>) entity);
113146
}
114147

148+
public Optional<PatternEntity<? extends PatternEntityVersion>> findPatternById(List<UUID> id) {
149+
PublicId publicId = PublicIds.of(id);
150+
Optional<Entity<EntityVersion>> optionalEntity = Entity.get(Entity.nid(publicId));
151+
return optionalEntity
152+
.map(entity -> (Entity<? extends EntityVersion>) entity)
153+
.filter(entity -> entity instanceof PatternEntity<? extends PatternEntityVersion>)
154+
.map(entity -> (PatternEntity<? extends PatternEntityVersion>) entity);
155+
}
156+
115157
public Latest<StampEntityVersion> findLatestSTAMPById(UUID id) {
116158
PublicId publicId = PublicIds.of(id);
117159
return calculatorService.getStampCalculator().latest(Entity.nid(publicId));
118160
}
119161

162+
public Latest<StampEntityVersion> findLatestSTAMPById(List<UUID> id) {
163+
PublicId publicId = PublicIds.of(id);
164+
return calculatorService.getStampCalculator().latest(Entity.nid(publicId));
165+
}
166+
120167
public Optional<StampEntity<? extends StampEntityVersion>> findSTAMPById(UUID id) {
121168
PublicId publicId = PublicIds.of(id);
122169
Optional<Entity<EntityVersion>> optionalEntity = Entity.get(Entity.nid(publicId));
@@ -126,6 +173,15 @@ public Optional<StampEntity<? extends StampEntityVersion>> findSTAMPById(UUID id
126173
.map(entity -> (StampEntity<? extends StampEntityVersion>) entity);
127174
}
128175

176+
public Optional<StampEntity<? extends StampEntityVersion>> findSTAMPById(List<UUID> id) {
177+
PublicId publicId = PublicIds.of(id);
178+
Optional<Entity<EntityVersion>> optionalEntity = Entity.get(Entity.nid(publicId));
179+
return optionalEntity
180+
.map(entity -> (Entity<? extends EntityVersion>) entity)
181+
.filter(entity -> entity instanceof StampEntity<? extends StampEntityVersion>)
182+
.map(entity -> (StampEntity<? extends StampEntityVersion>) entity);
183+
}
184+
129185
public List<List<UUID>> findAssociatedSemanticIds(UUID id) {
130186
List<List<UUID>> semanticIds = new ArrayList<>();
131187
PublicId conceptPublicId = PublicIds.of(id);
@@ -135,6 +191,15 @@ public List<List<UUID>> findAssociatedSemanticIds(UUID id) {
135191
return semanticIds;
136192
}
137193

194+
public List<List<UUID>> findAssociatedSemanticIds(List<UUID> id) {
195+
List<List<UUID>> semanticIds = new ArrayList<>();
196+
PublicId conceptPublicId = PublicIds.of(id);
197+
ikeDatabaseConfig.getPrimitiveDataService().forEachSemanticNidForComponent(
198+
Entity.nid(conceptPublicId),
199+
semanticNid -> semanticIds.add(PrimitiveData.publicId(semanticNid).asUuidList().toList()));
200+
return semanticIds;
201+
}
202+
138203
public Map<List<UUID>, String> findIdentifiers(UUID id) {
139204
Map<List<UUID>, String> identifierMap = new HashMap<>();
140205
PublicId conceptPublicId = PublicIds.of(id);
@@ -156,14 +221,43 @@ public Map<List<UUID>, String> findIdentifiers(UUID id) {
156221
return identifierMap;
157222
}
158223

224+
public Map<List<UUID>, String> findIdentifiers(List<UUID> id) {
225+
Map<List<UUID>, String> identifierMap = new HashMap<>();
226+
PublicId conceptPublicId = PublicIds.of(id);
227+
ikeDatabaseConfig.getPrimitiveDataService().forEachSemanticNidForComponentOfPattern(
228+
Entity.nid(conceptPublicId),
229+
TinkarTermV2.IDENTIFIER_PATTERN.nid(),
230+
identifierSemanticNid -> {
231+
Latest<Field<PublicId>> latestSource = calculatorService
232+
.getStampCalculator()
233+
.getFieldForSemanticWithMeaning(identifierSemanticNid, TinkarTermV2.IDENTIFIER_SOURCE);
234+
Latest<Field<String>> latestValue = calculatorService
235+
.getStampCalculator()
236+
.getFieldForSemanticWithMeaning(identifierSemanticNid, TinkarTermV2.IDENTIFIER_VALUE);
237+
if (latestSource.isPresent() && latestValue.isPresent()) {
238+
identifierMap.put(latestSource.get().value().asUuidList().stream().toList(), latestValue.get().value());
239+
}
240+
}
241+
);
242+
return identifierMap;
243+
}
244+
159245
public List<UUID> findUSDialect(UUID id) {
160246
return findAcceptability(id, TinkarTermV2.US_DIALECT_PATTERN);
161247
}
162248

249+
public List<UUID> findUSDialect(List<UUID> id) {
250+
return findAcceptability(id, TinkarTermV2.US_DIALECT_PATTERN);
251+
}
252+
163253
public List<UUID> findGBDialect(UUID id) {
164254
return findAcceptability(id, TinkarTermV2.GB_DIALECT_PATTERN);
165255
}
166256

257+
public List<UUID> findGBDialect(List<UUID> id) {
258+
return findAcceptability(id, TinkarTermV2.GB_DIALECT_PATTERN);
259+
}
260+
167261
private List<UUID> findAcceptability(UUID id, EntityProxy.Pattern dialect) {
168262
List<UUID> acceptabilityId = new ArrayList<>();
169263
PublicId semanticPublicId = PublicIds.of(id);
@@ -180,4 +274,21 @@ private List<UUID> findAcceptability(UUID id, EntityProxy.Pattern dialect) {
180274
);
181275
return acceptabilityId;
182276
}
277+
278+
private List<UUID> findAcceptability(List<UUID> id, EntityProxy.Pattern dialect) {
279+
List<UUID> acceptabilityId = new ArrayList<>();
280+
PublicId semanticPublicId = PublicIds.of(id);
281+
ikeDatabaseConfig.getPrimitiveDataService().forEachSemanticNidForComponentOfPattern(
282+
Entity.nid(semanticPublicId),
283+
dialect.nid(),
284+
nid -> {
285+
Latest<Field<PublicId>> acceptability = calculatorService.getStampCalculator()
286+
.getFieldForSemanticWithMeaning(nid, TinkarTermV2.GREAT_BRITAIN_ENGLISH_DIALECT);
287+
if (acceptability.isPresent()) {
288+
acceptabilityId.addAll(acceptability.get().value().asUuidList().stream().toList());
289+
}
290+
}
291+
);
292+
return acceptabilityId;
293+
}
183294
}

0 commit comments

Comments
 (0)