cognite-neat 0.123.2__py3-none-any.whl → 0.127.30__py3-none-any.whl

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 (333) hide show
  1. cognite/neat/__init__.py +2 -2
  2. cognite/neat/_client/__init__.py +4 -0
  3. cognite/neat/_client/api.py +8 -0
  4. cognite/neat/_client/client.py +21 -0
  5. cognite/neat/_client/config.py +40 -0
  6. cognite/neat/_client/containers_api.py +125 -0
  7. cognite/neat/_client/data_classes.py +44 -0
  8. cognite/neat/_client/data_model_api.py +115 -0
  9. cognite/neat/_client/spaces_api.py +115 -0
  10. cognite/neat/_client/statistics_api.py +24 -0
  11. cognite/neat/_client/views_api.py +129 -0
  12. cognite/neat/_config.py +185 -0
  13. cognite/neat/_data_model/_analysis.py +196 -0
  14. cognite/neat/_data_model/_constants.py +67 -0
  15. cognite/neat/_data_model/_identifiers.py +61 -0
  16. cognite/neat/_data_model/_shared.py +41 -0
  17. cognite/neat/_data_model/deployer/_differ.py +140 -0
  18. cognite/neat/_data_model/deployer/_differ_container.py +360 -0
  19. cognite/neat/_data_model/deployer/_differ_data_model.py +54 -0
  20. cognite/neat/_data_model/deployer/_differ_space.py +9 -0
  21. cognite/neat/_data_model/deployer/_differ_view.py +299 -0
  22. cognite/neat/_data_model/deployer/data_classes.py +529 -0
  23. cognite/neat/_data_model/deployer/deployer.py +401 -0
  24. cognite/neat/_data_model/exporters/__init__.py +15 -0
  25. cognite/neat/_data_model/exporters/_api_exporter.py +37 -0
  26. cognite/neat/_data_model/exporters/_base.py +24 -0
  27. cognite/neat/_data_model/exporters/_table_exporter/exporter.py +128 -0
  28. cognite/neat/_data_model/exporters/_table_exporter/workbook.py +409 -0
  29. cognite/neat/_data_model/exporters/_table_exporter/writer.py +421 -0
  30. cognite/neat/_data_model/importers/__init__.py +5 -0
  31. cognite/neat/_data_model/importers/_api_importer.py +166 -0
  32. cognite/neat/_data_model/importers/_base.py +16 -0
  33. cognite/neat/_data_model/importers/_table_importer/data_classes.py +295 -0
  34. cognite/neat/_data_model/importers/_table_importer/importer.py +192 -0
  35. cognite/neat/_data_model/importers/_table_importer/reader.py +1063 -0
  36. cognite/neat/_data_model/importers/_table_importer/source.py +94 -0
  37. cognite/neat/_data_model/models/conceptual/_base.py +18 -0
  38. cognite/neat/_data_model/models/conceptual/_concept.py +67 -0
  39. cognite/neat/_data_model/models/conceptual/_data_model.py +51 -0
  40. cognite/neat/_data_model/models/conceptual/_properties.py +104 -0
  41. cognite/neat/_data_model/models/conceptual/_property.py +105 -0
  42. cognite/neat/_data_model/models/dms/__init__.py +206 -0
  43. cognite/neat/_data_model/models/dms/_base.py +31 -0
  44. cognite/neat/_data_model/models/dms/_constants.py +48 -0
  45. cognite/neat/_data_model/models/dms/_constraints.py +42 -0
  46. cognite/neat/_data_model/models/dms/_container.py +159 -0
  47. cognite/neat/_data_model/models/dms/_data_model.py +95 -0
  48. cognite/neat/_data_model/models/dms/_data_types.py +195 -0
  49. cognite/neat/_data_model/models/dms/_http.py +28 -0
  50. cognite/neat/_data_model/models/dms/_indexes.py +30 -0
  51. cognite/neat/_data_model/models/dms/_limits.py +96 -0
  52. cognite/neat/_data_model/models/dms/_references.py +135 -0
  53. cognite/neat/_data_model/models/dms/_schema.py +18 -0
  54. cognite/neat/_data_model/models/dms/_space.py +48 -0
  55. cognite/neat/_data_model/models/dms/_types.py +17 -0
  56. cognite/neat/_data_model/models/dms/_view_filter.py +282 -0
  57. cognite/neat/_data_model/models/dms/_view_property.py +235 -0
  58. cognite/neat/_data_model/models/dms/_views.py +210 -0
  59. cognite/neat/_data_model/models/entities/__init__.py +50 -0
  60. cognite/neat/_data_model/models/entities/_base.py +101 -0
  61. cognite/neat/_data_model/models/entities/_constants.py +22 -0
  62. cognite/neat/_data_model/models/entities/_data_types.py +144 -0
  63. cognite/neat/_data_model/models/entities/_identifiers.py +61 -0
  64. cognite/neat/_data_model/models/entities/_parser.py +226 -0
  65. cognite/neat/_data_model/validation/dms/__init__.py +75 -0
  66. cognite/neat/_data_model/validation/dms/_ai_readiness.py +364 -0
  67. cognite/neat/_data_model/validation/dms/_base.py +307 -0
  68. cognite/neat/_data_model/validation/dms/_connections.py +638 -0
  69. cognite/neat/_data_model/validation/dms/_consistency.py +57 -0
  70. cognite/neat/_data_model/validation/dms/_containers.py +174 -0
  71. cognite/neat/_data_model/validation/dms/_limits.py +420 -0
  72. cognite/neat/_data_model/validation/dms/_orchestrator.py +222 -0
  73. cognite/neat/_data_model/validation/dms/_views.py +103 -0
  74. cognite/neat/_exceptions.py +56 -0
  75. cognite/neat/_issues.py +68 -0
  76. cognite/neat/_session/__init__.py +3 -0
  77. cognite/neat/_session/_html/_render.py +30 -0
  78. cognite/neat/_session/_html/static/__init__.py +8 -0
  79. cognite/neat/_session/_html/static/deployment.css +303 -0
  80. cognite/neat/_session/_html/static/deployment.js +150 -0
  81. cognite/neat/_session/_html/static/issues.css +211 -0
  82. cognite/neat/_session/_html/static/issues.js +168 -0
  83. cognite/neat/_session/_html/static/shared.css +186 -0
  84. cognite/neat/_session/_html/templates/__init__.py +4 -0
  85. cognite/neat/_session/_html/templates/deployment.html +75 -0
  86. cognite/neat/_session/_html/templates/issues.html +45 -0
  87. cognite/neat/_session/_issues.py +81 -0
  88. cognite/neat/_session/_opt.py +35 -0
  89. cognite/neat/_session/_physical.py +261 -0
  90. cognite/neat/_session/_result.py +236 -0
  91. cognite/neat/_session/_session.py +88 -0
  92. cognite/neat/_session/_usage_analytics/__init__.py +0 -0
  93. cognite/neat/_session/_usage_analytics/_collector.py +131 -0
  94. cognite/neat/_session/_usage_analytics/_constants.py +23 -0
  95. cognite/neat/_session/_usage_analytics/_storage.py +240 -0
  96. cognite/neat/_session/_wrappers.py +82 -0
  97. cognite/neat/_state_machine/__init__.py +10 -0
  98. cognite/neat/_state_machine/_base.py +37 -0
  99. cognite/neat/_state_machine/_states.py +52 -0
  100. cognite/neat/_store/__init__.py +3 -0
  101. cognite/neat/_store/_provenance.py +81 -0
  102. cognite/neat/_store/_store.py +156 -0
  103. cognite/neat/_utils/__init__.py +0 -0
  104. cognite/neat/_utils/_reader.py +194 -0
  105. cognite/neat/_utils/auxiliary.py +39 -0
  106. cognite/neat/_utils/collection.py +11 -0
  107. cognite/neat/_utils/http_client/__init__.py +39 -0
  108. cognite/neat/_utils/http_client/_client.py +245 -0
  109. cognite/neat/_utils/http_client/_config.py +19 -0
  110. cognite/neat/_utils/http_client/_data_classes.py +294 -0
  111. cognite/neat/_utils/http_client/_tracker.py +31 -0
  112. cognite/neat/_utils/text.py +71 -0
  113. cognite/neat/_utils/useful_types.py +37 -0
  114. cognite/neat/_utils/validation.py +154 -0
  115. cognite/neat/_version.py +1 -1
  116. cognite/neat/v0/__init__.py +0 -0
  117. cognite/neat/v0/core/__init__.py +0 -0
  118. cognite/neat/v0/core/_client/_api/__init__.py +0 -0
  119. cognite/neat/{core → v0/core}/_client/_api/data_modeling_loaders.py +86 -7
  120. cognite/neat/{core → v0/core}/_client/_api/neat_instances.py +5 -5
  121. cognite/neat/{core → v0/core}/_client/_api/schema.py +5 -5
  122. cognite/neat/{core → v0/core}/_client/_api/statistics.py +3 -3
  123. cognite/neat/{core → v0/core}/_client/_api_client.py +1 -1
  124. cognite/neat/v0/core/_client/data_classes/__init__.py +0 -0
  125. cognite/neat/{core → v0/core}/_client/data_classes/schema.py +4 -4
  126. cognite/neat/{core → v0/core}/_client/testing.py +1 -1
  127. cognite/neat/{core → v0/core}/_constants.py +10 -3
  128. cognite/neat/v0/core/_data_model/__init__.py +0 -0
  129. cognite/neat/{core → v0/core}/_data_model/_constants.py +9 -6
  130. cognite/neat/{core → v0/core}/_data_model/_shared.py +5 -5
  131. cognite/neat/{core → v0/core}/_data_model/analysis/_base.py +12 -8
  132. cognite/neat/{core → v0/core}/_data_model/exporters/__init__.py +1 -2
  133. cognite/neat/{core → v0/core}/_data_model/exporters/_base.py +7 -7
  134. cognite/neat/{core → v0/core}/_data_model/exporters/_data_model2dms.py +9 -9
  135. cognite/neat/{core → v0/core}/_data_model/exporters/_data_model2excel.py +13 -13
  136. cognite/neat/{core → v0/core}/_data_model/exporters/_data_model2instance_template.py +4 -4
  137. cognite/neat/{core/_data_model/exporters/_data_model2ontology.py → v0/core/_data_model/exporters/_data_model2semantic_model.py} +126 -133
  138. cognite/neat/{core → v0/core}/_data_model/exporters/_data_model2yaml.py +1 -1
  139. cognite/neat/{core → v0/core}/_data_model/importers/__init__.py +4 -6
  140. cognite/neat/{core → v0/core}/_data_model/importers/_base.py +5 -5
  141. cognite/neat/{core → v0/core}/_data_model/importers/_base_file_reader.py +2 -2
  142. cognite/neat/{core → v0/core}/_data_model/importers/_dict2data_model.py +6 -6
  143. cognite/neat/{core → v0/core}/_data_model/importers/_dms2data_model.py +19 -16
  144. cognite/neat/v0/core/_data_model/importers/_graph2data_model.py +299 -0
  145. cognite/neat/v0/core/_data_model/importers/_rdf/__init__.py +4 -0
  146. cognite/neat/{core → v0/core}/_data_model/importers/_rdf/_base.py +13 -13
  147. cognite/neat/{core → v0/core}/_data_model/importers/_rdf/_inference2rdata_model.py +14 -14
  148. cognite/neat/v0/core/_data_model/importers/_rdf/_owl2data_model.py +144 -0
  149. cognite/neat/v0/core/_data_model/importers/_rdf/_shared.py +255 -0
  150. cognite/neat/{core → v0/core}/_data_model/importers/_spreadsheet2data_model.py +94 -13
  151. cognite/neat/{core → v0/core}/_data_model/models/__init__.py +3 -3
  152. cognite/neat/{core → v0/core}/_data_model/models/_base_verified.py +5 -5
  153. cognite/neat/v0/core/_data_model/models/_import_contexts.py +82 -0
  154. cognite/neat/{core → v0/core}/_data_model/models/_types.py +5 -5
  155. cognite/neat/{core → v0/core}/_data_model/models/conceptual/_unverified.py +18 -12
  156. cognite/neat/v0/core/_data_model/models/conceptual/_validation.py +308 -0
  157. cognite/neat/{core → v0/core}/_data_model/models/conceptual/_verified.py +13 -11
  158. cognite/neat/{core → v0/core}/_data_model/models/data_types.py +14 -4
  159. cognite/neat/{core → v0/core}/_data_model/models/entities/__init__.py +6 -0
  160. cognite/neat/v0/core/_data_model/models/entities/_loaders.py +155 -0
  161. cognite/neat/{core → v0/core}/_data_model/models/entities/_multi_value.py +2 -2
  162. cognite/neat/v0/core/_data_model/models/entities/_restrictions.py +230 -0
  163. cognite/neat/{core → v0/core}/_data_model/models/entities/_single_value.py +121 -16
  164. cognite/neat/{core → v0/core}/_data_model/models/entities/_types.py +10 -0
  165. cognite/neat/{core → v0/core}/_data_model/models/mapping/_classic2core.py +5 -5
  166. cognite/neat/{core → v0/core}/_data_model/models/physical/__init__.py +1 -1
  167. cognite/neat/{core → v0/core}/_data_model/models/physical/_exporter.py +28 -21
  168. cognite/neat/{core → v0/core}/_data_model/models/physical/_unverified.py +141 -38
  169. cognite/neat/{core → v0/core}/_data_model/models/physical/_validation.py +190 -24
  170. cognite/neat/{core → v0/core}/_data_model/models/physical/_verified.py +135 -15
  171. cognite/neat/{core → v0/core}/_data_model/transformers/__init__.py +2 -0
  172. cognite/neat/{core → v0/core}/_data_model/transformers/_base.py +4 -4
  173. cognite/neat/{core → v0/core}/_data_model/transformers/_converters.py +39 -32
  174. cognite/neat/{core → v0/core}/_data_model/transformers/_mapping.py +7 -7
  175. cognite/neat/v0/core/_data_model/transformers/_union_conceptual.py +208 -0
  176. cognite/neat/{core → v0/core}/_data_model/transformers/_verification.py +7 -7
  177. cognite/neat/v0/core/_instances/__init__.py +0 -0
  178. cognite/neat/{core → v0/core}/_instances/_tracking/base.py +1 -1
  179. cognite/neat/{core → v0/core}/_instances/_tracking/log.py +1 -1
  180. cognite/neat/{core → v0/core}/_instances/extractors/__init__.py +1 -1
  181. cognite/neat/{core → v0/core}/_instances/extractors/_base.py +6 -6
  182. cognite/neat/v0/core/_instances/extractors/_classic_cdf/__init__.py +0 -0
  183. cognite/neat/{core → v0/core}/_instances/extractors/_classic_cdf/_base.py +7 -7
  184. cognite/neat/{core → v0/core}/_instances/extractors/_classic_cdf/_classic.py +12 -12
  185. cognite/neat/{core → v0/core}/_instances/extractors/_classic_cdf/_relationships.py +3 -3
  186. cognite/neat/{core → v0/core}/_instances/extractors/_classic_cdf/_sequences.py +2 -2
  187. cognite/neat/{core → v0/core}/_instances/extractors/_dict.py +6 -3
  188. cognite/neat/{core → v0/core}/_instances/extractors/_dms.py +6 -6
  189. cognite/neat/{core → v0/core}/_instances/extractors/_dms_graph.py +11 -11
  190. cognite/neat/{core → v0/core}/_instances/extractors/_mock_graph_generator.py +10 -10
  191. cognite/neat/{core → v0/core}/_instances/extractors/_raw.py +3 -3
  192. cognite/neat/{core → v0/core}/_instances/extractors/_rdf_file.py +7 -7
  193. cognite/neat/{core → v0/core}/_instances/loaders/_base.py +5 -5
  194. cognite/neat/{core → v0/core}/_instances/loaders/_rdf2dms.py +17 -17
  195. cognite/neat/{core → v0/core}/_instances/loaders/_rdf_to_instance_space.py +11 -11
  196. cognite/neat/{core → v0/core}/_instances/queries/_select.py +29 -3
  197. cognite/neat/{core → v0/core}/_instances/queries/_update.py +1 -1
  198. cognite/neat/{core → v0/core}/_instances/transformers/_base.py +4 -4
  199. cognite/neat/{core → v0/core}/_instances/transformers/_classic_cdf.py +6 -6
  200. cognite/neat/{core → v0/core}/_instances/transformers/_prune_graph.py +4 -4
  201. cognite/neat/{core → v0/core}/_instances/transformers/_rdfpath.py +1 -1
  202. cognite/neat/{core → v0/core}/_instances/transformers/_value_type.py +4 -4
  203. cognite/neat/{core → v0/core}/_issues/_base.py +11 -6
  204. cognite/neat/{core → v0/core}/_issues/_contextmanagers.py +8 -6
  205. cognite/neat/{core → v0/core}/_issues/_factory.py +11 -8
  206. cognite/neat/{core → v0/core}/_issues/errors/__init__.py +3 -1
  207. cognite/neat/{core → v0/core}/_issues/errors/_external.py +1 -1
  208. cognite/neat/{core → v0/core}/_issues/errors/_general.py +1 -1
  209. cognite/neat/{core → v0/core}/_issues/errors/_properties.py +12 -1
  210. cognite/neat/{core → v0/core}/_issues/errors/_resources.py +2 -2
  211. cognite/neat/{core → v0/core}/_issues/errors/_wrapper.py +7 -3
  212. cognite/neat/{core → v0/core}/_issues/warnings/__init__.py +5 -1
  213. cognite/neat/{core → v0/core}/_issues/warnings/_external.py +1 -1
  214. cognite/neat/{core → v0/core}/_issues/warnings/_general.py +1 -1
  215. cognite/neat/{core → v0/core}/_issues/warnings/_models.py +39 -4
  216. cognite/neat/{core → v0/core}/_issues/warnings/_properties.py +13 -2
  217. cognite/neat/{core → v0/core}/_issues/warnings/_resources.py +1 -1
  218. cognite/neat/{core → v0/core}/_issues/warnings/user_modeling.py +1 -1
  219. cognite/neat/{core → v0/core}/_store/_data_model.py +13 -12
  220. cognite/neat/{core → v0/core}/_store/_instance.py +45 -12
  221. cognite/neat/{core → v0/core}/_store/_provenance.py +3 -3
  222. cognite/neat/{core → v0/core}/_store/exceptions.py +4 -4
  223. cognite/neat/v0/core/_utils/__init__.py +0 -0
  224. cognite/neat/{core → v0/core}/_utils/auth.py +1 -1
  225. cognite/neat/{core → v0/core}/_utils/auxiliary.py +7 -1
  226. cognite/neat/{core → v0/core}/_utils/collection_.py +2 -2
  227. cognite/neat/{core → v0/core}/_utils/graph_transformations_report.py +1 -1
  228. cognite/neat/{core → v0/core}/_utils/rdf_.py +38 -14
  229. cognite/neat/{core → v0/core}/_utils/reader/_base.py +1 -1
  230. cognite/neat/{core → v0/core}/_utils/spreadsheet.py +22 -4
  231. cognite/neat/v0/core/_utils/tarjan.py +44 -0
  232. cognite/neat/{core → v0/core}/_utils/text.py +1 -1
  233. cognite/neat/{core → v0/core}/_utils/upload.py +3 -3
  234. cognite/neat/v0/plugins/__init__.py +4 -0
  235. cognite/neat/v0/plugins/_base.py +9 -0
  236. cognite/neat/v0/plugins/_data_model.py +48 -0
  237. cognite/neat/{plugins → v0/plugins}/_issues.py +1 -1
  238. cognite/neat/{plugins → v0/plugins}/_manager.py +7 -16
  239. cognite/neat/{session → v0/session}/_base.py +13 -10
  240. cognite/neat/{session → v0/session}/_collector.py +1 -1
  241. cognite/neat/v0/session/_diff.py +51 -0
  242. cognite/neat/{session → v0/session}/_drop.py +3 -3
  243. cognite/neat/{session → v0/session}/_explore.py +2 -2
  244. cognite/neat/{session → v0/session}/_fix.py +2 -2
  245. cognite/neat/{session → v0/session}/_inspect.py +3 -3
  246. cognite/neat/{session → v0/session}/_mapping.py +3 -3
  247. cognite/neat/{session → v0/session}/_plugin.py +4 -5
  248. cognite/neat/{session → v0/session}/_prepare.py +8 -8
  249. cognite/neat/{session → v0/session}/_read.py +33 -43
  250. cognite/neat/{session → v0/session}/_set.py +8 -8
  251. cognite/neat/{session → v0/session}/_show.py +5 -5
  252. cognite/neat/{session → v0/session}/_state.py +22 -8
  253. cognite/neat/{session → v0/session}/_subset.py +4 -4
  254. cognite/neat/{session → v0/session}/_template.py +11 -11
  255. cognite/neat/{session → v0/session}/_to.py +12 -12
  256. cognite/neat/{session → v0/session}/_wizard.py +1 -1
  257. cognite/neat/{session → v0/session}/engine/_load.py +1 -1
  258. cognite/neat/{session → v0/session}/exceptions.py +5 -5
  259. cognite/neat/v1.py +3 -0
  260. {cognite_neat-0.123.2.dist-info → cognite_neat-0.127.30.dist-info}/METADATA +9 -8
  261. cognite_neat-0.127.30.dist-info/RECORD +319 -0
  262. {cognite_neat-0.123.2.dist-info → cognite_neat-0.127.30.dist-info}/WHEEL +1 -1
  263. cognite/neat/core/_data_model/importers/_dtdl2data_model/__init__.py +0 -3
  264. cognite/neat/core/_data_model/importers/_dtdl2data_model/_unit_lookup.py +0 -224
  265. cognite/neat/core/_data_model/importers/_dtdl2data_model/dtdl_converter.py +0 -320
  266. cognite/neat/core/_data_model/importers/_dtdl2data_model/dtdl_importer.py +0 -155
  267. cognite/neat/core/_data_model/importers/_dtdl2data_model/spec.py +0 -363
  268. cognite/neat/core/_data_model/importers/_rdf/__init__.py +0 -5
  269. cognite/neat/core/_data_model/importers/_rdf/_imf2data_model.py +0 -98
  270. cognite/neat/core/_data_model/importers/_rdf/_owl2data_model.py +0 -87
  271. cognite/neat/core/_data_model/importers/_rdf/_shared.py +0 -168
  272. cognite/neat/core/_data_model/models/conceptual/_validation.py +0 -294
  273. cognite/neat/core/_data_model/models/entities/_loaders.py +0 -75
  274. cognite/neat/plugins/__init__.py +0 -3
  275. cognite/neat/plugins/data_model/importers/__init__.py +0 -5
  276. cognite/neat/plugins/data_model/importers/_base.py +0 -28
  277. cognite_neat-0.123.2.dist-info/RECORD +0 -197
  278. /cognite/neat/{core → _data_model}/__init__.py +0 -0
  279. /cognite/neat/{core/_client/_api → _data_model/deployer}/__init__.py +0 -0
  280. /cognite/neat/{core/_client/data_classes → _data_model/exporters/_table_exporter}/__init__.py +0 -0
  281. /cognite/neat/{core/_data_model → _data_model/importers/_table_importer}/__init__.py +0 -0
  282. /cognite/neat/{core/_instances → _data_model/models}/__init__.py +0 -0
  283. /cognite/neat/{core/_instances/extractors/_classic_cdf → _data_model/models/conceptual}/__init__.py +0 -0
  284. /cognite/neat/{core/_utils → _data_model/validation}/__init__.py +0 -0
  285. /cognite/neat/{plugins/data_model → _session/_html}/__init__.py +0 -0
  286. /cognite/neat/{core → v0/core}/_client/__init__.py +0 -0
  287. /cognite/neat/{core → v0/core}/_client/data_classes/data_modeling.py +0 -0
  288. /cognite/neat/{core → v0/core}/_client/data_classes/neat_sequence.py +0 -0
  289. /cognite/neat/{core → v0/core}/_client/data_classes/statistics.py +0 -0
  290. /cognite/neat/{core → v0/core}/_config.py +0 -0
  291. /cognite/neat/{core → v0/core}/_data_model/analysis/__init__.py +0 -0
  292. /cognite/neat/{core → v0/core}/_data_model/catalog/__init__.py +0 -0
  293. /cognite/neat/{core → v0/core}/_data_model/catalog/classic_model.xlsx +0 -0
  294. /cognite/neat/{core → v0/core}/_data_model/catalog/conceptual-imf-data-model.xlsx +0 -0
  295. /cognite/neat/{core → v0/core}/_data_model/catalog/hello_world_pump.xlsx +0 -0
  296. /cognite/neat/{core → v0/core}/_data_model/models/_base_unverified.py +0 -0
  297. /cognite/neat/{core → v0/core}/_data_model/models/conceptual/__init__.py +0 -0
  298. /cognite/neat/{core → v0/core}/_data_model/models/entities/_constants.py +0 -0
  299. /cognite/neat/{core → v0/core}/_data_model/models/entities/_wrapped.py +0 -0
  300. /cognite/neat/{core → v0/core}/_data_model/models/mapping/__init__.py +0 -0
  301. /cognite/neat/{core → v0/core}/_data_model/models/mapping/_classic2core.yaml +0 -0
  302. /cognite/neat/{core → v0/core}/_instances/_shared.py +0 -0
  303. /cognite/neat/{core → v0/core}/_instances/_tracking/__init__.py +0 -0
  304. /cognite/neat/{core → v0/core}/_instances/examples/Knowledge-Graph-Nordic44-dirty.xml +0 -0
  305. /cognite/neat/{core → v0/core}/_instances/examples/Knowledge-Graph-Nordic44.xml +0 -0
  306. /cognite/neat/{core → v0/core}/_instances/examples/__init__.py +0 -0
  307. /cognite/neat/{core → v0/core}/_instances/examples/skos-capturing-sheet-wind-topics.xlsx +0 -0
  308. /cognite/neat/{core → v0/core}/_instances/extractors/_classic_cdf/_assets.py +0 -0
  309. /cognite/neat/{core → v0/core}/_instances/extractors/_classic_cdf/_data_sets.py +0 -0
  310. /cognite/neat/{core → v0/core}/_instances/extractors/_classic_cdf/_events.py +0 -0
  311. /cognite/neat/{core → v0/core}/_instances/extractors/_classic_cdf/_files.py +0 -0
  312. /cognite/neat/{core → v0/core}/_instances/extractors/_classic_cdf/_labels.py +0 -0
  313. /cognite/neat/{core → v0/core}/_instances/extractors/_classic_cdf/_timeseries.py +0 -0
  314. /cognite/neat/{core → v0/core}/_instances/loaders/__init__.py +0 -0
  315. /cognite/neat/{core → v0/core}/_instances/queries/__init__.py +0 -0
  316. /cognite/neat/{core → v0/core}/_instances/queries/_base.py +0 -0
  317. /cognite/neat/{core → v0/core}/_instances/queries/_queries.py +0 -0
  318. /cognite/neat/{core → v0/core}/_instances/transformers/__init__.py +0 -0
  319. /cognite/neat/{core → v0/core}/_issues/__init__.py +0 -0
  320. /cognite/neat/{core → v0/core}/_issues/formatters.py +0 -0
  321. /cognite/neat/{core → v0/core}/_shared.py +0 -0
  322. /cognite/neat/{core → v0/core}/_store/__init__.py +0 -0
  323. /cognite/neat/{core → v0/core}/_utils/io_.py +0 -0
  324. /cognite/neat/{core → v0/core}/_utils/reader/__init__.py +0 -0
  325. /cognite/neat/{core → v0/core}/_utils/time_.py +0 -0
  326. /cognite/neat/{core → v0/core}/_utils/xml_.py +0 -0
  327. /cognite/neat/{session → v0/session}/__init__.py +0 -0
  328. /cognite/neat/{session → v0/session}/_experimental.py +0 -0
  329. /cognite/neat/{session → v0/session}/_state/README.md +0 -0
  330. /cognite/neat/{session → v0/session}/engine/__init__.py +0 -0
  331. /cognite/neat/{session → v0/session}/engine/_import.py +0 -0
  332. /cognite/neat/{session → v0/session}/engine/_interface.py +0 -0
  333. {cognite_neat-0.123.2.dist-info → cognite_neat-0.127.30.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,174 @@
1
+ """Validators for checking containers in the data model."""
2
+
3
+ from pyparsing import cast
4
+
5
+ from cognite.neat._data_model.models.dms._constraints import Constraint, RequiresConstraintDefinition
6
+ from cognite.neat._data_model.models.dms._view_property import ViewCorePropertyRequest
7
+ from cognite.neat._data_model.validation.dms._base import DataModelValidator
8
+ from cognite.neat._issues import ConsistencyError
9
+
10
+ BASE_CODE = "NEAT-DMS-CONTAINER"
11
+
12
+
13
+ class ExternalContainerDoesNotExist(DataModelValidator):
14
+ """
15
+ Validates that any container referenced by a view property, when the
16
+ referenced container does not belong to the data model's space, exists in CDF.
17
+
18
+ ## What it does
19
+ For each view property that maps to a container in a different space than the data model,
20
+ this validator checks that the referenced external container exists in CDF.
21
+
22
+ ## Why is this bad?
23
+ If a view property references a container that does not exist in CDF,
24
+ the data model cannot be deployed. The affected view property will not function, and the
25
+ deployment of the entire data model will fail.
26
+
27
+ ## Example
28
+ View `my_space:WindTurbine` has a property `location` that maps to container
29
+ `other_space:WindTurbineContainer`, where `other_space` differs from `my_space`. If that
30
+ container does not exist in CDF, the model cannot be deployed.
31
+ """
32
+
33
+ code = f"{BASE_CODE}-001"
34
+ issue_type = ConsistencyError
35
+
36
+ def run(self) -> list[ConsistencyError]:
37
+ errors: list[ConsistencyError] = []
38
+
39
+ for view_ref, view in self.merged_views.items():
40
+ for property_ref, property_ in view.properties.items():
41
+ if not isinstance(property_, ViewCorePropertyRequest):
42
+ continue
43
+
44
+ if property_.container.space == self.local_resources.data_model_reference.space:
45
+ continue
46
+
47
+ # Check existence of container in CDF
48
+ if property_.container not in self.cdf_resources.containers_by_reference:
49
+ errors.append(
50
+ ConsistencyError(
51
+ message=(
52
+ f"View {view_ref!s} property {property_ref!s} maps to "
53
+ f"external container {property_.container!s} which does not exist in CDF."
54
+ ),
55
+ fix="Define necessary container in CDF",
56
+ code=self.code,
57
+ )
58
+ )
59
+
60
+ return errors
61
+
62
+
63
+ class ExternalContainerPropertyDoesNotExist(DataModelValidator):
64
+ """
65
+ Validates that any container property referenced by a view property, when the
66
+ referenced container does not belong to the data model's space, exists in CDF.
67
+
68
+ ## What it does
69
+ For each view property that maps to a container in a different space than the data model,
70
+ this validator checks that the referenced container property exists in that external container in CDF.
71
+ This validator only runs if the external container exists in CDF.
72
+
73
+ ## Why is this bad?
74
+ If a view property references a container property that does not exist in CDF,
75
+ the data model cannot be deployed. The affected view property will not function, and the
76
+ deployment of the entire data model will fail.
77
+
78
+ ## Example
79
+ View `my_space:WindTurbine` has a property `location` that maps to container property
80
+ `gpsCoordinates` in `other_space:WindTurbineContainer`. If `gpsCoordinates` does not exist
81
+ in that container in CDF, deployment will fail.
82
+ """
83
+
84
+ code = f"{BASE_CODE}-002"
85
+ issue_type = ConsistencyError
86
+
87
+ def run(self) -> list[ConsistencyError]:
88
+ errors: list[ConsistencyError] = []
89
+
90
+ for view_ref, view in self.merged_views.items():
91
+ for property_ref, property_ in view.properties.items():
92
+ if not isinstance(property_, ViewCorePropertyRequest):
93
+ continue
94
+
95
+ if property_.container.space == self.local_resources.data_model_reference.space:
96
+ continue
97
+
98
+ # Only check property if container exists in CDF
99
+ # this check is done in ExternalContainerDoesNotExist
100
+ if property_.container not in self.cdf_resources.containers_by_reference:
101
+ continue
102
+
103
+ # Check existence of container property in CDF
104
+ if (
105
+ property_.container_property_identifier
106
+ not in self.cdf_resources.containers_by_reference[property_.container].properties
107
+ ):
108
+ errors.append(
109
+ ConsistencyError(
110
+ message=(
111
+ f"View {view_ref!s} property {property_ref!s} maps to "
112
+ f"external container {property_.container!s} which does not have "
113
+ f"property '{property_.container_property_identifier}' in CDF."
114
+ ),
115
+ fix="Define necessary container property in CDF",
116
+ code=self.code,
117
+ )
118
+ )
119
+
120
+ return errors
121
+
122
+
123
+ class RequiredContainerDoesNotExist(DataModelValidator):
124
+ """
125
+ Validates that any container required by another container exists in the data model.
126
+
127
+ ## What it does
128
+ For each container in the data model, this validator checks that any container it
129
+ requires (via requires constraints) exists either in the data model or in CDF.
130
+
131
+ ## Why is this bad?
132
+ If a container requires another container that does not exist in the data model or in CDF,
133
+ the data model cannot be deployed. The affected container will not function, and
134
+ the deployment of the entire data model will fail.
135
+
136
+ ## Example
137
+ Container `windy_space:WindTurbineContainer` has a constraint requiring `windy_space:LocationContainer`.
138
+ If `windy_space:LocationContainer` does not exist in the data model or in CDF, deployment will fail.
139
+ """
140
+
141
+ code = f"{BASE_CODE}-003"
142
+ issue_type = ConsistencyError
143
+
144
+ def run(self) -> list[ConsistencyError]:
145
+ errors: list[ConsistencyError] = []
146
+
147
+ for container_ref, container in self.local_resources.containers_by_reference.items():
148
+ if not container.constraints:
149
+ continue
150
+
151
+ for external_id, constraint in cast(dict[str, Constraint], container.constraints).items():
152
+ if not isinstance(constraint, RequiresConstraintDefinition):
153
+ continue
154
+
155
+ is_local = constraint.require.space == self.local_resources.data_model_reference.space
156
+ container_exists = (
157
+ constraint.require in self.merged_containers
158
+ if is_local
159
+ else constraint.require in self.cdf_resources.containers_by_reference
160
+ )
161
+
162
+ if not container_exists:
163
+ errors.append(
164
+ ConsistencyError(
165
+ message=(
166
+ f"Container '{container_ref!s}' constraint '{external_id}' requires container "
167
+ f"'{constraint.require!s}' which does not exist."
168
+ ),
169
+ fix="Define necessary container in the data model",
170
+ code=self.code,
171
+ )
172
+ )
173
+
174
+ return errors
@@ -0,0 +1,420 @@
1
+ """Validators for checking if defined data model is within CDF DMS schema limits."""
2
+
3
+ from typing import Literal
4
+
5
+ from cognite.neat._data_model.models.dms._container import ContainerRequest
6
+ from cognite.neat._data_model.models.dms._data_types import EnumProperty, ListablePropertyTypeDefinition
7
+ from cognite.neat._data_model.models.dms._indexes import BtreeIndex, InvertedIndex
8
+ from cognite.neat._data_model.models.dms._limits import SchemaLimits
9
+ from cognite.neat._data_model.models.dms._view_property import (
10
+ ViewCorePropertyRequest,
11
+ )
12
+ from cognite.neat._data_model.validation.dms._base import (
13
+ CDFResources,
14
+ DataModelValidator,
15
+ LocalResources,
16
+ )
17
+ from cognite.neat._issues import ConsistencyError
18
+ from cognite.neat._utils.useful_types import ModusOperandi
19
+
20
+ BASE_CODE = "NEAT-DMS-LIMITS"
21
+
22
+
23
+ class DataModelViewCountIsOutOfLimits(DataModelValidator):
24
+ """Validates that the data model does not exceed the maximum number of views.
25
+
26
+ ## What it does
27
+ This validator checks that the total number of views referenced by the data model
28
+ does not exceed the limit defined in the CDF project.
29
+
30
+ ## Why is this bad?
31
+ CDF enforces limits on the number of views per data model to ensure optimal performance
32
+ and resource utilization.
33
+
34
+ ## Example
35
+ If the CDF project has a limit of 100 views per data model, and the data model
36
+ references 120 views, this validator will raise a ConsistencyError issue.
37
+
38
+ """
39
+
40
+ code = f"{BASE_CODE}-DATA-MODEL-001"
41
+ issue_type = ConsistencyError
42
+
43
+ def __init__(
44
+ self,
45
+ local_resources: LocalResources,
46
+ cdf_resources: CDFResources,
47
+ limits: SchemaLimits,
48
+ modus_operandi: ModusOperandi = "additive",
49
+ ) -> None:
50
+ super().__init__(local_resources, cdf_resources, modus_operandi)
51
+ self.limits = limits
52
+
53
+ def run(self) -> list[ConsistencyError]:
54
+ if len(self.data_model_view_references) > self.limits.data_models.views:
55
+ return [
56
+ ConsistencyError(
57
+ message=(
58
+ f"The data model references {len(self.data_model_view_references)} views, "
59
+ "which exceeds the limit of "
60
+ f"{self.limits.data_models.views} views per data model."
61
+ ),
62
+ code=self.code,
63
+ )
64
+ ]
65
+ return []
66
+
67
+
68
+ ### View level limits
69
+
70
+
71
+ class ViewPropertyCountIsOutOfLimits(DataModelValidator):
72
+ """Validates that a view does not exceed the maximum number of properties.
73
+
74
+ ## What it does
75
+ Checks that the view has no more properties than the CDF limit allows.
76
+
77
+ ## Why is this bad?
78
+ CDF enforces limits on the number of properties per view to ensure optimal performance.
79
+
80
+ ## Example
81
+ If a view has 150 properties and the CDF limit is 100 properties per view,
82
+ this validator will raise a ConsistencyError issue.
83
+ """
84
+
85
+ code = f"{BASE_CODE}-VIEW-001"
86
+ issue_type = ConsistencyError
87
+
88
+ def __init__(
89
+ self,
90
+ local_resources: LocalResources,
91
+ cdf_resources: CDFResources,
92
+ limits: SchemaLimits,
93
+ modus_operandi: ModusOperandi = "additive",
94
+ ) -> None:
95
+ super().__init__(local_resources, cdf_resources, modus_operandi)
96
+ self.limits = limits
97
+
98
+ def run(self) -> list[ConsistencyError]:
99
+ errors: list[ConsistencyError] = []
100
+ merged_views = self.merged_views
101
+
102
+ for view_ref in self.local_resources.views_by_reference.keys():
103
+ view = merged_views.get(view_ref)
104
+ if not view:
105
+ raise RuntimeError(f"View {view_ref!s} not found in merged views. This is a bug!")
106
+
107
+ if view.properties and len(view.properties) > self.limits.views.properties:
108
+ errors.append(
109
+ ConsistencyError(
110
+ message=(
111
+ f"View {view.as_reference()!s} has {len(view.properties)} properties,"
112
+ " which exceeds the limit of "
113
+ f"{self.limits.views.properties} properties per view."
114
+ ),
115
+ code=self.code,
116
+ )
117
+ )
118
+
119
+ elif not view.properties:
120
+ errors.append(
121
+ ConsistencyError(
122
+ message=(
123
+ f"View {view_ref!s} does "
124
+ "not have any properties defined, either directly or through implements."
125
+ ),
126
+ fix="Define at least one property for view",
127
+ code=self.code,
128
+ )
129
+ )
130
+
131
+ return errors
132
+
133
+
134
+ class ViewContainerCountIsOutOfLimits(DataModelValidator):
135
+ """Validates that a view does not reference too many containers.
136
+
137
+ ## What it does
138
+ Checks that the view references no more containers than the CDF limit allows.
139
+
140
+ ## Why is this bad?
141
+ CDF enforces limits on the number of containers per view to prevent overly complex view definitions, leading
142
+ to too many joins and performance degradation.
143
+
144
+ ## Example
145
+ If a view references 20 containers and the CDF limit is 10 containers per view,
146
+ this validator will raise a ConsistencyError issue.
147
+ """
148
+
149
+ code = f"{BASE_CODE}-VIEW-002"
150
+ issue_type = ConsistencyError
151
+
152
+ def __init__(
153
+ self,
154
+ local_resources: LocalResources,
155
+ cdf_resources: CDFResources,
156
+ limits: SchemaLimits,
157
+ modus_operandi: ModusOperandi = "additive",
158
+ ) -> None:
159
+ super().__init__(local_resources, cdf_resources, modus_operandi)
160
+ self.limits = limits
161
+
162
+ def run(self) -> list[ConsistencyError]:
163
+ errors: list[ConsistencyError] = []
164
+ merged_views = self.merged_views
165
+
166
+ # Single loop over all views
167
+ for view_ref in self.local_resources.views_by_reference.keys():
168
+ view = merged_views.get(view_ref)
169
+ if not view:
170
+ raise RuntimeError(f"View {view_ref!s} not found in merged views. This is a bug!")
171
+
172
+ if view.properties:
173
+ count = len(
174
+ {
175
+ prop.container
176
+ for prop in view.properties.values()
177
+ if (isinstance(prop, ViewCorePropertyRequest) and prop.container)
178
+ }
179
+ )
180
+ if count > self.limits.views.containers:
181
+ errors.append(
182
+ ConsistencyError(
183
+ message=(
184
+ f"View {view_ref!s} references "
185
+ f"{count} containers, which exceeds the limit of "
186
+ f"{self.limits.views.containers} containers per view."
187
+ ),
188
+ code=self.code,
189
+ )
190
+ )
191
+
192
+ return errors
193
+
194
+
195
+ class ViewImplementsCountIsOutOfLimits(DataModelValidator):
196
+ """Validates that a view does not implement too many other views.
197
+
198
+ ## What it does
199
+ Checks that the view implements no more views than the CDF limit allows.
200
+
201
+ ## Why is this bad?
202
+ CDF enforces limits on the number of implemented views to prevent overly deep inheritance hierarchies.
203
+
204
+ ## Example
205
+ If a view implements 15 other views and the CDF limit is 10 implemented views per view,
206
+ this validator will raise a ConsistencyError issue.
207
+ """
208
+
209
+ code = f"{BASE_CODE}-VIEW-003"
210
+ issue_type = ConsistencyError
211
+
212
+ def __init__(
213
+ self,
214
+ local_resources: LocalResources,
215
+ cdf_resources: CDFResources,
216
+ limits: SchemaLimits,
217
+ modus_operandi: ModusOperandi = "additive",
218
+ ) -> None:
219
+ super().__init__(local_resources, cdf_resources, modus_operandi)
220
+ self.limits = limits
221
+
222
+ def run(self) -> list[ConsistencyError]:
223
+ errors: list[ConsistencyError] = []
224
+ merged_views = self.merged_views
225
+
226
+ # Single loop over all views
227
+ for view_ref in self.local_resources.views_by_reference.keys():
228
+ view = merged_views.get(view_ref)
229
+ if not view:
230
+ raise RuntimeError(f"View {view_ref!s} not found in merged views. This is a bug!")
231
+
232
+ if view.implements and len(view.implements) > self.limits.views.implements:
233
+ errors.append(
234
+ ConsistencyError(
235
+ message=(
236
+ f"View {view_ref!s} implements {len(view.implements)} views,"
237
+ " which exceeds the limit of"
238
+ f" {self.limits.views.implements} implemented views per view."
239
+ ),
240
+ code=self.code,
241
+ )
242
+ )
243
+ return errors
244
+
245
+
246
+ ### Container level limits
247
+
248
+
249
+ class ContainerPropertyCountIsOutOfLimits(DataModelValidator):
250
+ """Validates that a container does not exceed the maximum number of properties.
251
+
252
+ ## What it does
253
+ Checks that the container has no more properties than the CDF limit allows.
254
+
255
+ ## Why is this bad?
256
+ CDF enforces limits on the number of properties per container to ensure optimal performance
257
+ and prevent PostGres tables that have too many columns.
258
+
259
+ ## Example
260
+ If a container has 150 properties and the CDF limit is 100 properties per container,
261
+ this validator will raise a ConsistencyError issue.
262
+ """
263
+
264
+ code = f"{BASE_CODE}-CONTAINER-001"
265
+ issue_type = ConsistencyError
266
+
267
+ def __init__(
268
+ self,
269
+ local_resources: LocalResources,
270
+ cdf_resources: CDFResources,
271
+ limits: SchemaLimits,
272
+ modus_operandi: ModusOperandi = "additive",
273
+ ) -> None:
274
+ super().__init__(local_resources, cdf_resources, modus_operandi)
275
+ self.limits = limits
276
+
277
+ def run(self) -> list[ConsistencyError]:
278
+ errors: list[ConsistencyError] = []
279
+ merged_containers = self.merged_containers
280
+
281
+ # Single loop over all containers
282
+ for container_ref in self.local_resources.containers_by_reference.keys():
283
+ container = merged_containers.get(container_ref)
284
+ if not container:
285
+ raise RuntimeError(f"Container {container_ref!s} not found in merged containers. This is a bug!")
286
+
287
+ if container.properties and len(container.properties) > self.limits.containers.properties():
288
+ errors.append(
289
+ ConsistencyError(
290
+ message=(
291
+ f"Container {container.as_reference()!s} has {len(container.properties)} properties, "
292
+ "which exceeds the limit of "
293
+ f"{self.limits.containers.properties()} properties per container."
294
+ ),
295
+ fix="Define at least one property for container",
296
+ code=self.code,
297
+ )
298
+ )
299
+ elif not container.properties:
300
+ errors.append(
301
+ ConsistencyError(
302
+ message=(f"Container {container.as_reference()!s} does not have any properties defined."),
303
+ fix="Define at least one property for container",
304
+ code=self.code,
305
+ )
306
+ )
307
+
308
+ return errors
309
+
310
+
311
+ class ContainerPropertyListSizeIsOutOfLimits(DataModelValidator):
312
+ """Validates that container property list sizes do not exceed CDF limits.
313
+
314
+ ## What it does
315
+ Checks that list-type properties (max_list_size) do not exceed the appropriate limit based on:
316
+ - Data type (Int32, Int64, DirectRelation, etc.)
317
+ - Presence of btree index
318
+ - Default vs maximum limits
319
+
320
+ ## Why is this bad?
321
+ CDF enforces different list size limits for different data types and indexing configurations
322
+ to ensure optimal performance and prevent resource exhaustion.
323
+
324
+ ## Example
325
+ If a DirectRelation property has max_list_size=2000 with a btree index, but the limit
326
+ is 1000 for indexed DirectRelations, this validator will raise a ConsistencyError issue.
327
+
328
+ ## Note
329
+ Enum properties are skipped as they have a separate 32-value limit checked during read time of data model to neat
330
+ as a SyntaxError check.
331
+ """
332
+
333
+ code = f"{BASE_CODE}-CONTAINER-002"
334
+ issue_type = ConsistencyError
335
+
336
+ def __init__(
337
+ self,
338
+ local_resources: LocalResources,
339
+ cdf_resources: CDFResources,
340
+ limits: SchemaLimits,
341
+ modus_operandi: ModusOperandi = "additive",
342
+ ) -> None:
343
+ super().__init__(local_resources, cdf_resources, modus_operandi)
344
+ self.limits = limits
345
+
346
+ def run(self) -> list[ConsistencyError]:
347
+ errors: list[ConsistencyError] = []
348
+ merged_containers = self.merged_containers
349
+
350
+ # Single loop over all containers
351
+ for container_ref in self.local_resources.containers_by_reference.keys():
352
+ container = merged_containers.get(container_ref)
353
+ if not container:
354
+ raise RuntimeError(f"Container {container_ref!s} not found in merged containers. This is a bug!")
355
+
356
+ properties_by_index_type = self.container_property_by_index_type(container)
357
+
358
+ for property_id, property_ in container.properties.items():
359
+ type_ = property_.type
360
+
361
+ # Skip enum properties (have separate 32-value limit)
362
+ if isinstance(type_, EnumProperty):
363
+ continue
364
+
365
+ # Only check listable properties with max_list_size set
366
+ if not isinstance(type_, ListablePropertyTypeDefinition) or type_.max_list_size is None:
367
+ continue
368
+
369
+ has_btree_index = property_id in properties_by_index_type[BtreeIndex.model_fields["index_type"].default]
370
+ limit = self.limits.containers.properties.listable(type_, has_btree_index)
371
+
372
+ if type_.max_list_size > limit:
373
+ errors.append(
374
+ ConsistencyError(
375
+ message=(
376
+ f"Container {container.as_reference()!s} has property {property_id} with list size "
377
+ f"{type_.max_list_size}, which exceeds the limit of {limit} "
378
+ f"for data type {type_.__class__.__name__}."
379
+ ),
380
+ code=self.code,
381
+ )
382
+ )
383
+
384
+ return errors
385
+
386
+ @staticmethod
387
+ def container_property_by_index_type(container: ContainerRequest) -> dict[Literal["btree", "inverted"], list]:
388
+ """Map container properties to their index types for limit validation.
389
+
390
+ Categorizes container properties by their index configuration:
391
+ - "btree": Properties with btree indexes (have stricter list size limits)
392
+ - "inverted": Properties with inverted indexes
393
+
394
+ This mapping is used to determine the appropriate list size limit for
395
+ each property based on whether it has a btree index.
396
+
397
+ Args:
398
+ container: The container to analyze.
399
+
400
+ Returns:
401
+ Dictionary with index type strings as keys and lists of property identifiers
402
+ as values. Returns empty lists for both index types if container has no indexes.
403
+ """
404
+
405
+ container_property_by_index_type: dict[Literal["btree", "inverted"], list] = {
406
+ BtreeIndex.model_fields["index_type"].default: [],
407
+ InvertedIndex.model_fields["index_type"].default: [],
408
+ }
409
+ if not container.indexes:
410
+ return container_property_by_index_type
411
+
412
+ for index in container.indexes.values():
413
+ if isinstance(index, BtreeIndex):
414
+ container_property_by_index_type[BtreeIndex.model_fields["index_type"].default].extend(index.properties)
415
+ elif isinstance(index, InvertedIndex):
416
+ container_property_by_index_type[InvertedIndex.model_fields["index_type"].default].extend(
417
+ index.properties
418
+ )
419
+
420
+ return container_property_by_index_type