Skip to content

query_state: el remapeo va antes del DISTINCT, y los dos colapsos se cuentan aparte - #1160

Merged
github-actions[bot] merged 3 commits into
developfrom
feat/query-state
Nov 8, 2026
Merged

github-actions[bot] merged 3 commits into
developfrom
feat/query-state

Conversation

@frapercan

Copy link
Copy Markdown
Owner

En borrador a proposito: el laboratorio pidio ver este modulo antes de que se escriba y esto es para que lea el diff, no para que se fusione. El diseno de la decima tabla va aparte, en agent-farm #418.

Los cinco puntos del laboratorio, los cinco aqui

1. El orden: remapeo, y DESPUES el DISTINCT. Una ficha se lee en el espacio de ids de SU instantanea, donde go_term.id es un subrogado por instantanea, y se reescribe en el eje declarado antes de colapsar fichas iguales. Al reves se queda corto por los dos lados: deja dos filas para un termino y declara mal los dos recuentos. El marco del eje viene de la misma instantanea que leyo axis_of, y _frame_of se niega si no tiene filas de alias, porque sin el mapa "reescrito en el eje" querria decir en silencio "sin reescribir".

2. Los dos colapsos, aparte. collapsed_by_gaf y collapsed_by_remap. Un solo numero imprimiria el mismo digito para un lote cuya duplicacion del GAF cambio y para uno cuyo mapa de sinonimos cambio, que son dos hechos distintos.

3. Los descartes, por razon. discarded_off_axis deberia ser cero mientras el eje sea la ontologia del propio corpus de la 211, y es lo primero que leer antes de fiarse de un lote. remapped_across_aspects se cuenta y no se descarta: la ontologia nombro ese sucesor.

4. El histograma de evidencia, por momento. Un extremo con trece codigos o menos lleva solo los experimentales y alguien lo estrecho. Por momento y no por lote, porque el lote lo esconde.

5. assigned_by no entra, ni en la clave ni en la consulta, y hay un test sobre el SQL para que no vuelva.

Dos cosas que salieron al cablearlo

  • _streamed devuelve el escritor y el marco juntos, para que "un escritor sin marco" no se pueda construir. Esa combinacion publicaria una tabla cuyo go_id vive en el espacio de cada instantanea, que el cargador une con nada y que no levanta nada. El None que queda es una negativa explicita y no un salto en silencio;
  • _publish tomaba siete argumentos y ahora toma el _Run, que es la misma razon por la que esa tupla existe.

Comprobado

  • ocho tests nuevos, y los dos que pinchan el orden son remap == 1, gaf == 0 para dos subrogados de un termino y gaf == 1, remap == 0 para una repeticion literal: un deduplicado unico declararia mal uno de los dos;
  • ruff, ruff format, mypy sobre 423 ficheros, check_smells, check_no_em_dashes, check_sets, check_doc_refs y check_autodoc_coverage, todos a exit 0;
  • la suite entera a exit 0, sin una sola linea FAILED, con el test de settings que es ruido conocido deseleccionado.

Los tests que cambian de sujeto cambian con el: query_state ya esta implementada, asi que el ejemplo de "declarada por el ADR y todavia sin escribir" pasa a neighbour_state, y la cuenta de tablas escritas pasa de seis a siete.

Lo que NO lleva

Una corrida. No se ejecuta hasta que el laboratorio lo vea, que es lo acordado.

…cuentan aparte

La octava tabla de las diez. El laboratorio senalo cinco cosas de la version
anterior y las cinco estan aqui.

EL ORDEN. Una ficha se lee en el espacio de ids de SU instantanea, donde
go_term.id es un subrogado por instantanea, y se reescribe en el eje declarado
ANTES de colapsar fichas iguales. Al reves se queda corto por los dos lados: deja
dos filas para un termino y declara mal los dos recuentos. El marco del eje viene
de la misma instantanea que leyo axis_of, y _frame_of se niega si no tiene filas
de alias, porque sin el mapa "reescrito en el eje" querria decir en silencio "sin
reescribir".

LOS DOS COLAPSOS, APARTE. Lo que el GAF escribio dos veces y lo que se hizo igual
al nombrarlo el eje son dos hechos distintos sobre el dato; un solo numero
imprimiria el mismo digito para un lote cuya duplicacion cambio y para uno cuyo
mapa de sinonimos cambio.

