Transaction / Indexing bug
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 35/100
Línea de trabajo
Empieza ejecutando la reproducción mostrada en el issue con d/db-with, d/touch y el índice :aevt. Traza cómo se procesa durante la transacción un mapa que contiene :foo/relations y referencias inversas. Se considera terminado cuando db-with-foo-backwards conserva foo3 y sus datoms de relación, y tocar las entidades relacionadas ya no provoca una aserción sobre entity?.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
In a transaction where a map has refs and reverse-ref attributes, the ref attributes are thrown away.
This works:
(require '[datascript.core :as d])
(def db
(d/empty-db
{:foo/id {:db/unique :db.unique/identity}
:foo/relations {:db/valueType :db.type/ref
:db/cardinality :db.cardinality/many}}))
(def db-with-foo
(d/db-with
db
[{:foo/id "foo1"
:foo/relations [{:foo/id "foo2"}
{:foo/id "foo3"}]}]))
(comment
(d/touch (d/entity db-with-foo [:foo/id "foo3"]))
; works!
; => {:foo/id "foo3", :db/id 3}
)
This fails for :foo/relations [{:foo/id "foo3"}] but works for the reverse :foo/_relations:
(def db-with-foo-backwards
(d/db-with
db
[{:foo/id "foo2"
:foo/_relations [{:foo/id "foo1" :foo/relations [{:foo/id "foo3"}]}]}]))
(comment
(d/touch (d/entity db-with-foo-backwards [:foo/id "foo3"]))
; errors!
; => #object[Error Error: Assert failed: (entity? e)]
; relation between "foo1" and "foo2" exists
(d/touch (d/entity db-with-foo-backwards [:foo/id "foo1"]))
; => {:foo/id "foo1", :foo/relations #{#:db{:id 1}}, :db/id 2}
)
Looking at the indexes of either DB we see that the relations and datoms are missing in db-with-foo-backwards:
(comment
(:aevt db-with-foo)
; =>
;#{#datascript/Datom[1 :foo/id "foo1" 536870913 true]
; #datascript/Datom[2 :foo/id "foo2" 536870913 true]
; #datascript/Datom[3 :foo/id "foo3" 536870913 true] ; <-- foo3 exists!
; #datascript/Datom[1 :foo/relations 2 536870913 true]
; #datascript/Datom[1 :foo/relations 3 536870913 true]}
)
(comment
(:aevt db-with-foo-backwards)
; =>
;#{#datascript/Datom[1 :foo/id "foo2" 536870913 true]
; #datascript/Datom[2 :foo/id "foo1" 536870913 true] ; <-- foo3 and relations missing!
; #datascript/Datom[2 :foo/relations 1 536870913 true]}
)
- 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 ·