dbgraph 0.2.9__tar.gz → 0.2.11__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 (99) hide show
  1. {dbgraph-0.2.9 → dbgraph-0.2.11}/.idea/workspace.xml +36 -19
  2. {dbgraph-0.2.9 → dbgraph-0.2.11}/PKG-INFO +1 -1
  3. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/builder/sql_graph_builder.py +26 -40
  4. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/persistent/orm_graph_persistent.py +8 -1
  5. {dbgraph-0.2.9 → dbgraph-0.2.11}/pyproject.toml +1 -1
  6. dbgraph-0.2.11/tests/idma.db +0 -0
  7. dbgraph-0.2.11/tests/integrates/test_idma_builder.py +38 -0
  8. {dbgraph-0.2.9 → dbgraph-0.2.11}/tests/units/test_orm_graph_persistent.py +3 -0
  9. {dbgraph-0.2.9 → dbgraph-0.2.11}/uv.lock +3002 -3002
  10. {dbgraph-0.2.9 → dbgraph-0.2.11}/.gitignore +0 -0
  11. {dbgraph-0.2.9 → dbgraph-0.2.11}/.idea/.gitignore +0 -0
  12. {dbgraph-0.2.9 → dbgraph-0.2.11}/.idea/codeStyles/codeStyleConfig.xml +0 -0
  13. {dbgraph-0.2.9 → dbgraph-0.2.11}/.idea/dbgraph.iml +0 -0
  14. {dbgraph-0.2.9 → dbgraph-0.2.11}/.idea/inspectionProfiles/profiles_settings.xml +0 -0
  15. {dbgraph-0.2.9 → dbgraph-0.2.11}/.idea/misc.xml +0 -0
  16. {dbgraph-0.2.9 → dbgraph-0.2.11}/.idea/modules.xml +0 -0
  17. {dbgraph-0.2.9 → dbgraph-0.2.11}/.idea/pydantic.xml +0 -0
  18. {dbgraph-0.2.9 → dbgraph-0.2.11}/.idea/vcs.xml +0 -0
  19. {dbgraph-0.2.9 → dbgraph-0.2.11}/.python-version +0 -0
  20. {dbgraph-0.2.9 → dbgraph-0.2.11}/README.md +0 -0
  21. {dbgraph-0.2.9 → dbgraph-0.2.11}/data/northwind-desc.md +0 -0
  22. {dbgraph-0.2.9 → dbgraph-0.2.11}/data/northwind-graph-import.db +0 -0
  23. {dbgraph-0.2.9 → dbgraph-0.2.11}/data/northwind-graph-v2.json +0 -0
  24. {dbgraph-0.2.9 → dbgraph-0.2.11}/data/northwind-graph-v4.json +0 -0
  25. {dbgraph-0.2.9 → dbgraph-0.2.11}/data/northwind-graph.db +0 -0
  26. {dbgraph-0.2.9 → dbgraph-0.2.11}/data/northwind-graph.json +0 -0
  27. {dbgraph-0.2.9 → dbgraph-0.2.11}/data/northwind-graph.png +0 -0
  28. {dbgraph-0.2.9 → dbgraph-0.2.11}/data/northwind-index/corpus.jsonl +0 -0
  29. {dbgraph-0.2.9 → dbgraph-0.2.11}/data/northwind-index/corpus.mmindex.json +0 -0
  30. {dbgraph-0.2.9 → dbgraph-0.2.11}/data/northwind-index/data.csc.index.npy +0 -0
  31. {dbgraph-0.2.9 → dbgraph-0.2.11}/data/northwind-index/indices.csc.index.npy +0 -0
  32. {dbgraph-0.2.9 → dbgraph-0.2.11}/data/northwind-index/indptr.csc.index.npy +0 -0
  33. {dbgraph-0.2.9 → dbgraph-0.2.11}/data/northwind-index/params.index.json +0 -0
  34. {dbgraph-0.2.9 → dbgraph-0.2.11}/data/northwind-index/vocab.index.json +0 -0
  35. {dbgraph-0.2.9 → dbgraph-0.2.11}/data/northwind-semantic-v5.json +0 -0
  36. {dbgraph-0.2.9 → dbgraph-0.2.11}/data/northwind.db +0 -0
  37. {dbgraph-0.2.9 → dbgraph-0.2.11}/data/time-results.txt +0 -0
  38. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/__init__.py +0 -0
  39. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/builder/__init__.py +0 -0
  40. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/builder/graph_builder.py +0 -0
  41. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/descriptor/__init__.py +0 -0
  42. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/descriptor/graph_descriptor.py +0 -0
  43. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/descriptor/langchain_graph_descriptor.py +0 -0
  44. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/descriptor/prompt_templates.py +0 -0
  45. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/entity/__init__.py +0 -0
  46. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/entity/aspect.py +0 -0
  47. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/entity/asset.py +0 -0
  48. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/entity/asset_type.py +0 -0
  49. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/entity/dbgraph.py +0 -0
  50. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/entity/link.py +0 -0
  51. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/entity/link_type.py +0 -0
  52. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/entity/rdbgraph.py +0 -0
  53. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/io/__init__.py +0 -0
  54. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/io/graph_loader.py +0 -0
  55. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/io/graph_writer.py +0 -0
  56. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/io/json_graph_loader.py +0 -0
  57. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/io/json_graph_writer.py +0 -0
  58. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/persistent/__init__.py +0 -0
  59. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/persistent/graph_not_found.py +0 -0
  60. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/persistent/graph_persistent.py +0 -0
  61. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/persistent/models/__init__.py +0 -0
  62. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/persistent/models/asset_aspect_orm.py +0 -0
  63. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/persistent/models/asset_orm.py +0 -0
  64. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/persistent/models/base.py +0 -0
  65. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/persistent/models/graph_orm.py +0 -0
  66. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/persistent/models/link_aspect_orm.py +0 -0
  67. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/persistent/models/link_orm.py +0 -0
  68. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/render/__init__.py +0 -0
  69. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/render/graph_renderer.py +0 -0
  70. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/render/markdown_renderer.py +0 -0
  71. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/search/__init__.py +0 -0
  72. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/search/bm25_search_engine.py +0 -0
  73. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/search/search_engine.py +0 -0
  74. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/utils/__init__.py +0 -0
  75. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/utils/logging.py +0 -0
  76. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/utils/serialize.py +0 -0
  77. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph/utils/singleton.py +0 -0
  78. {dbgraph-0.2.9 → dbgraph-0.2.11}/dbgraph.log +0 -0
  79. {dbgraph-0.2.9 → dbgraph-0.2.11}/diagrams/entity.png +0 -0
  80. {dbgraph-0.2.9 → dbgraph-0.2.11}/diagrams/entity.txt +0 -0
  81. {dbgraph-0.2.9 → dbgraph-0.2.11}/diagrams/usecase.png +0 -0
  82. {dbgraph-0.2.9 → dbgraph-0.2.11}/diagrams/usecase.txt +0 -0
  83. {dbgraph-0.2.9 → dbgraph-0.2.11}/docs/index.md +0 -0
  84. {dbgraph-0.2.9 → dbgraph-0.2.11}/docs/refs/aspect.md +0 -0
  85. {dbgraph-0.2.9 → dbgraph-0.2.11}/docs/refs/graph.md +0 -0
  86. {dbgraph-0.2.9 → dbgraph-0.2.11}/main.py +0 -0
  87. {dbgraph-0.2.9 → dbgraph-0.2.11}/mkdocs.yml +0 -0
  88. {dbgraph-0.2.9 → dbgraph-0.2.11}/tests/__init__.py +0 -0
  89. {dbgraph-0.2.9 → dbgraph-0.2.11}/tests/integrates/__init__.py +0 -0
  90. {dbgraph-0.2.9 → dbgraph-0.2.11}/tests/integrates/test_json_graph_loader.py +0 -0
  91. {dbgraph-0.2.9 → dbgraph-0.2.11}/tests/integrates/test_json_graph_writer.py +0 -0
  92. {dbgraph-0.2.9 → dbgraph-0.2.11}/tests/integrates/test_langchain_graph_descriptor.py +0 -0
  93. {dbgraph-0.2.9 → dbgraph-0.2.11}/tests/integrates/test_sql_graph_builder.py +0 -0
  94. {dbgraph-0.2.9 → dbgraph-0.2.11}/tests/integrates/test_trino_builder.py +0 -0
  95. {dbgraph-0.2.9 → dbgraph-0.2.11}/tests/units/__init__.py +0 -0
  96. {dbgraph-0.2.9 → dbgraph-0.2.11}/tests/units/dbgraph.log +0 -0
  97. {dbgraph-0.2.9 → dbgraph-0.2.11}/tests/units/test_dbgraph.py +0 -0
  98. {dbgraph-0.2.9 → dbgraph-0.2.11}/tests/units/test_markdown_renderer.py +0 -0
  99. {dbgraph-0.2.9 → dbgraph-0.2.11}/tests/units/test_rdbgraph.py +0 -0
