View Javadoc
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  }