Transactable entities
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Aptitud para principiantes
- 35/100
Línea de trabajo
El issue apunta a datascript.db/entid en db.cljc y datascript.impl.entity/Entity; empieza leyendo esas rutas de transacción y Associative. Aclara qué semánticas de entity-as-ref y assoc se aceptan, y después define una cobertura que demuestre que las entidades anidadas se transaccionan correctamente y que las actualizaciones producen los datos de transacción previstos.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
This is a backwards compatible change that would vastly improve DX in my opinion
I've always wondered: why are entities not transactable? I find myself converting entities to maps all the time solely to transact them. This still causes problems when entities nest other entities. So here are a few simple ideas on how entities could be treated in transactions:
1. Entities could be treated as refs in transactions
(def schema
{:user/friends #:db{:valueType :db.type/ref
:cardinality :db.cardinality/many}})
(def ent (d/touch (d/entity @conn 1)))
ent ; eval
;; =>
{:db/id 1
:user/email "foo@example.com"
:user/friends #{{:db/id 2} {:db/id 3}}} ; <-- nested entities
Now I convert it to a map
(def ent-map (into {:db/id (:db/id ent)} ent))
ent-map ; eval
;; =>
{:db/id 1
:user/email "foo@example.com"
:user/friends #{{:db/id 2} {:db/id 3}}}
;; looks the same but nested entities (under :user/friends) have not been converted
I try to transact it
(d/transact! conn [(assoc ent-map :user/email "BAR@example.com")])
;; throws:
;; Execution error (ExceptionInfo) at datascript.db/entid (db.cljc:385).
;; Expected number or lookup ref for entity id, got #:db{:id 2}
So I can either dissoc the :user/friends map-entry or convert contained entities to refs
(d/transact! conn [(-> ent-map
(dissoc :genstyle.project/population)
;; OR (update :user/friends #(mapv :db/id %))
(assoc :user/email "BAR@example.com"))])
We could spare ourselves from this by treating entities as refs in transactions. The database already walks nested data-structures to resolve refs so why not resolve entities as refs, also?
2. Entities to return maps on update
datascript.impl.entity/Entity implements clojure.lang.Associative which currently only throws errors:
clojure.lang.Associative
;; some methods elided
(empty [e] (throw (UnsupportedOperationException.)))
(assoc [e k v] (throw (UnsupportedOperationException.)))
(cons [e [k v]] (throw (UnsupportedOperationException.)))
Instead assoc could return a hashmap
(deftype Entity [db eid touched cache]
;; elided
clojure.lang.Associative
(assoc [e k v]
(let [e-map (cond-> {:db/id eid}
; add other kvals if touched
touched (into e))]
(assoc e-map k v))))
This would also make update possible. Together this means that the change of email to ent from above, could look like this:
(d/transact! conn [(assoc ent :user/email "BAR@example.com")])
I would've already implemented this for my own projects but unfortunately Clojure (unlike ClojureScript) doesn't allow to overwrite a Type's methods. To achieve this one would have to for DataScript and change the code of datascript.impl.entity/Entity so I wanted to raise the issue here first and see what @tonsky's thoughts are.
This would also unlock a more straightforward use of libraries like meander or specter to walk and update entities.
- Lenguaje dominante
- Clojure
- Estrellas
- 5.8k
- Forks
- 318
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Guía de contribución
No hay ninguna guía de contribución indexada para este repositorio
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de tonsky/datascript
-
Dificultad 4/5 3-5 días Aptitud para principiantes 42/100
tonsky/datascript#498 · 1 comentario ·
-
Datascript MCP Server Abierto
Dificultad 5/5 Más de una semana Aptitud para principiantes 10/100
tonsky/datascript#489 ·
-
Stack overflow when transacting :db.type/tupleAttrs with a :db.type/ref attr through :db.fn/call Abierto
Dificultad 4/5 3-5 días Aptitud para principiantes 35/100
tonsky/datascript#483 · 2 comentarios ·
-
Dificultad 4/5 3-5 días Aptitud para principiantes 35/100
tonsky/datascript#470 · 1 comentario ·
-
Dificultad 4/5 3-5 días Aptitud para principiantes 35/100
tonsky/datascript#441 · 1 comentario · 3 reacciones ·
Todos los issues de tonsky/datascript
Issues similares
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 90/100
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 88/100
-
.Team/Metabot Priority:P3
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
-
needs triage
Dificultad 1/5 Menos de una hora Aptitud para principiantes 90/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
scalar-labs/scalar-jepsen#222 · 1 comentario ·