Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add transact time support for schemas #223

Open
quoll opened this issue Nov 10, 2021 · 1 comment
Open

Add transact time support for schemas #223

quoll opened this issue Nov 10, 2021 · 1 comment
Labels
enhancement New feature or request

Comments

@quoll
Copy link
Contributor

quoll commented Nov 10, 2021

Asami is schema-less, but during transactions it can be useful to incorporate schema information. For instance:

(transact conn {:tx-data [{:db/ident "first" :data 1}]})
(transact conn {:tx-data [{:db/ident "first" :data 42}]
                :schema {:db/ident :data
                :db/cardinality :db/cardinality/one})

By indicating a cardinality of one, this is equivalent to using an update annotation on the :data attribute.

(entity conn "first")

{:data 42}
Without the schema, this would have resulted in:
{:data #{1 42}}

Also, data integrity can be checked:

(transact conn {:tx-data [{:db/ident "first" :data "forty-two"}]
                :schema {:db/ident :data
                         :db/valueType :db.type/long})

This would throw an ExceptionInfo, with a message like:
Attribute :data cannot accept data: "forty-two". Requires Long value.

These changes will occur in asami.entities

@quoll quoll added the enhancement New feature or request label Nov 10, 2021
@quoll
Copy link
Contributor Author

quoll commented Nov 10, 2021

A more important feature is:

(transact conn {:tx-data [{:db/ident "first" :data "forty-two" :sub {:data "sub-entity"}}])
(entity conn "first")

Result: {:data "forty-two" :sub {:data "sub-entity"}}
(This is the current behavior)

An important new database function will be :db/retractEntity, and this relies on schema:

(transact conn {:tx-data [[:db/retractEntity [:db/ident "first"]]]
                :schema {:db/ident :sub
                         :db/valueType :db.type/ref
                         :db/isComponent true}})
(entity conn "first")

Result: nil

(q '[:find [?e ...] :where [?e :data ?d]] conn)

Result: ()
(Currently, removing the top level object will still leave the "sub-entity" object alone)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

1 participant