sdmxlib 0.35.1__tar.gz → 0.35.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/PKG-INFO +1 -1
  2. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/pyproject.toml +1 -1
  3. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/storage/writers.py +25 -10
  4. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/README.md +0 -0
  5. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/__init__.py +0 -0
  6. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/_duckdb.py +0 -0
  7. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/api/__init__.py +0 -0
  8. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/api/client.py +0 -0
  9. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/api/federated.py +0 -0
  10. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/api/filters.py +0 -0
  11. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/api/policy.py +0 -0
  12. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/api/providers.py +0 -0
  13. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/api/query.py +0 -0
  14. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/api/registry.py +0 -0
  15. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/api/session.py +0 -0
  16. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/catalog.py +0 -0
  17. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/data_store.py +0 -0
  18. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/formats/__init__.py +0 -0
  19. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/formats/sdmx_csv/__init__.py +0 -0
  20. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/formats/sdmx_csv/reader.py +0 -0
  21. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/formats/sdmx_csv/writer.py +0 -0
  22. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/formats/sdmx_json/__init__.py +0 -0
  23. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/formats/sdmx_json/metadata.py +0 -0
  24. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/formats/sdmx_json/reader.py +0 -0
  25. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/formats/sdmx_json/writer.py +0 -0
  26. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/formats/sdmx_ml/__init__.py +0 -0
  27. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/formats/sdmx_ml/_common.py +0 -0
  28. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/formats/sdmx_ml21/__init__.py +0 -0
  29. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/formats/sdmx_ml21/namespaces.py +0 -0
  30. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/formats/sdmx_ml21/reader.py +0 -0
  31. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/formats/sdmx_ml21/writer.py +0 -0
  32. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/formats/sdmx_ml30/__init__.py +0 -0
  33. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/formats/sdmx_ml30/metadata.py +0 -0
  34. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/formats/sdmx_ml30/namespaces.py +0 -0
  35. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/formats/sdmx_ml30/reader.py +0 -0
  36. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/formats/sdmx_ml30/writer.py +0 -0
  37. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/formats/sdmx_ml31/__init__.py +0 -0
  38. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/formats/sdmx_ml31/namespaces.py +0 -0
  39. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/formats/sdmx_ml31/reader.py +0 -0
  40. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/formats/sdmx_ml31/writer.py +0 -0
  41. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/local/__init__.py +0 -0
  42. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/local/data_store.py +0 -0
  43. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/local/registry.py +0 -0
  44. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/model/__init__.py +0 -0
  45. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/model/annotations.py +0 -0
  46. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/model/base.py +0 -0
  47. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/model/binding.py +0 -0
  48. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/model/category.py +0 -0
  49. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/model/code_query.py +0 -0
  50. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/model/codelist.py +0 -0
  51. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/model/collections.py +0 -0
  52. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/model/concept.py +0 -0
  53. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/model/constraint.py +0 -0
  54. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/model/convert.py +0 -0
  55. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/model/dataflow.py +0 -0
  56. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/model/dataset.py +0 -0
  57. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/model/datastructure.py +0 -0
  58. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/model/expr.py +0 -0
  59. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/model/hierarchy.py +0 -0
  60. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/model/hierarchy_query.py +0 -0
  61. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/model/in_memory_registry.py +0 -0
  62. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/model/istring.py +0 -0
  63. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/model/mapping.py +0 -0
  64. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/model/message.py +0 -0
  65. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/model/metadataflow.py +0 -0
  66. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/model/metadataset.py +0 -0
  67. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/model/metadatastructure.py +0 -0
  68. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/model/organisation.py +0 -0
  69. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/model/provision.py +0 -0
  70. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/model/ref.py +0 -0
  71. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/model/registry.py +0 -0
  72. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/model/representation.py +0 -0
  73. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/model/urn.py +0 -0
  74. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/model/validation.py +0 -0
  75. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/polars.py +0 -0
  76. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/py.typed +0 -0
  77. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/rest.py +0 -0
  78. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/sql.py +0 -0
  79. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/storage/__init__.py +0 -0
  80. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/storage/_kinds.py +0 -0
  81. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/storage/lazy.py +0 -0
  82. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/storage/readers.py +0 -0
  83. {sdmxlib-0.35.1 → sdmxlib-0.35.2}/src/sdmxlib/storage/schema.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: sdmxlib
3
- Version: 0.35.1
3
+ Version: 0.35.2
4
4
  Summary: SDMX structural metadata library for Python
5
5
  Keywords: sdmx,statistics,metadata,datastructure
6
6
  Author: gabrielgellner
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sdmxlib"
3
- version = "0.35.1"
3
+ version = "0.35.2"
4
4
  description = "SDMX structural metadata library for Python"
5
5
  readme = "README.md"
6
6
  license = { text = "Apache-2.0" }
@@ -294,16 +294,31 @@ def _put_refs(
294
294
  """
295
295
  if not refs:
296
296
  return
297
- # executemany lets DuckDB amortize the PK index check across the
298
- # batch collapses ~2M individual INSERTs on StatCan-shape bundles
299
- # (issue #139) into one statement bind/execute cycle.
300
- conn.executemany(
301
- """
302
- INSERT INTO artefact_ref (source_urn, target_urn, role, ordinal)
303
- VALUES (?, ?, ?, ?)
304
- ON CONFLICT (source_urn, target_urn, role) DO NOTHING
305
- """,
306
- refs,
297
+ # Arrow columnar bulk insert. The 0.35.0 executemany rewrite assumed
298
+ # DuckDB would amortise the ON CONFLICT PK lookup across the batch;
299
+ # the v0.35.1 instrumentation showed it doesn't — per-row cost on a
300
+ # 295k-edge hierarchy was 11.5 ms (issue #146 / #140). The Arrow
301
+ # path inserts the whole batch in one SELECT and never pays the
302
+ # per-row index lookup.
303
+ #
304
+ # ON CONFLICT is dropped: within one ``_put_refs`` call, source_urn
305
+ # is constant (one artefact's outgoing edges) and
306
+ # ``_delete_artefact_cascade`` has already cleared this artefact's
307
+ # prior rows, so no PK collision is possible across calls. Intra-
308
+ # call duplicates (a DSD referencing the same Codelist via two
309
+ # dimensions) are dedup'd here in Python, keeping the first ordinal
310
+ # seen — same set-semantics behaviour the ON CONFLICT clause used to
311
+ # give. The ordinal on this table is only a positional hint; the
312
+ # canonical per-dimension position lives in ``dsd_component``.
313
+ seen: dict[tuple[str, str, str], int | None] = {}
314
+ for src, tgt, role, ordinal in refs:
315
+ seen.setdefault((src, tgt, role), ordinal)
316
+ rows: list[list[Any]] = [[src, tgt, role, ordinal] for (src, tgt, role), ordinal in seen.items()]
317
+ _execute_bulk_insert(
318
+ conn,
319
+ "artefact_ref",
320
+ ["source_urn", "target_urn", "role", "ordinal"],
321
+ rows,
307
322
  )
308
323
 
309
324
 
File without changes
File without changes
File without changes
File without changes
File without changes