aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ee/souffle/digikey.dl1
-rw-r--r--src/ee/souffle/part.dl9
-rw-r--r--src/ee/tools/part_apply_souffle_pre.py46
3 files changed, 48 insertions, 8 deletions
diff --git a/src/ee/souffle/digikey.dl b/src/ee/souffle/digikey.dl
index fad22dd..b1c65b0 100644
--- a/src/ee/souffle/digikey.dl
+++ b/src/ee/souffle/digikey.dl
@@ -1,4 +1,5 @@
#include "facts.dl"
+#include "part.dl"
.decl add_fact(part_uri:symbol, key:symbol, value:symbol)
.output add_fact
diff --git a/src/ee/souffle/part.dl b/src/ee/souffle/part.dl
new file mode 100644
index 0000000..eea7faa
--- /dev/null
+++ b/src/ee/souffle/part.dl
@@ -0,0 +1,9 @@
+// Generic rules for parts
+
+.decl part_category(part: symbol, category: symbol)
+part_category(part, category) :- part_main_category(part, category).
+
+part_category(part, parent) :- part_category(part, category),
+ category(category, _, parent, _),
+ parent != "".
+.output part_category
diff --git a/src/ee/tools/part_apply_souffle_pre.py b/src/ee/tools/part_apply_souffle_pre.py
index 17dff44..b228d6f 100644
--- a/src/ee/tools/part_apply_souffle_pre.py
+++ b/src/ee/tools/part_apply_souffle_pre.py
@@ -4,7 +4,8 @@ from pathlib import Path
import ee.tools
from ee import tools
-from ee.part import Part, load_db
+from ee.logging import log
+from ee.part import Part, PartDb, load_db
from ee.tools import mk_dirs
@@ -19,20 +20,26 @@ class SouffleDialect(csv.Dialect):
# quoting = csv.QUOTE_NONE
-def write_csvs(print_header, in_parts, part_f, part_pn_f, fact_f):
- dialect = SouffleDialect
- part_csv = csv.writer(part_f, dialect=dialect)
+_dialect = SouffleDialect
+
+
+def write_csvs(print_header, in_parts: PartDb, part_f, part_pn_f, fact_f, part_main_category_f):
+ part_csv = csv.writer(part_f, dialect=_dialect)
if print_header:
part_csv.writerow(["uri", "ref"])
- part_pn_csv = csv.writer(part_pn_f, dialect=dialect)
+ part_pn_csv = csv.writer(part_pn_f, dialect=_dialect)
if print_header:
part_pn_csv.writerow(["part_uri", "spn", "mpn"])
- fact_csv = csv.writer(fact_f, dialect=dialect)
+ fact_csv = csv.writer(fact_f, dialect=_dialect)
if print_header:
fact_csv.writerow(["part_uri", "key", "value"])
+ main_category_csv = csv.writer(part_main_category_f, dialect=_dialect)
+ if print_header:
+ main_category_csv.writerow(["part_uri", "category_uri"])
+
part_count = 0
fact_count = 0
@@ -52,9 +59,21 @@ def write_csvs(print_header, in_parts, part_f, part_pn_f, fact_f):
fact_csv.writerow([p.uri, fact.keyProp, fact.valueProp])
fact_count += 1
+ if p.xml.categoryProp:
+ main_category_csv.writerow([p.uri, p.xml.categoryProp])
+
return part_count, fact_count
+def write_category(print_header, in_parts: PartDb, category_f):
+ category_csv = csv.writer(category_f, dialect=_dialect)
+ if print_header:
+ category_csv.writerow(["uri", "name", "parent", "href"])
+
+ for c in in_parts.categories:
+ category_csv.writerow([c.uri, c.name, c.parent.uri if c.parent else None, c.href])
+
+
def work(in_path: Path, work_dir: Path):
in_parts = load_db(in_path)
@@ -71,6 +90,12 @@ def work(in_path: Path, work_dir: Path):
.decl part_pn(part_uri:symbol, spn:symbol, mpn:symbol)
.input part_pn
+
+.decl part_main_category(part_uri:symbol, category_uri:symbol)
+.input part_main_category
+
+.decl category(category_uri:symbol, name:symbol, parent:symbol, href:symbol)
+.input category
""".strip(), file=f)
in_dir = work_dir / "in"
@@ -78,9 +103,14 @@ def work(in_path: Path, work_dir: Path):
with (in_dir / "part.facts").open("w") as part_f:
with (in_dir / "part_pn.facts").open("w") as part_pn_f:
with (in_dir / "fact.facts").open("w") as fact_f:
- part_count, fact_count = write_csvs(print_header, in_parts, part_f, part_pn_f, fact_f)
+ with (in_dir / "part_main_category.facts").open("w") as part_main_category_f:
+ part_count, fact_count = write_csvs(print_header, in_parts, part_f, part_pn_f, fact_f,
+ part_main_category_f)
+
+ with (in_dir / "category.facts").open("w") as category_f:
+ write_category(print_header, in_parts, category_f)
- print("Loaded clauses: {} parts, {} facts".format(part_count, fact_count))
+ log.info("Loaded clauses: {} parts, {} facts".format(part_count, fact_count))
parser = argparse.ArgumentParser()