LOS DESCARTES, POR RAZON. off_axis deberia ser cero mientras el eje sea la
ontologia del propio corpus de la 211, y es lo primero que hay que leer antes de
fiarse de un lote. Cruzar de aspecto se cuenta y NO se descarta: la ontologia
nombro ese sucesor.

EL HISTOGRAMA, POR MOMENTO. Un extremo con trece codigos de evidencia o menos
lleva solo los experimentales y alguien lo estrecho. Por momento y no por lote,
porque el lote lo esconde.

Y assigned_by no entra, ni en la clave ni en la consulta. _pin_annotation_order
ordena las anotaciones de cada donante por (go_term_id, evidence_code, qualifier)
y toma el codigo de evidencia de la primera fila que casa, asi que la fuente no
se lee nunca; dentro de la clave multiplica las fichas por 1,177, medido sobre un
dieciseisavo de la release 211, que es exactamente el solape que hace al cargador
del laboratorio rechazar una tabla entera. Se queda en la base, recuperable por
la clave de la ficha.

Dos cosas mas que salieron al cablearlo:

- _streamed devuelve el escritor y el marco JUNTOS, para que "un escritor sin
  marco" no se pueda construir. Esa combinacion publicaria una tabla cuyo go_id
  vive en el espacio de cada instantanea, que el cargador une con nada y que no
  levanta nada;
- _publish tomaba siete argumentos y ahora toma el _Run, que es la misma razon por
  la que esa tupla existe.

Los tests que cambian de sujeto cambian con el: query_state ya esta implementada,
asi que el ejemplo de "declarada por el ADR y todavia sin escribir" pasa a
neighbour_state, y la cuenta de tablas escritas pasa de seis a siete.
@codecov

codecov Bot commented Nov 8, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 70.22901% with 39 lines in your changes missing coverage. Please review.
✅ Project coverage is 88.03%. Comparing base (d8bc801) to head (2143655).
⚠️ Report is 263 commits behind head on develop.

Files with missing lines Patch % Lines
...otea/core/operations/export_transitions_dataset.py 35.41% 31 Missing ⚠️
protea/core/transitions_export/_query_state.py 90.36% 8 Missing ⚠️
Additional details and impacted files

Impacted file tree graph

@@             Coverage Diff             @@
##           develop    #1160      +/-   ##
===========================================
+ Coverage    87.85%   88.03%   +0.18%     
===========================================
  Files          306      403      +97     
  Lines        23414    31302    +7888     
===========================================
+ Hits         20570    27557    +6987     
- Misses        2844     3745     +901     
Files with missing lines Coverage Δ
protea/core/transitions_export/_query_state.py 90.36% <90.36%> (ø)
...otea/core/operations/export_transitions_dataset.py 56.03% <35.41%> (ø)

... and 164 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

…idencia vacia

EL DOCSTRING CONTRADECIA AL CODIGO, que es lo que hace que alguien lea el
codigo pensando que esta mal. Decia "remap, then DISTINCT" y el codigo hace
tres pasos: un DISTINCT exacto en el espacio de ids de la propia instantanea,
que es la duplicacion del GAF; el remapeo; y un segundo DISTINCT sobre el eje,
que son dos subrogados de un termino encontrandose.

Y queda dicha la parte honesta, que el laboratorio puso mejor que yo: las filas
serian las mismas en cualquier orden, porque el remapeo es una FUNCION sobre
fichas. Lo que compra el orden no son filas, es que los dos colapsos sean
ATRIBUIBLES. Un solo DISTINCT al final daria la tabla correcta y un numero
ilegible.

UNA FICHA SIN CODIGO DE EVIDENCIA se descarta y se cuenta, en vez de entrar
como "" dentro del histograma. `evidence_code` es NULLABLE en el esquema, asi
que la rama es alcanzable aunque el dato vivo no la tome: los ocho codigos mas
frecuentes de una muestra de la 211 son todos reales. Dejarla pasar como ""
habria puesto una clase de evidencia vacia en el histograma, y el cargador del
laboratorio la descarta como desconocida con solo su propio contador para
mostrarlo. Asi se ve de este lado antes de llegar al otro.

Es la misma rama que la nota de las "doce de doce": el defecto que sobrevive a
todas las puertas esta en el camino que ninguna fila ejercita.
@frapercan
frapercan marked this pull request as ready for review November 8, 2026 15:07
@github-actions
github-actions Bot merged commit c9e9fa1 into develop Nov 8, 2026
22 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant