diff --git a/src/wanijo/infrastructure/repl.clj b/src/wanijo/infrastructure/repl.clj index 40d0419..10a83ef 100644 --- a/src/wanijo/infrastructure/repl.clj +++ b/src/wanijo/infrastructure/repl.clj @@ -1,10 +1,9 @@ (ns wanijo.infrastructure.repl (:require [buddy.hashers :as hashers] - [neo4j-clj.core :as db] [wanijo.infrastructure.neo4j :as neo4j] [wanijo.main :as main])) -(db/defquery create-user +(neo4j/defquery create-user "CREATE (n:user) SET n.ident = {ident} SET n.pw = {pw} @@ -17,7 +16,7 @@ :pw (hashers/derive pw) :uuid (neo4j/uuid)})) -(db/defquery merge-config +(neo4j/defquery merge-config "MERGE (c:dbconfig) ON CREATE SET c.installed_at = {now}, @@ -27,38 +26,38 @@ c.last_migration = {now}, c.db_version = {version}") -(db/defquery config +(neo4j/defquery config "MATCH (c:dbconfig) RETURN c") -(db/defquery ver-0-schema-uuid +(neo4j/defquery ver-0-schema-uuid "CREATE CONSTRAINT ON (n:schema) ASSERT n.uuid IS UNIQUE") -(db/defquery ver-0-attribute-uuid +(neo4j/defquery ver-0-attribute-uuid "CREATE CONSTRAINT ON (n:attribute) ASSERT n.uuid IS UNIQUE") -(db/defquery ver-0-instance-uuid +(neo4j/defquery ver-0-instance-uuid "CREATE CONSTRAINT ON (n:instance) ASSERT n.uuid IS UNIQUE") -(db/defquery ver-0-property-uuid +(neo4j/defquery ver-0-property-uuid "CREATE CONSTRAINT ON (n:property) ASSERT n.uuid IS UNIQUE") -(db/defquery ver-0-user-uuid +(neo4j/defquery ver-0-user-uuid "CREATE CONSTRAINT ON (n:user) ASSERT n.uuid IS UNIQUE") -(db/defquery ver-0-link-uuid +(neo4j/defquery ver-0-link-uuid "CREATE CONSTRAINT ON (n:link) ASSERT n.uuid IS UNIQUE") -(db/defquery ver-1-tag-name +(neo4j/defquery ver-1-tag-name "CREATE CONSTRAINT ON (n:tag) ASSERT n.name IS UNIQUE") -(db/defquery ver-1-tag-uuid +(neo4j/defquery ver-1-tag-uuid "CREATE CONSTRAINT ON (n:tag) ASSERT n.uuid IS UNIQUE") @@ -74,9 +73,23 @@ (neo4j/exec-query! ver-1-tag-name {}) (neo4j/exec-query! ver-1-tag-uuid {})) +(neo4j/defquery migrate-links + "MATCH (i1:instance)-[:link_from]-(l:link)-[:link_to]-(i2:instance), + (l)-[cb:created_by]->(:user) + MERGE (i1)-[newl:link]->(i2) + ON CREATE SET + newl.name = l.name, + newl.created_at = l.created_at, + newl.uuid = l.uuid + DELETE cb, lf, lt, l") + +(defn init-version-2 [] + (neo4j/exec-query! migrate-links {})) + (def migrations [init-version-0 - init-version-1]) + init-version-1 + init-version-2]) (defn run-migrations! [] (neo4j/exec-query! merge-config {:now (neo4j/now-str) diff --git a/src/wanijo/instance/db.clj b/src/wanijo/instance/db.clj index 6dba364..f9ba9bf 100644 --- a/src/wanijo/instance/db.clj +++ b/src/wanijo/instance/db.clj @@ -141,18 +141,12 @@ OPTIONAL MATCH (p:property)-[pc:of]->(i), (p)-[pac:of]->(a:attribute) - OPTIONAL MATCH - (i)<-[lt1:link_to]-(ltn:link)-[lt2:link_from]->(), - (ltn)-[ltcb:created_by]->() - OPTIONAL MATCH - (i)<-[lf1:link_from]-(lfn:link)-[lf2:link_to]->(), - (lfn)-[lfcb:created_by]->() OPTIONAL MATCH (i)-[tw:tagged_with]->() + OPTIONAL MATCH + (i)-[l:link]-() DELETE pac, pc, cb, ic, p, - lt1, lt2, ltn, ltcb, - lf1, lf2, lfn, lfcb, - tw, i") + l, tw, i") (defn delete! [uuid] (neo4j/exec-query! delete {:uuid uuid})) @@ -171,8 +165,7 @@ (neo4j/defquery outgoing-links "MATCH (inst:instance {uuid:{uuid}}), - (inst)<-[:link_from]-(link:link), - (link)-[:link_to]->(target:instance), + (inst)-[link:link]->(target:instance), (target)-[:of]->(schema:schema) OPTIONAL MATCH (target)-[:tagged_with]->(tag:tag) @@ -183,8 +176,7 @@ (neo4j/defquery incoming-links "MATCH (inst:instance {uuid:{uuid}}), - (inst)<-[:link_to]-(link:link), - (link)-[:link_from]->(source:instance), + (inst)<-[link:link]-(source:instance), (source)-[:of]->(schema:schema) OPTIONAL MATCH (source)-[:tagged_with]->(tag:tag) diff --git a/src/wanijo/link/db.clj b/src/wanijo/link/db.clj index a9ae1de..9b5ca2a 100644 --- a/src/wanijo/link/db.clj +++ b/src/wanijo/link/db.clj @@ -10,30 +10,28 @@ (neo4j/defquery create "MATCH (i:instance {uuid:{from}}), - (u:user {uuid:{by}}), (t:instance {uuid:{target}}) - CREATE - (l:link {uuid:{uuid}})-[:created_by]->(u) - SET l.created_at = {created_at}, - l.name = {name} - CREATE - (i)<-[:link_from]-(l)-[:link_to]->(t)") -(defn create! [link] + CREATE (i)-[l:link]->(t) + SET l.created_at = {created_at}, + l.name = {name}, + l.created_by = {by}, + l.uuid = {uuid}") +(defn create! [{:keys [from name to by]}] (let [tuples (map (fn [target-uuid] [create - {:from (:from link) - :by (:by link) + {:from from + :by by :target target-uuid :uuid (neo4j/uuid) :created_at (neo4j/now-str) - :name (:name link)}]) - (:to link))] + :name name}]) + to)] (apply neo4j/exec-queries! tuples))) (neo4j/defquery delete - "MATCH (l:link {uuid:{uuid}}), - (l)-[r]-() - DELETE r, l") + "MATCH (:instance)-[l:link]-(:instance) + WHERE l.uuid = {uuid} + DELETE l") (defn delete! [uuid] (neo4j/exec-query! delete {:uuid uuid})) diff --git a/src/wanijo/public/db.clj b/src/wanijo/public/db.clj index 4106f2a..d55430a 100644 --- a/src/wanijo/public/db.clj +++ b/src/wanijo/public/db.clj @@ -36,11 +36,11 @@ "MATCH (coc:instance {uuid:{coc_uuid}}), (rschema:schema {uuid:{roleschema_uuid}}), (role:instance)-[:of]->(rschema), - (coc)--(:link)--(role) + (coc)-[:link]->(role) OPTIONAL MATCH (lschema:schema {uuid:{levelschema_uuid}}), (level:instance)-[:of]->(lschema), - (role)--(:link)-->(level) + (role)-[:link]->(level) RETURN role, level") (defn roles-with-levels-of-coc! [coc-key] (->> (neo4j/exec-query! roles-with-levels-of-coc @@ -102,11 +102,11 @@ "MATCH (level:instance {uuid:{level_uuid}}), (mschema:schema {uuid:{moduleschema_uuid}}), (module:instance)-[:of]->(mschema), - (level)--(:link)--(module) + (level)-[:link]->(module) OPTIONAL MATCH (cschema:schema {uuid:{compschema_uuid}}), (comp:instance)-[:of]->(cschema), - (module)--(:link)--(comp) + (module)-[:link]-(comp) RETURN module, comp") (defn modules-with-comps! [level-uuid] (->> (neo4j/exec-query! modules-with-comps @@ -132,10 +132,10 @@ "MATCH (role:instance {uuid:{role_uuid}}), (lschema:schema {uuid:{levelschema_uuid}}), (level:instance)-[:of]->(lschema), - (role)--(:link)--(level), + (role)-[:link]->(level), (mschema:schema {uuid:{moduleschema_uuid}}), (module:instance)-[:of]->(mschema), - (level)--(:link)--(module) + (level)-[:link]->(module) RETURN module, level ORDER BY CASE WHEN level.name =~ \".*Foundation.*\" THEN @@ -165,7 +165,7 @@ "MATCH (module:instance {uuid:{uuid}}), (cschema:schema {uuid:{compschema_uuid}}), (comp:instance)-[:of]->(cschema), - (module)--(:link)--(comp) + (module)-[:link]->(comp) RETURN comp ORDER BY comp.name") (defn module! [uuid] diff --git a/src/wanijo/visualisation/db.clj b/src/wanijo/visualisation/db.clj index 514812c..ccf0cfd 100644 --- a/src/wanijo/visualisation/db.clj +++ b/src/wanijo/visualisation/db.clj @@ -19,7 +19,7 @@ "MATCH (source:instance)-[:of]->(schema:schema) OPTIONAL MATCH - (source)<-[:link_from]-(link:link)-[:link_to]->(target:instance), + (source)-[link:link]->(target:instance), (target)-[:of]->(target_schema:schema) RETURN source, schema, link, target, target_schema") (defn all-instance-connections! []