@@ -16,6 +16,26 @@ static void printStringArrayCode(Iterable<String> toPrint, String name, PrintWri
1616 }
1717 out .println (" };" );
1818 }
19+ static void printBooleanArrayCode (Iterable <Boolean > toPrint , String name , PrintWriter out ) {
20+ out .println (" private static final boolean[] " +name +" =" );
21+ char before = '{' ;
22+ for (boolean val : toPrint ) {
23+ out .println (" " +before +val );
24+ before = ',' ;
25+ }
26+ out .println (" };" );
27+ }
28+ static void printStringArrayArrayCode (Iterable <? extends Iterable <String >> toPrint , String name , PrintWriter out ) {
29+ out .println (" private static final String[][] " +name +" =" );
30+ char before = '{' ;
31+ for (Iterable <String > val : toPrint ) {
32+ out .println (" " +before +"{\" " +String .join ("\" ,\" " , val )+"\" }" );
33+ before = ',' ;
34+ }
35+ out .println (" };" );
36+ }
37+
38+
1939 static TreeMap <String ,String > readTSV (Scanner src ) {
2040 TreeMap <String ,String > ans = new TreeMap <String ,String >();
2141 while (src .hasNext ()) {
@@ -145,6 +165,46 @@ public static void main(String[] args) throws IOException {
145165 dest .println (" if (idx < 0) return null;" );
146166 dest .println (" return payloadVals[idx];" );
147167 dest .println (" }" );
168+
169+ dest .println ();
170+
171+ // cardinalities
172+ s = new Scanner (new URL ("https://github.com/FamilySearch/GEDCOM/raw/main/extracted-files/cardinalities.tsv" ).openStream ());
173+ known = readTSV (s );
174+ TreeMap <String , TreeSet <String >> required = new TreeMap <String ,TreeSet <String >>();
175+ TreeMap <String , Boolean > singular = new TreeMap <String ,Boolean >();
176+ known .forEach ((k ,v ) -> {
177+ if (v .charAt (1 ) == '1' ) {
178+ String [] k2 = k .split ("\t " );
179+ required .putIfAbsent (k2 [0 ], new TreeSet <String >());
180+ required .get (k2 [0 ]).add (k2 [1 ]);
181+ }
182+ singular .put (k , v .charAt (3 ) == '1' );
183+ });
184+ printStringArrayCode (required .keySet (), "reqKeys" , dest );
185+ printStringArrayArrayCode (required .values (), "reqVals" , dest );
186+ printStringArrayCode (singular .keySet (), "singleKeys" , dest );
187+ printBooleanArrayCode (singular .values (), "singleVals" , dest );
188+
189+ dest .println (" public static String[] requiredSubstructures(String struct) {" );
190+ dest .println (" if (struct == null) return new String[0];" );
191+ dest .println (" int idx = binarySearch(reqKeys, struct);" );
192+ dest .println (" if (idx < 0) return new String[0];" );
193+ dest .println (" return reqVals[idx];" );
194+ dest .println (" }" );
195+
196+ dest .println (" public static boolean justOne(String ctx, String uri) {" );
197+ dest .println (" if (ctx == null) return false;" );
198+ dest .println (" String key = ctx+'\\ t'+uri;" );
199+ dest .println (" int idx = binarySearch(singleKeys, key);" );
200+ dest .println (" if (idx < 0) return false;" );
201+ dest .println (" return singleVals[idx];" );
202+ dest .println (" }" );
203+
204+
205+
206+ dest .println ();
207+
148208
149209 // FHISO's language mapping
150210 s = new Scanner (new URL ("https://github.com/fhiso/legacy-format/raw/master/languages.tsv" ).openStream ());
@@ -162,10 +222,6 @@ public static void main(String[] args) throws IOException {
162222 dest .println (" return langVals[idx].replace(\" *\" ,\" \" );" );
163223 dest .println (" }" );
164224
165-
166-
167-
168-
169225 dest .println ("}" );
170226 }
171227 }
0 commit comments