|
17 | 17 | */ |
18 | 18 | package dev.enola.thing.repo; |
19 | 19 |
|
| 20 | +import static dev.enola.common.collect.Immutables.join; |
| 21 | + |
20 | 22 | import dev.enola.thing.KIRI; |
21 | 23 | import dev.enola.thing.Thing; |
22 | 24 |
|
| 25 | +import java.util.List; |
| 26 | + |
23 | 27 | class ThingMerger { |
24 | 28 | // TODO Implement missing ThingMergerTest coverage! |
25 | 29 |
|
26 | | - public static Thing merge(Thing existing, Thing update) { |
27 | | - if (!existing.iri().equals(update.iri())) throw new IllegalArgumentException(); |
| 30 | + public static Thing merge(Thing t1, Thing t2) { |
| 31 | + if (!t1.iri().equals(t2.iri())) throw new IllegalArgumentException(); |
28 | 32 |
|
29 | | - if (existing.predicateIRIs().isEmpty()) return update; |
30 | | - if (update.predicateIRIs().isEmpty()) return existing; |
| 33 | + if (t1.predicateIRIs().isEmpty()) return t2; |
| 34 | + if (t2.predicateIRIs().isEmpty()) return t1; |
31 | 35 |
|
32 | | - var merged = existing.copy(); |
33 | | - var properties = update.properties(); |
| 36 | + var merged = t1.copy(); |
| 37 | + var properties = t2.properties(); |
34 | 38 | properties.forEach( |
35 | | - (predicate, value) -> { |
36 | | - var old = existing.get(predicate); |
37 | | - if (old == null) merged.set(predicate, value, update.datatype(predicate)); |
38 | | - else if (old.equals(value)) { |
| 39 | + (predicate, t2obj) -> { |
| 40 | + var t1obj = t1.get(predicate); |
| 41 | + if (t1obj == null) merged.set(predicate, t2obj, t2.datatype(predicate)); |
| 42 | + else if (t1obj.equals(t2obj)) { |
39 | 43 | // That's fine! |
40 | | - } else if (predicate.equals(KIRI.E.ORIGIN)) { |
41 | | - // TODO Implement merging both into a List, with test coverage! |
| 44 | + } else if (t1obj instanceof List t1list && t2obj instanceof List t2list) { |
| 45 | + merged.set(predicate, join(t1list, t2list)); |
42 | 46 | } else |
43 | 47 | throw new IllegalStateException( |
44 | 48 | "Cannot merge " |
45 | 49 | + predicate |
46 | 50 | + " of an " |
47 | | - + existing.iri() |
| 51 | + + t1.iri() |
48 | 52 | + " from " |
49 | | - + existing.getString(KIRI.E.ORIGIN) |
| 53 | + + t1.getString(KIRI.E.ORIGIN) |
50 | 54 | + " and " |
51 | | - + update.getString(KIRI.E.ORIGIN)); |
| 55 | + + t2.getString(KIRI.E.ORIGIN)); |
52 | 56 | }); |
53 | 57 | return merged.build(); |
54 | 58 | } |
|
0 commit comments