Skip to content

Commit

Permalink
FIRST!!!
Browse files Browse the repository at this point in the history
  • Loading branch information
unknown committed Mar 16, 2012
0 parents commit 3a0f304
Show file tree
Hide file tree
Showing 6 changed files with 293 additions and 0 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
*~
12 changes: 12 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
## Description

In order to learn more about how to create databases in Datomic and write queries against them,
I created this set of scripts just to play around.

## Installation

1. Launch the Datomic Beanshell environment
2. Run the load-schema.bsh script

At this point, you can run the queries.bsh script with the set of queries already prepared there.

117 changes: 117 additions & 0 deletions src/main/script/data.dtm
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
[
{:db/id #db/id[:db.part/user -1000001],
:supplier/business-key "S1",
:supplier/name "Smith",
:supplier/status :supplier.status/twenty,
:supplier/city "London"}
{:db/id #db/id[:db.part/user -1000002],
:supplier/business-key "S2",
:supplier/name "Jones",
:supplier/status :supplier.status/ten,
:supplier/city "Paris"}
{:db/id #db/id[:db.part/user -1000003],
:supplier/business-key "S3",
:supplier/name "Blake",
:supplier/status :supplier.status/thirty,
:supplier/city "Paris"}
{:db/id #db/id[:db.part/user -1000004],
:supplier/business-key "S4",
:supplier/name "Clark",
:supplier/status :supplier.status/twenty,
:supplier/city "London"}
{:db/id #db/id[:db.part/user -1000005],
:supplier/business-key "S5",
:supplier/name "Adams",
:supplier/status :supplier.status/thirty,
:supplier/city "Athens"}

{:db/id #db/id[:db.part/user -1000011],
:part/business-key "P1",
:part/name "Nut",
:part/color :part.color/red,
:part/weight 12,
:part/city "London"}
{:db/id #db/id[:db.part/user -1000012],
:part/business-key "P2",
:part/name "Bolt",
:part/color :part.color/green,
:part/weight 17,
:part/city "Paris"}
{:db/id #db/id[:db.part/user -1000013],
:part/business-key "P3",
:part/name "Screw",
:part/color :part.color/blue,
:part/weight 17,
:part/city "Oslo"}
{:db/id #db/id[:db.part/user -1000014],
:part/business-key "P4",
:part/name "Screw",
:part/color :part.color/red,
:part/weight 14,
:part/city "London"}
{:db/id #db/id[:db.part/user -1000015],
:part/business-key "P5",
:part/name "Cam",
:part/color :part.color/blue,
:part/weight 12,
:part/city "Paris"}
{:db/id #db/id[:db.part/user -1000016],
:part/business-key "P6",
:part/name "Cog",
:part/color :part.color/red,
:part/weight 19,
:part/city "London"}

{:db/id #db/id[:db.part/user -1000101],
:supplier-part/supplier #db/id[:db.part/user -1000001],
:supplier-part/part #db/id[:db.part/user -1000011],
:supplier-part/quantity 300}
{:db/id #db/id[:db.part/user -1000102],
:supplier-part/supplier #db/id[:db.part/user -1000001],
:supplier-part/part #db/id[:db.part/user -1000012],
:supplier-part/quantity 200}
{:db/id #db/id[:db.part/user -1000103],
:supplier-part/supplier #db/id[:db.part/user -1000001],
:supplier-part/part #db/id[:db.part/user -1000013],
:supplier-part/quantity 400}
{:db/id #db/id[:db.part/user -1000104],
:supplier-part/supplier #db/id[:db.part/user -1000001],
:supplier-part/part #db/id[:db.part/user -1000014],
:supplier-part/quantity 200}
{:db/id #db/id[:db.part/user -1000105],
:supplier-part/supplier #db/id[:db.part/user -1000001],
:supplier-part/part #db/id[:db.part/user -1000015],
:supplier-part/quantity 100}
{:db/id #db/id[:db.part/user -1000106],
:supplier-part/supplier #db/id[:db.part/user -1000001],
:supplier-part/part #db/id[:db.part/user -1000016],
:supplier-part/quantity 100}

{:db/id #db/id[:db.part/user -1000107],
:supplier-part/supplier #db/id[:db.part/user -1000002],
:supplier-part/part #db/id[:db.part/user -1000011],
:supplier-part/quantity 300}
{:db/id #db/id[:db.part/user -1000108],
:supplier-part/supplier #db/id[:db.part/user -1000002],
:supplier-part/part #db/id[:db.part/user -1000012],
:supplier-part/quantity 400}

{:db/id #db/id[:db.part/user -1000109],
:supplier-part/supplier #db/id[:db.part/user -1000003],
:supplier-part/part #db/id[:db.part/user -1000012],
:supplier-part/quantity 200}

{:db/id #db/id[:db.part/user -1000110],
:supplier-part/supplier #db/id[:db.part/user -1000004],
:supplier-part/part #db/id[:db.part/user -1000012],
:supplier-part/quantity 200}
{:db/id #db/id[:db.part/user -1000111],
:supplier-part/supplier #db/id[:db.part/user -1000004],
:supplier-part/part #db/id[:db.part/user -1000014],
:supplier-part/quantity 300}
{:db/id #db/id[:db.part/user -1000112],
:supplier-part/supplier #db/id[:db.part/user -1000004],
:supplier-part/part #db/id[:db.part/user -1000015],
:supplier-part/quantity 400}
]