@@ -4,13 +4,10 @@
4
4
  <option name="autoReloadType" value="SELECTIVE" />
5
5
  </component>
6
6
  <component name="ChangeListManager">
7
- <list default="true" id="263a96da-9a82-40fd-89b2-ba71dd2c194d" name="Changes" comment="update sql builder and tests">
7
+ <list default="true" id="263a96da-9a82-40fd-89b2-ba71dd2c194d" name="Changes" comment="update for sqlite">
8
+ <change afterPath="$PROJECT_DIR$/tests/integrates/test_idma_builder.py" afterDir="false" />
8
9
  <change beforePath="$PROJECT_DIR$/.idea/dbgraph.iml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/dbgraph.iml" afterDir="false" />
9
- <change beforePath="$PROJECT_DIR$/dbgraph/__init__.py" beforeDir="false" afterPath="$PROJECT_DIR$/dbgraph/__init__.py" afterDir="false" />
10
- <change beforePath="$PROJECT_DIR$/dbgraph/entity/aspect.py" beforeDir="false" afterPath="$PROJECT_DIR$/dbgraph/entity/aspect.py" afterDir="false" />
11
- <change beforePath="$PROJECT_DIR$/dbgraph/persistent/orm_graph_persistent.py" beforeDir="false" afterPath="$PROJECT_DIR$/dbgraph/persistent/orm_graph_persistent.py" afterDir="false" />
12
- <change beforePath="$PROJECT_DIR$/pyproject.toml" beforeDir="false" afterPath="$PROJECT_DIR$/pyproject.toml" afterDir="false" />
13
- <change beforePath="$PROJECT_DIR$/tests/units/test_orm_graph_persistent.py" beforeDir="false" afterPath="$PROJECT_DIR$/tests/units/test_orm_graph_persistent.py" afterDir="false" />
10
+ <change beforePath="$PROJECT_DIR$/dbgraph/builder/sql_graph_builder.py" beforeDir="false" afterPath="$PROJECT_DIR$/dbgraph/builder/sql_graph_builder.py" afterDir="false" />
14
11
  <change beforePath="$PROJECT_DIR$/uv.lock" beforeDir="false" afterPath="$PROJECT_DIR$/uv.lock" afterDir="false" />
