|
41 | 41 | ;; or [(Datom. 2 "Oleg" 1 55) ...] |
42 | 42 | (defrecord Relation [attrs tuples]) |
43 | 43 |
|
| 44 | +#?(:clj |
| 45 | + (defmethod print-method Relation [r, ^java.io.Writer w] |
| 46 | + (.write w "#Relation{:attrs ") |
| 47 | + (.write w (pr-str (:attrs r))) |
| 48 | + (.write w ", :tuples [") |
| 49 | + (.write w (str/join " " (map seq (:tuples r)))) |
| 50 | + (.write w "]}"))) |
| 51 | + |
44 | 52 |
|
45 | 53 | ;; Utilities |
46 | 54 |
|
|
804 | 812 | *lookup-attrs*)] |
805 | 813 | (update context :rels collapse-rels relation)))))) |
806 | 814 |
|
| 815 | +(defn short-circuit-empty-rel [context] |
| 816 | + (if (some #(empty? (:tuples %)) (:rels context)) |
| 817 | + (assoc context |
| 818 | + :rels |
| 819 | + [(Relation. |
| 820 | + (zipmap (mapcat #(keys (:attrs %)) (:rels context)) (range)) |
| 821 | + [])]) |
| 822 | + context)) |
| 823 | + |
807 | 824 | (defn resolve-clause [context clause] |
808 | 825 | (if (->> (:rels context) (some (comp empty? :tuples))) |
809 | 826 | context ; The result is empty; short-circuit processing |
810 | | - (if (rule? context clause) |
811 | | - (if (source? (first clause)) |
812 | | - (binding [*implicit-source* (get (:sources context) (first clause))] |
813 | | - (resolve-clause context (next clause))) |
814 | | - (update context :rels collapse-rels (solve-rule context clause))) |
815 | | - (-resolve-clause context clause)))) |
| 827 | + (short-circuit-empty-rel |
| 828 | + (if (rule? context clause) |
| 829 | + (if (source? (first clause)) |
| 830 | + (binding [*implicit-source* (get (:sources context) (first clause))] |
| 831 | + (resolve-clause context (next clause))) |
| 832 | + (update context :rels collapse-rels (solve-rule context clause))) |
| 833 | + (-resolve-clause context clause))))) |
816 | 834 |
|
817 | 835 | (defn -q [context clauses] |
818 | 836 | (binding [*implicit-source* (get (:sources context) '$)] |
|
0 commit comments