15 changes: 15 additions & 0 deletions src/main/script/load-schema.bsh
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
uri = "datomic:mem://supplier-parts";
Peer.createDatabase(uri);
conn = Peer.connect(uri);

void loadFromFile(String fileName) {
br = new BufferedReader(new FileReader(fileName));
tx = Util.readAll(br).get(0);
txResult = conn.transact(tx).get();
br.close();
}

loadFromFile("./schema.dtm") ;

loadFromFile("./data.dtm") ;

42 changes: 42 additions & 0 deletions src/main/script/queries.bsh
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
db = conn.db();

// TODO: Need to be able to pass in a set of attributes
// and dynamically print each one of them
void printSuppliers(Set results) {
for (Object result : results) {
supplier = db.entity(result.get(0));
System.out.println(supplier.get(":supplier/business-key") + "\t" +
supplier.get(":supplier/name") + "\t" +
supplier.get(":supplier/city"));
}
print("");
}

print("All suppliers:") ;
results = Peer.q("[:find ?s :where [?s :supplier/name]]", db) ;
printSuppliers(results);

print("Suppliers named Blake:");
results = Peer.q("[:find ?s :where [?s :supplier/name \"Blake\"]]", db) ;
printSuppliers(results);

print("Suppliers located in Paris:");
results = Peer.q("[:find ?s :where [?s :supplier/city \"Paris\"]]", db) ;
printSuppliers(results);

print("Suppliers _not_ named Clark:");
results = Peer.q("[:find ?s :where [?s :supplier/name ?n] [(!= ?n \"Clark\")]]", db) ;
printSuppliers(results);

print("Suppliers not named Clark and located in London:");
results = Peer.q("[:find ?s :where [?s :supplier/name ?n] [(!= ?n \"Clark\")] [?s :supplier/city \"London\"]] ", db) ;
printSuppliers(results);

print("Suppliers which have at least one part available:") ;
results = Peer.q("[:find ?s :where [?s :supplier/name _][_ :supplier-part/supplier ?s]]", db) ;
printSuppliers(results);

print("Suppliers who carry P4:") ;
results = Peer.q("[:find ?s :where [?s :supplier/name _][?sp :supplier-part/supplier ?s][?sp :supplier-part/part ?p][?p :part/business-key \"P4\"]]", db) ;
printSuppliers(results);

106 changes: 106 additions & 0 deletions src/main/script/schema.dtm
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
[
;; supplier

{:db/id #db/id[:db.part/db]
:db/ident :supplier/business-key
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one
:db/doc "The business key of the supplier"
:db.install/_attribute :db.part/db}

{:db/id #db/id[:db.part/db]
:db/ident :supplier/name
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one
:db/fulltext true
:db/doc "A supplier's name"
:db.install/_attribute :db.part/db}

{:db/id #db/id[:db.part/db]
:db/ident :supplier/status
:db/valueType :db.type/ref
:db/cardinality :db.cardinality/one
:db/doc "A supplier's status"
:db.install/_attribute :db.part/db}

{:db/id #db/id[:db.part/db]
:db/ident :supplier/city
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one
:db/doc "A supplier's city"
:db.install/_attribute :db.part/db}

;; supplier/status enum values

[:db/add #db/id[:db.part/user] :db/ident :supplier.status/ten]
[:db/add #db/id[:db.part/user] :db/ident :supplier.status/twenty]
[:db/add #db/id[:db.part/user] :db/ident :supplier.status/thirty]

;; parts

{:db/id #db/id[:db.part/db]
:db/ident :part/business-key
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one
:db/doc "The business key of the part"
:db.install/_attribute :db.part/db}

{:db/id #db/id[:db.part/db]
:db/ident :part/name
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one
:db/fulltext true
:db/doc "The name of the part"
:db.install/_attribute :db.part/db}

{:db/id #db/id[:db.part/db]
:db/ident :part/color
:db/valueType :db.type/ref
:db/cardinality :db.cardinality/one
:db/doc "The part's color"
:db.install/_attribute :db.part/db}

{:db/id #db/id[:db.part/db]
:db/ident :part/weight
:db/valueType :db.type/long
:db/cardinality :db.cardinality/one
:db/doc "The part's weight"
:db.install/_attribute :db.part/db}

{:db/id #db/id[:db.part/db]
:db/ident :part/city
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one
:db/doc "The city where the part is made"
:db.install/_attribute :db.part/db}

;; part/color enum values
[:db/add #db/id[:db.part/user] :db/ident :part.color/red]
[:db/add #db/id[:db.part/user] :db/ident :part.color/green]
[:db/add #db/id[:db.part/user] :db/ident :part.color/blue]

;; supplier-parts

{:db/id #db/id[:db.part/db]
:db/ident :supplier-part/supplier
:db/valueType :db.type/ref
:db/cardinality :db.cardinality/one
:db/doc "The supplier"
:db.install/_attribute :db.part/db}

{:db/id #db/id[:db.part/db]
:db/ident :supplier-part/part
:db/valueType :db.type/ref
:db/cardinality :db.cardinality/one
:db/doc "The part"
:db.install/_attribute :db.part/db}

{:db/id #db/id[:db.part/db]
:db/ident :supplier-part/quantity
:db/valueType :db.type/long
:db/cardinality :db.cardinality/one
:db/doc "The quantity of this part available from this supplier"
:db.install/_attribute :db.part/db}

]

0 comments on commit 3a0f304

Please sign in to comment.