15
12
  </list>
16
13
  <option name="SHOW_DIALOG" value="false" />
@@ -75,6 +72,7 @@
75
72
  &quot;keyToString&quot;: {
76
73
  &quot;ASKED_SHARE_PROJECT_CONFIGURATION_FILES&quot;: &quot;true&quot;,
77
74
  &quot;ModuleVcsDetector.initialDetectionPerformed&quot;: &quot;true&quot;,
75
+ &quot;Python tests.Python tests for tests.integrates.test_idma_builder.TestIDMABuilder.test_builder.executor&quot;: &quot;Run&quot;,
78
76
  &quot;Python tests.Python tests for tests.integrates.test_json_graph_loader.TestJSONGraphLoader.executor&quot;: &quot;Run&quot;,
79
77
  &quot;Python tests.Python tests for tests.integrates.test_sql_graph_builder.TestSQLGraphBuilder.executor&quot;: &quot;Run&quot;,
80
78
  &quot;Python tests.Python tests for tests.integrates.test_sql_graph_builder.TestSQLGraphBuilder.test_build_graph.executor&quot;: &quot;Run&quot;,
@@ -113,6 +111,8 @@
113
111
  &quot;Python tests.Python tests for tests.test_sql_graph_persistent.TestSQLGraphPersistent.test_link.executor&quot;: &quot;Run&quot;,
114
112
  &quot;Python tests.Python tests for tests.test_sql_graph_persistent.TestSQLGraphPersistent.test_load_graph.executor&quot;: &quot;Run&quot;,
115
113
  &quot;Python tests.Python tests for tests.test_sql_graph_persistent.TestSQLGraphPersistent.test_save_graph.executor&quot;: &quot;Run&quot;,
114
+ &quot;Python tests.Python tests for tests.units.test_dbgraph.TestDBGraph.executor&quot;: &quot;Run&quot;,
115
+ &quot;Python tests.Python tests for tests.units.test_orm_graph_persistent.TestORMGraphPersistent.test_save_load_graph.executor&quot;: &quot;Run&quot;,
116
116
  &quot;Python tests.Python tests in test_load_graph_sql.py.executor&quot;: &quot;Run&quot;,
117
117
  &quot;Python tests.Python tests in test_trino_builder.py.executor&quot;: &quot;Run&quot;,
118
118
  &quot;Python tests.Python tests in tests.executor&quot;: &quot;Run&quot;,
@@ -146,8 +146,8 @@
146
146
  <recent name="C:\Users\minhden\Projects\dbgraph\tests\units" />
147
147
  </key>
148
148
  </component>
149
- <component name="RunManager" selected="Python tests.Python tests in units">
150
- <configuration name="Python tests for tests.integrates.test_sql_graph_builder.TestSQLGraphBuilder.test_build_graph" type="tests" factoryName="Autodetect" temporary="true" nameIsGenerated="true">
149
+ <component name="RunManager" selected="Python tests.Python tests for tests.integrates.test_idma_builder.TestIDMABuilder.test_builder">
150
+ <configuration name="Python tests for tests.integrates.test_idma_builder.TestIDMABuilder.test_builder" type="tests" factoryName="Autodetect" temporary="true" nameIsGenerated="true">
151
151
  <module name="dbgraph" />
152
152
  <option name="ENV_FILES" value="" />
153
153
  <option name="INTERPRETER_OPTIONS" value="" />
@@ -160,7 +160,7 @@
160
160
  <option name="DEBUG_JUST_MY_CODE" value="false" />
161
161
  <option name="RUN_TOOL" value="" />
162
162
  <option name="_new_additionalArguments" value="&quot;&quot;" />
163
- <option name="_new_target" value="&quot;tests.integrates.test_sql_graph_builder.TestSQLGraphBuilder.test_build_graph&quot;" />
163
+ <option name="_new_target" value="&quot;tests.integrates.test_idma_builder.TestIDMABuilder.test_builder&quot;" />
164
164
  <option name="_new_targetType" value="&quot;PYTHON&quot;" />
165
165
  <method v="2" />
166
166
  </configuration>
@@ -181,7 +181,7 @@
181
181
  <option name="_new_targetType" value="&quot;PYTHON&quot;" />
182
182
  <method v="2" />
183
183
  </configuration>
184
- <configuration name="Python tests for tests.integrates.test_trino_builder.TestTrinoBuilder.test__get_table_row_count" type="tests" factoryName="Autodetect" temporary="true" nameIsGenerated="true">
184
+ <configuration name="Python tests for tests.units.test_dbgraph.TestDBGraph" type="tests" factoryName="Autodetect" temporary="true" nameIsGenerated="true">
185
185
  <module name="dbgraph" />
186
186
  <option name="ENV_FILES" value="" />
187
187
  <option name="INTERPRETER_OPTIONS" value="" />
@@ -194,11 +194,11 @@
194
194
  <option name="DEBUG_JUST_MY_CODE" value="false" />
195
195
  <option name="RUN_TOOL" value="" />
196
196
  <option name="_new_additionalArguments" value="&quot;&quot;" />
197
- <option name="_new_target" value="&quot;tests.integrates.test_trino_builder.TestTrinoBuilder.test__get_table_row_count&quot;" />
197
+ <option name="_new_target" value="&quot;tests.units.test_dbgraph.TestDBGraph&quot;" />
198
198
  <option name="_new_targetType" value="&quot;PYTHON&quot;" />
199
199
  <method v="2" />
200
200
  </configuration>
201
- <configuration name="Python tests for tests.integrates.test_trino_builder.TestTrinoBuilder.test_build_graph" type="tests" factoryName="Autodetect" temporary="true" nameIsGenerated="true">
201
+ <configuration name="Python tests for tests.units.test_orm_graph_persistent.TestORMGraphPersistent.test_save_load_graph" type="tests" factoryName="Autodetect" temporary="true" nameIsGenerated="true">
202
202
  <module name="dbgraph" />
203
203
  <option name="ENV_FILES" value="" />
204
204
  <option name="INTERPRETER_OPTIONS" value="" />
@@ -209,9 +209,9 @@
209
209
  <option name="ADD_CONTENT_ROOTS" value="true" />
210
210
  <option name="ADD_SOURCE_ROOTS" value="true" />
211
211
  <option name="DEBUG_JUST_MY_CODE" value="false" />
212
- <option name="RUN_TOOL" value="true" />
212
+ <option name="RUN_TOOL" value="" />
213
213
  <option name="_new_additionalArguments" value="&quot;&quot;" />
214
- <option name="_new_target" value="&quot;tests.integrates.test_trino_builder.TestTrinoBuilder.test_build_graph&quot;" />
214
+ <option name="_new_target" value="&quot;tests.units.test_orm_graph_persistent.TestORMGraphPersistent.test_save_load_graph&quot;" />
215
215
  <option name="_new_targetType" value="&quot;PYTHON&quot;" />
216
216
  <method v="2" />
217
217
  </configuration>
@@ -234,11 +234,11 @@
234
234
  </configuration>
235
235
  <recent_temporary>
236
236
  <list>
237
+ <item itemvalue="Python tests.Python tests for tests.integrates.test_idma_builder.TestIDMABuilder.test_builder" />
238
+ <item itemvalue="Python tests.Python tests for tests.units.test_dbgraph.TestDBGraph" />
239
+ <item itemvalue="Python tests.Python tests for tests.units.test_orm_graph_persistent.TestORMGraphPersistent.test_save_load_graph" />
237
240
  <item itemvalue="Python tests.Python tests in units" />
238
241
  <item itemvalue="Python tests.Python tests for tests.integrates.test_trino_builder.TestTrinoBuilder.test__get_table_orm" />
239
- <item itemvalue="Python tests.Python tests for tests.integrates.test_sql_graph_builder.TestSQLGraphBuilder.test_build_graph" />
240
- <item itemvalue="Python tests.Python tests for tests.integrates.test_trino_builder.TestTrinoBuilder.test__get_table_row_count" />
241
- <item itemvalue="Python tests.Python tests for tests.integrates.test_trino_builder.TestTrinoBuilder.test_build_graph" />
242
242
  </list>
243
243
  </recent_temporary>
244
244
  </component>
@@ -345,7 +345,23 @@
345
345
  <option name="project" value="LOCAL" />
346
346
  <updated>1790214726709</updated>
347
347
  </task>
348
- <option name="localTasksCounter" value="12" />
348
+ <task id="LOCAL-00012" summary="update sql builder and tests">
349
+ <option name="closed" value="true" />
350
+ <created>1790219300115</created>
351
+ <option name="number" value="00012" />
352
+ <option name="presentableId" value="LOCAL-00012" />
353
+ <option name="project" value="LOCAL" />
354
+ <updated>1790219300115</updated>
355
+ </task>
356
+ <task id="LOCAL-00013" summary="update for sqlite">
357
+ <option name="closed" value="true" />
358
+ <created>1790220216196</created>
359
+ <option name="number" value="00013" />
360
+ <option name="presentableId" value="LOCAL-00013" />
361
+ <option name="project" value="LOCAL" />
362
+ <updated>1790220216196</updated>
363
+ </task>
364
+ <option name="localTasksCounter" value="14" />
349
365
  <servers />
350
366
  </component>
351
367
  <component name="TypeScriptGeneratedFilesManager">
@@ -369,6 +385,7 @@
369
385
  <MESSAGE value="remove events" />
370
386
  <MESSAGE value="update renderer" />
371
387
  <MESSAGE value="update sql builder and tests" />
372
- <option name="LAST_COMMIT_MESSAGE" value="update sql builder and tests" />
388
+ <MESSAGE value="update for sqlite" />
389
+ <option name="LAST_COMMIT_MESSAGE" value="update for sqlite" />
373
390
  </component>
374
391
  </project>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: dbgraph
3
- Version: 0.2.9
3
+ Version: 0.2.11
4
4
  Summary: dbgraph is a database profiling tool which model the database as a graph
5
5
  Requires-Python: >=3.11
6
6
  Requires-Dist: bm25s==0.3.11
@@ -1,9 +1,6 @@
1
1
  import logging
2
- from concurrent.futures import ThreadPoolExecutor
3
2
  from dataclasses import dataclass
4
- from unittest import result
5
3
  from uuid import uuid4
6
- from tqdm import tqdm
7
4
 
8
5
  from sqlalchemy import (
9
6
  Column,
@@ -30,7 +27,7 @@ from sqlalchemy import (
30
27
  DATE,
31
28
  DATETIME,
32
29
  distinct,
33
- TIME, TIMESTAMP,
30
+ TIME, TIMESTAMP, VARBINARY,
34
31
  )
35
32
  from sqlalchemy.orm import Session
36
33
 
@@ -70,6 +67,7 @@ class SQLGraphBuilder(GraphBuilder):
70
67
  detector_sample_size: int = 200
71
68
  textual_length_threshold: int = 30
72
69
  textual_distinct_ratio_threshold: float = 0.8
70
+ run_full_statistics: bool = True
73
71
 
74
72
  def __post_init__(self):
75
73
  logger.info("Creating SQLAlchemy engine...")
@@ -202,23 +200,26 @@ class SQLGraphBuilder(GraphBuilder):
202
200
  if isinstance(
203
201
  col.type, (Numeric, Integer, SmallInteger, BigInteger, Float, DECIMAL),
204
202
  ):
205
- num_aspect = self._get_numerical_stats_aspect(col)
203
+ if self.run_full_statistics:
204
+ num_aspect = self._get_numerical_stats_aspect(col)
206
205
  elif isinstance(col.type, (String, Text, Unicode, UnicodeText, CHAR, NCHAR)):
207
206
  is_textual = self._is_column_textual(col)
208
207
  if is_textual:
209
208
  logger.debug("`%s` is textual type", col)
210
209
  cat_aspect = None
211
210
  else:
212
- cat_aspect = self._get_cat_stats_aspect(col)
211
+ if self.run_full_statistics:
212
+ cat_aspect = self._get_cat_stats_aspect(col)
213
213
  elif isinstance(col.type, (DATE, DATETIME, TIME, TIMESTAMP)):
214
- temp_aspect = self._get_temp_aspect(col)
215
- elif isinstance(col.type, (BLOB,)):
214
+ if self.run_full_statistics:
215
+ temp_aspect = self._get_temp_aspect(col)
216
+ elif isinstance(col.type, (BLOB, VARBINARY)):
216
217
  pass
217
218
  else:
218
- raise NotImplementedError(
219
- f"Only support Numeric, String, Date, and BLOB. Got {col.type} for "
220
- f"{col}",
221
- )
219
+ logger.warning(f"Only support Numeric, String, Date, and BLOB. Got {col.type} for "
220
+ f"{col}")
221
+ pass
222
+
222
223
  return RColumnStatisticsAspect(
223
224
  name=f"{col.name}_column_stats",
224
225
  numerical_stats=num_aspect,
@@ -231,21 +232,24 @@ class SQLGraphBuilder(GraphBuilder):
231
232
 
232
233
  def _make_column_asset(self, col: Column, pks: PrimaryKeyConstraint) -> Asset:
233
234
  logger.info("`%s` - building column asset...", col)
235
+ aspects = {}
234
236
  schema_aspect = RColumnSchemaAspect(
235
237
  name=f"{col.name}_column_schema",
236
238
  dtype=str(col.type),
237
239
  is_nullable=col.nullable or False,
238
240
  is_pk=col.name in [c.name for c in pks.columns],
239
241
  )
240
- stats_aspect = self._get_stats_aspect(col)
242
+ aspects["schema_properties"] = schema_aspect
243
+
244
+ if self.run_full_statistics:
245
+ stats_aspect = self._get_stats_aspect(col)
246
+ aspects["statistical_properties"] = stats_aspect
247
+
241
248
  return Asset(
242
249
  asset_id=uuid4(),
243
250
  name=col.name,
244
251
  type=AssetType.RCOLUMN,
245
- aspects={
246
- "schema_properties" : schema_aspect,
247
- "statistical_properties": stats_aspect,
248
- },
252
+ aspects=aspects,
249
253
  )
250
254
 
251
255
  def _get_columns_assets(self, table_name: str) -> list[Asset]:
@@ -255,25 +259,6 @@ class SQLGraphBuilder(GraphBuilder):
255
259
  pks = table.primary_key
256
260
  for column in table.columns:
257
261
  assets.append(self._make_column_asset(column, pks))
258
- # with ThreadPoolExecutor(max_workers=self.max_worker) as executor:
259
- # if self.use_tqdm:
260
- # assets = list(
261
- # tqdm(
262
- # executor.map(
263
- # self._make_column_asset, table.columns,
264
- # [pks] * len(table.columns),
265
- # ),
266
- # total=len(table.columns),
267
- # desc="Processing columns",
268
- # ),
269
- # )
270
- # else:
271
- # assets = list(
272
- # executor.map(
273
- # self._make_column_asset, table.columns,
274
- # [pks] * len(table.columns),
275
- # ),
276
- # )
277
262
  return assets
278
263
 
279
264
  def _get_table_stats_aspect(self, table_name: str) -> RTableStatisticsAspect:
@@ -314,16 +299,17 @@ class SQLGraphBuilder(GraphBuilder):
314
299
 
315
300
  def _make_table_asset(self, table_name: str) -> Asset:
316
301
  logger.info("`%s` - creating table asset...", table_name)
302
+ aspects = {}
303
+
317
304
  stats_aspect = self._get_table_stats_aspect(table_name)
318
305
  schema_aspect = self._get_table_schema_aspect(table_name)
306
+ aspects["schema_properties"] = schema_aspect
307
+ aspects["statistical_properties"] = stats_aspect
319
308
  table_asset = Asset(
320
309
  asset_id=uuid4(),
321
310
  name=table_name,
322
311
  type=AssetType.RTABLE,
323
- aspects={
324
- "schema_properties" : schema_aspect,
325
- "statistical_properties": stats_aspect,
326
- },
312
+ aspects=aspects,
327
313
  )
328
314
  self.columns_assets[table_asset.name] = self._get_columns_assets(table_name)
329
315
  self.tables_assets[table_asset.name] = table_asset
@@ -2,7 +2,7 @@ import json
2
2
  from dataclasses import dataclass, asdict
3
3
  from uuid import UUID
4
4
 
5
- from sqlalchemy import create_engine, select, delete, and_
5
+ from sqlalchemy import create_engine, select, delete, and_, event
6
6
  from sqlalchemy.orm import Session
7
7
 
8
8
  from dbgraph import Asset, Link, DatabaseGraph, LinkType, AssetType
@@ -35,6 +35,13 @@ class ORMGraphPersistent(GraphPersistent):
35
35
 
36
36
  def __post_init__(self):
37
37
  self.engine = create_engine(self.persistent_uri)
38
+
39
+ @event.listens_for(self.engine, "connect")
40
+ def set_sqlite_pragma(dbapi_connection, connection_record):
41
+ cursor = dbapi_connection.cursor()
42
+ cursor.execute("PRAGMA foreign_keys=ON")
43
+ cursor.close()
44
+
38
45
  Base.metadata.create_all(self.engine)
39
46
 
40
47
  def insert_graph(self, graph_id: UUID, graph_name: str):
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "dbgraph"
7
- version = "0.2.9"
7
+ version = "0.2.11"
8
8
  description = "dbgraph is a database profiling tool which model the database as a graph"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
Binary file
@@ -0,0 +1,38 @@
1
+ import logging
2
+ import unittest
3
+ from uuid import uuid4
4
+
5
+ from dbgraph import SQLGraphBuilder, ORMGraphPersistent
6
+
7
+
8
+ class TestIDMABuilder(unittest.TestCase):
9
+ @classmethod
10
+ def setUpClass(cls) -> None:
11
+
12
+ logging.basicConfig(level=logging.DEBUG)
13
+ logging.getLogger("sqlalchemy").setLevel(
14
+ logging.WARNING,
15
+ ) # ví dụ framework SQLAlchemy
16
+ logging.getLogger("urllib3").setLevel(logging.WARNING) # ví dụ requests/HTTP
17
+ logger = logging.getLogger("SQLGraphBuilder")
18
+ logger.propagate = False
19
+
20
+ def setUp(self) -> None:
21
+ self.uri = "trino://5e313dcb-78c7-4fe0-a399-83d6c55ed169:f4asulq4wluhis651wfi@67cc9102-3edf-44d7-98e8-59e824d365b4.idma.cloud:443/vnptiq_dev/genai_bronze"
22
+ self.builder = SQLGraphBuilder(
23
+ self.uri, run_full_statistics=False
24
+ )
25
+ persistent_uri = "sqlite:///tests/idma.db"
26
+ self.persistent = ORMGraphPersistent(persistent_uri)
27
+
28
+ def test_builder(self):
29
+ graph = self.builder.build_graph()
30
+ self.persistent.save_graph(
31
+ uuid4(),
32
+ "idma",
33
+ graph
34
+ )
35
+
36
+
37
+ if __name__ == "__main__":
38
+ unittest.main()
@@ -365,6 +365,9 @@ class TestORMGraphPersistent(unittest.TestCase):
365
365
  self.persistent.save_graph(target_id, "test", self.graph)
366
366
  graph = self.persistent.load_graph(target_id)
367
367
  self.assertEqual(self.graph, graph)
368
+ self.persistent.delete_graph(target_id)
369
+ assets = self.persistent.get_assets(target_id)
370
+ self.assertEqual(0, len(assets))
368
371
 
369
372
 
370
373
  if __name__ == "__main__":