1 package io.github.magwas.inez.query;
2
3 import static io.github.magwas.runtime.LogUtil.debug;
4
5 import java.util.List;
6 import java.util.Map;
7 import java.util.Set;
8 import java.util.function.Function;
9 import java.util.stream.Stream;
10
11 import org.springframework.beans.factory.annotation.Autowired;
12 import org.springframework.stereotype.Service;
13
14 import io.github.magwas.inez.Bridi;
15 import io.github.magwas.inez.parse.IdUtil;
16 import io.github.magwas.inez.parse.ParserOutput;
17 import io.github.magwas.inez.storage.model.Sumti;
18 import io.github.magwas.inez.storage.repository.SumtiRepository;
19
20 @Service
21 public class CreateBridisFromParserOutputService implements Function<ParserOutput, Stream<Bridi>> {
22
23 @Autowired
24 SumtiRepository sumtiRepository;
25
26 @Override
27 public Stream<Bridi> apply(final ParserOutput parserOutput) {
28 String top = parserOutput.top();
29 Map<String, List<String>> refMap = parserOutput.referenceMap();
30 return apply(top, refMap);
31 }
32
33 private Stream<Bridi> apply(final String top, final Map<String, List<String>> refMap) {
34 debug("apply(", top, refMap);
35 if (!refMap.containsKey(top)) {
36 Bridi bridi = new Bridi(getIdOrRepr(top), top, List.of());
37 debug("bridi->", bridi);
38 return Stream.of(bridi);
39 }
40 List<String> partList = refMap.get(top);
41 return Stream.of(new Bridi(
42 getIdOrRepr(top),
43 top,
44 partList.stream().map(this::getIdOrRepr).toList()))
45 .mapMulti((topBridi, consumer) -> {
46 consumer.accept(topBridi);
47 partList.stream().map(x -> apply(x, refMap)).flatMap(x -> x).forEach(consumer::accept);
48 });
49 }
50
51 private String getIdOrRepr(final String top) {
52 Set<Sumti> candidates = sumtiRepository.findAllByRepresentation(top);
53 if (candidates.isEmpty()) return IdUtil.createID(top);
54 if (candidates.size() > 1) System.err.println("multiple candidates for " + top + ":" + candidates);
55 return candidates.iterator().next().id();
56 }
57 }