@finbheara/domain 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +273 -2
- package/dist/age.js +420 -0
- package/dist/ceili.js +15 -0
- package/dist/chunks/place-7gqecaxd.js +201 -0
- package/dist/chunks/place-g6yw4cq6.js +134 -0
- package/dist/chunks/place-kr42294h.js +267 -0
- package/dist/chunks/place-qbp3xfb4.js +7412 -0
- package/dist/clrg-regions.js +603 -0
- package/dist/dance-types.js +14 -0
- package/dist/dance.js +41 -0
- package/dist/noun-index.js +233 -0
- package/dist/place.js +36 -0
- package/dist/school.js +2269 -0
- package/dist/tune.js +23 -0
- package/dist/types/age-types.d.ts +31 -0
- package/dist/types/age.d.ts +84 -0
- package/dist/types/ceili.d.ts +53 -0
- package/dist/types/clrg-regions.d.ts +31 -0
- package/dist/types/dance-match.d.ts +28 -0
- package/dist/types/dance-types.d.ts +9 -0
- package/dist/types/dance.d.ts +14 -0
- package/dist/types/noun-index.d.ts +67 -0
- package/dist/types/place-tree.d.ts +4 -0
- package/dist/types/place-types.d.ts +24 -0
- package/dist/types/place.d.ts +98 -0
- package/dist/types/school-compare.d.ts +39 -0
- package/dist/types/school-encoder.d.ts +8 -0
- package/dist/types/school-exception-vocabulary.d.ts +23 -0
- package/dist/types/school-fluff-vocabulary.d.ts +16 -0
- package/dist/types/school-fused-prefix.d.ts +1 -0
- package/dist/types/school-identity.d.ts +9 -0
- package/dist/types/school-institution-vocabulary.d.ts +20 -0
- package/dist/types/school-location.d.ts +16 -0
- package/dist/types/school-match-key.d.ts +5 -0
- package/dist/types/school-name.d.ts +82 -0
- package/dist/types/school-tokens.d.ts +20 -0
- package/dist/types/school.d.ts +11 -0
- package/dist/types/tune.d.ts +63 -0
- package/package.json +73 -5
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import {
|
|
2
|
+
NAME_COLUMNS,
|
|
3
|
+
NAME_LEVEL_COLUMNS,
|
|
4
|
+
nameColumns,
|
|
5
|
+
personName
|
|
6
|
+
} from "@finbheara/names/normalize";
|
|
7
|
+
var IDENT = /^[A-Za-z_][A-Za-z0-9_]*$/u;
|
|
8
|
+
var RESERVED = new Set(`rowid oid _rowid_ __r __v all and as by check create default delete distinct drop
|
|
9
|
+
from group in index insert into is key limit not null on or order primary references
|
|
10
|
+
select set table to union unique update values where`.split(/\s+/u));
|
|
11
|
+
function ident(s, what) {
|
|
12
|
+
if (!IDENT.test(s) || RESERVED.has(s.toLowerCase()))
|
|
13
|
+
throw new Error(`noun-index: ${what} ${JSON.stringify(s)} is not a usable identifier`);
|
|
14
|
+
return s;
|
|
15
|
+
}
|
|
16
|
+
function resolve(encoder, options) {
|
|
17
|
+
const table = ident(options.table ?? "noun_index", "table");
|
|
18
|
+
const value = ident(options.value ?? "value", "value column");
|
|
19
|
+
const valueType = (options.valueType ?? "").trim();
|
|
20
|
+
if (!/^[A-Za-z ()0-9]*$/u.test(valueType))
|
|
21
|
+
throw new Error(`noun-index: value type ${JSON.stringify(valueType)} is not a type`);
|
|
22
|
+
const seen = new Set([value.toLowerCase()]);
|
|
23
|
+
for (const c of encoder.columns) {
|
|
24
|
+
ident(c, "column");
|
|
25
|
+
if (seen.has(c.toLowerCase()))
|
|
26
|
+
throw new Error(`noun-index: column ${c} is declared twice`);
|
|
27
|
+
seen.add(c.toLowerCase());
|
|
28
|
+
}
|
|
29
|
+
for (const c of [...encoder.levels, ...encoder.indexed])
|
|
30
|
+
if (!encoder.columns.includes(c))
|
|
31
|
+
throw new Error(`noun-index: ${c} is not a column`);
|
|
32
|
+
return { table, value, valueType, isKey: /primary\s+key/iu.test(valueType) };
|
|
33
|
+
}
|
|
34
|
+
function indexSchema(encoder, options = {}) {
|
|
35
|
+
const r = resolve(encoder, options);
|
|
36
|
+
const cols = [`${r.value}${r.valueType === "" ? "" : ` ${r.valueType}`}`];
|
|
37
|
+
for (const c of encoder.columns)
|
|
38
|
+
cols.push(`${c} TEXT`);
|
|
39
|
+
const indexes = [];
|
|
40
|
+
if (!r.isKey)
|
|
41
|
+
indexes.push(`CREATE INDEX IF NOT EXISTS ${r.table}_${r.value} ON ${r.table}(${r.value})`);
|
|
42
|
+
for (const c of encoder.indexed)
|
|
43
|
+
indexes.push(`CREATE INDEX IF NOT EXISTS ${r.table}_${c} ON ${r.table}(${c})`);
|
|
44
|
+
return { table: `CREATE TABLE IF NOT EXISTS ${r.table}(${cols.join(", ")})`, indexes };
|
|
45
|
+
}
|
|
46
|
+
var CHUNK = 500;
|
|
47
|
+
function createIndex(handle, encoder, options = {}) {
|
|
48
|
+
const r = resolve(encoder, options);
|
|
49
|
+
const { table: T, value: VC } = r;
|
|
50
|
+
const cols = encoder.columns;
|
|
51
|
+
const prepared = new Map;
|
|
52
|
+
const stmt = (sql) => {
|
|
53
|
+
let s = prepared.get(sql);
|
|
54
|
+
if (s === undefined) {
|
|
55
|
+
s = handle.prepare(sql);
|
|
56
|
+
prepared.set(sql, s);
|
|
57
|
+
}
|
|
58
|
+
return s;
|
|
59
|
+
};
|
|
60
|
+
const column = (c) => {
|
|
61
|
+
if (!cols.includes(c))
|
|
62
|
+
throw new Error(`noun-index: ${c} is not a column of ${T}`);
|
|
63
|
+
return c;
|
|
64
|
+
};
|
|
65
|
+
const level = (l) => {
|
|
66
|
+
if (!encoder.levels.includes(l))
|
|
67
|
+
throw new Error(`noun-index: ${l} is not a level of ${T}`);
|
|
68
|
+
return l;
|
|
69
|
+
};
|
|
70
|
+
const insertSql = `INSERT INTO ${T}(${VC}, ${cols.join(", ")}) VALUES(${cols.map(() => "?").join(", ")}, ?)`;
|
|
71
|
+
const params = (x) => {
|
|
72
|
+
const e = encoder.encode(x);
|
|
73
|
+
return cols.map((c) => e[c] ?? null);
|
|
74
|
+
};
|
|
75
|
+
const insert = (x, value) => {
|
|
76
|
+
stmt(insertSql).run(value, ...params(x));
|
|
77
|
+
};
|
|
78
|
+
const keyAt = (x, l) => {
|
|
79
|
+
level(l);
|
|
80
|
+
return encoder.key === undefined ? encoder.encode(x)[l] ?? null : encoder.key(x, l);
|
|
81
|
+
};
|
|
82
|
+
const valuesWhere = (col, key) => stmt(`SELECT ${VC} AS v FROM ${T} WHERE ${col} = ? ORDER BY rowid`).all(key).map((o) => o.v);
|
|
83
|
+
const pick = (columns) => columns === undefined ? cols : columns.map(column);
|
|
84
|
+
const toRows = (raw, picked) => raw.map((o) => {
|
|
85
|
+
const row = {};
|
|
86
|
+
for (const c of picked)
|
|
87
|
+
row[c] = o[c] ?? null;
|
|
88
|
+
return { value: o.__v, row };
|
|
89
|
+
});
|
|
90
|
+
const selectList = (picked) => ["rowid AS __r", `${VC} AS __v`, ...picked].join(", ");
|
|
91
|
+
const index = {
|
|
92
|
+
table: T,
|
|
93
|
+
encoder,
|
|
94
|
+
add: insert,
|
|
95
|
+
addAll(entries) {
|
|
96
|
+
for (const [x, v] of entries)
|
|
97
|
+
insert(x, v);
|
|
98
|
+
},
|
|
99
|
+
get(x, l) {
|
|
100
|
+
const k = keyAt(x, l);
|
|
101
|
+
return k === null ? [] : valuesWhere(l, k);
|
|
102
|
+
},
|
|
103
|
+
has(x, l) {
|
|
104
|
+
const k = keyAt(x, l);
|
|
105
|
+
return k !== null && stmt(`SELECT 1 FROM ${T} WHERE ${l} = ? LIMIT 1`).all(k).length > 0;
|
|
106
|
+
},
|
|
107
|
+
find: (c, key) => valuesWhere(column(c), key),
|
|
108
|
+
rows(where, columns) {
|
|
109
|
+
const picked = pick(columns);
|
|
110
|
+
const seen = new Map;
|
|
111
|
+
for (const [c, keys] of Object.entries(where)) {
|
|
112
|
+
column(c);
|
|
113
|
+
const uniq = [...new Set(keys)];
|
|
114
|
+
for (let i = 0;i < uniq.length; i += CHUNK) {
|
|
115
|
+
const part = uniq.slice(i, i + CHUNK);
|
|
116
|
+
const sql = `SELECT ${selectList(picked)} FROM ${T} WHERE ${c} IN (${part.map(() => "?").join(",")})`;
|
|
117
|
+
for (const o of stmt(sql).all(...part))
|
|
118
|
+
seen.set(Number(o.__r), o);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return toRows([...seen].sort((a, b) => a[0] - b[0]).map(([, o]) => o), picked);
|
|
122
|
+
},
|
|
123
|
+
glob(c, pattern, columns) {
|
|
124
|
+
const picked = pick(columns);
|
|
125
|
+
const raw = stmt(`SELECT ${selectList(picked)} FROM ${T} WHERE ${column(c)} GLOB ? ORDER BY rowid`).all(pattern);
|
|
126
|
+
return toRows(raw, picked);
|
|
127
|
+
},
|
|
128
|
+
nouns(value) {
|
|
129
|
+
const raw = stmt(`SELECT ${cols.join(", ")} FROM ${T} WHERE ${VC} = ? ORDER BY rowid`).all(value);
|
|
130
|
+
return raw.map((o) => encoder.decode(o));
|
|
131
|
+
},
|
|
132
|
+
remove(value) {
|
|
133
|
+
const n = stmt(`SELECT count(*) AS n FROM ${T} WHERE ${VC} = ?`).all(value)[0].n;
|
|
134
|
+
if (n > 0)
|
|
135
|
+
stmt(`DELETE FROM ${T} WHERE ${VC} = ?`).run(value);
|
|
136
|
+
return Number(n);
|
|
137
|
+
},
|
|
138
|
+
size: () => Number(stmt(`SELECT count(*) AS n FROM ${T}`).all()[0].n),
|
|
139
|
+
map: (l) => viewAt(l)
|
|
140
|
+
};
|
|
141
|
+
function viewAt(l) {
|
|
142
|
+
const lc = level(l);
|
|
143
|
+
const heads = `SELECT rowid AS __r, ${VC} AS __v, ${cols.join(", ")} FROM ${T}
|
|
144
|
+
WHERE ${lc} IS NULL OR rowid IN (SELECT min(rowid) FROM ${T} WHERE ${lc} IS NOT NULL GROUP BY ${lc})
|
|
145
|
+
ORDER BY rowid`;
|
|
146
|
+
const head = (k) => stmt(`SELECT rowid AS __r, ${VC} AS __v FROM ${T} WHERE ${lc} = ? ORDER BY rowid LIMIT 1`).all(k)[0];
|
|
147
|
+
const all = () => stmt(heads).all();
|
|
148
|
+
const view = {
|
|
149
|
+
dop: l,
|
|
150
|
+
get size() {
|
|
151
|
+
const o = stmt(`SELECT (SELECT count(DISTINCT ${lc}) FROM ${T}) + (SELECT count(*) FROM ${T} WHERE ${lc} IS NULL) AS n`).all()[0];
|
|
152
|
+
return Number(o.n);
|
|
153
|
+
},
|
|
154
|
+
get(x) {
|
|
155
|
+
const k = keyAt(x, l);
|
|
156
|
+
return k === null ? undefined : head(k)?.__v;
|
|
157
|
+
},
|
|
158
|
+
has(x) {
|
|
159
|
+
const k = keyAt(x, l);
|
|
160
|
+
return k !== null && head(k) !== undefined;
|
|
161
|
+
},
|
|
162
|
+
set(x, value) {
|
|
163
|
+
const k = keyAt(x, l);
|
|
164
|
+
const h = k === null ? undefined : head(k);
|
|
165
|
+
if (h === undefined)
|
|
166
|
+
insert(x, value);
|
|
167
|
+
else
|
|
168
|
+
stmt(`UPDATE ${T} SET ${VC} = ? WHERE rowid = ?`).run(value, h.__r);
|
|
169
|
+
return this;
|
|
170
|
+
},
|
|
171
|
+
delete(x) {
|
|
172
|
+
const k = keyAt(x, l);
|
|
173
|
+
if (k === null || head(k) === undefined)
|
|
174
|
+
return false;
|
|
175
|
+
stmt(`DELETE FROM ${T} WHERE ${lc} = ?`).run(k);
|
|
176
|
+
return true;
|
|
177
|
+
},
|
|
178
|
+
clear() {
|
|
179
|
+
stmt(`DELETE FROM ${T}`).run();
|
|
180
|
+
},
|
|
181
|
+
*keys() {
|
|
182
|
+
for (const o of all())
|
|
183
|
+
yield encoder.decode(o);
|
|
184
|
+
},
|
|
185
|
+
*values() {
|
|
186
|
+
for (const o of all())
|
|
187
|
+
yield o.__v;
|
|
188
|
+
},
|
|
189
|
+
*entries() {
|
|
190
|
+
for (const o of all())
|
|
191
|
+
yield [encoder.decode(o), o.__v];
|
|
192
|
+
},
|
|
193
|
+
[Symbol.iterator]() {
|
|
194
|
+
return this.entries();
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
return view;
|
|
198
|
+
}
|
|
199
|
+
return index;
|
|
200
|
+
}
|
|
201
|
+
var sameColumns = (a, b) => NAME_COLUMNS.every((c) => a[c] === b[c]);
|
|
202
|
+
function personEncoder(options = {}) {
|
|
203
|
+
const read = options.read ?? ((p, o) => personName(p, o));
|
|
204
|
+
const printCol = options.print ?? "print";
|
|
205
|
+
const readingCol = options.reading ?? "reading";
|
|
206
|
+
const readingOf = (x, cols) => {
|
|
207
|
+
const g = read(x.nn0, "given-first");
|
|
208
|
+
if (g === x || sameColumns(cols, nameColumns(g)))
|
|
209
|
+
return "given-first";
|
|
210
|
+
if (sameColumns(cols, nameColumns(read(x.nn0, "surname-first"))))
|
|
211
|
+
return "surname-first";
|
|
212
|
+
throw new Error(`personEncoder: ${JSON.stringify(x.nn0)} was not read by this encoder's reader in either order`);
|
|
213
|
+
};
|
|
214
|
+
return {
|
|
215
|
+
columns: [printCol, readingCol, ...NAME_COLUMNS],
|
|
216
|
+
levels: NAME_LEVEL_COLUMNS,
|
|
217
|
+
indexed: NAME_COLUMNS.filter((c) => c !== "given_key"),
|
|
218
|
+
encode(x) {
|
|
219
|
+
const cols = nameColumns(x);
|
|
220
|
+
return { [printCol]: x.nn0, [readingCol]: readingOf(x, cols), ...cols };
|
|
221
|
+
},
|
|
222
|
+
key: (x, level) => nameColumns(x)[level],
|
|
223
|
+
decode(row) {
|
|
224
|
+
const order = row[readingCol] === "surname-first" ? "surname-first" : "given-first";
|
|
225
|
+
return read(row[printCol] ?? "", order);
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
export {
|
|
230
|
+
createIndex,
|
|
231
|
+
indexSchema,
|
|
232
|
+
personEncoder
|
|
233
|
+
};
|
package/dist/place.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DEFAULT_PLACE_CAPACITY2,
|
|
3
|
+
createPlaceReader2,
|
|
4
|
+
DEFAULT_PLACE_READER2,
|
|
5
|
+
place2,
|
|
6
|
+
isPlaceToken2,
|
|
7
|
+
countryCodeOf2,
|
|
8
|
+
areAllPlaceTokens2,
|
|
9
|
+
placeFromId2,
|
|
10
|
+
oireachtasOfRegion2,
|
|
11
|
+
regionOfOireachtas2,
|
|
12
|
+
placeStats2,
|
|
13
|
+
resetPlaceCache2,
|
|
14
|
+
placeRelation2,
|
|
15
|
+
placesRelation2,
|
|
16
|
+
probablySamePlace2,
|
|
17
|
+
sameReading2
|
|
18
|
+
} from "./chunks/place-qbp3xfb4.js";
|
|
19
|
+
export {
|
|
20
|
+
DEFAULT_PLACE_CAPACITY2 as DEFAULT_PLACE_CAPACITY,
|
|
21
|
+
DEFAULT_PLACE_READER2 as DEFAULT_PLACE_READER,
|
|
22
|
+
areAllPlaceTokens2 as areAllPlaceTokens,
|
|
23
|
+
countryCodeOf2 as countryCodeOf,
|
|
24
|
+
createPlaceReader2 as createPlaceReader,
|
|
25
|
+
isPlaceToken2 as isPlaceToken,
|
|
26
|
+
oireachtasOfRegion2 as oireachtasOfRegion,
|
|
27
|
+
place2 as place,
|
|
28
|
+
placeFromId2 as placeFromId,
|
|
29
|
+
placeRelation2 as placeRelation,
|
|
30
|
+
placeStats2 as placeStats,
|
|
31
|
+
placesRelation2 as placesRelation,
|
|
32
|
+
probablySamePlace2 as probablySamePlace,
|
|
33
|
+
regionOfOireachtas2 as regionOfOireachtas,
|
|
34
|
+
resetPlaceCache2 as resetPlaceCache,
|
|
35
|
+
sameReading2 as sameReading
|
|
36
|
+
};
|