exonware-xwnode 0.0.1.22__py3-none-any.whl → 0.0.1.23__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 (248) hide show
  1. exonware/__init__.py +1 -1
  2. exonware/xwnode/__init__.py +18 -5
  3. exonware/xwnode/add_strategy_types.py +165 -0
  4. exonware/xwnode/common/__init__.py +1 -1
  5. exonware/xwnode/common/graph/__init__.py +30 -0
  6. exonware/xwnode/common/graph/caching.py +131 -0
  7. exonware/xwnode/common/graph/contracts.py +100 -0
  8. exonware/xwnode/common/graph/errors.py +44 -0
  9. exonware/xwnode/common/graph/indexing.py +260 -0
  10. exonware/xwnode/common/graph/manager.py +568 -0
  11. exonware/xwnode/common/management/__init__.py +3 -5
  12. exonware/xwnode/common/management/manager.py +2 -2
  13. exonware/xwnode/common/management/migration.py +3 -3
  14. exonware/xwnode/common/monitoring/__init__.py +3 -5
  15. exonware/xwnode/common/monitoring/metrics.py +6 -2
  16. exonware/xwnode/common/monitoring/pattern_detector.py +1 -1
  17. exonware/xwnode/common/monitoring/performance_monitor.py +5 -1
  18. exonware/xwnode/common/patterns/__init__.py +3 -5
  19. exonware/xwnode/common/patterns/flyweight.py +5 -1
  20. exonware/xwnode/common/patterns/registry.py +202 -183
  21. exonware/xwnode/common/utils/__init__.py +25 -11
  22. exonware/xwnode/common/utils/simple.py +1 -1
  23. exonware/xwnode/config.py +3 -8
  24. exonware/xwnode/contracts.py +4 -105
  25. exonware/xwnode/defs.py +413 -159
  26. exonware/xwnode/edges/strategies/__init__.py +86 -4
  27. exonware/xwnode/edges/strategies/_base_edge.py +2 -2
  28. exonware/xwnode/edges/strategies/adj_list.py +287 -121
  29. exonware/xwnode/edges/strategies/adj_matrix.py +316 -222
  30. exonware/xwnode/edges/strategies/base.py +1 -1
  31. exonware/xwnode/edges/strategies/{edge_bidir_wrapper.py → bidir_wrapper.py} +45 -4
  32. exonware/xwnode/edges/strategies/bitemporal.py +520 -0
  33. exonware/xwnode/edges/strategies/{edge_block_adj_matrix.py → block_adj_matrix.py} +77 -6
  34. exonware/xwnode/edges/strategies/bv_graph.py +664 -0
  35. exonware/xwnode/edges/strategies/compressed_graph.py +217 -0
  36. exonware/xwnode/edges/strategies/{edge_coo.py → coo.py} +46 -4
  37. exonware/xwnode/edges/strategies/{edge_csc.py → csc.py} +45 -4
  38. exonware/xwnode/edges/strategies/{edge_csr.py → csr.py} +94 -12
  39. exonware/xwnode/edges/strategies/{edge_dynamic_adj_list.py → dynamic_adj_list.py} +46 -4
  40. exonware/xwnode/edges/strategies/edge_list.py +168 -0
  41. exonware/xwnode/edges/strategies/edge_property_store.py +2 -2
  42. exonware/xwnode/edges/strategies/euler_tour.py +560 -0
  43. exonware/xwnode/edges/strategies/{edge_flow_network.py → flow_network.py} +2 -2
  44. exonware/xwnode/edges/strategies/graphblas.py +449 -0
  45. exonware/xwnode/edges/strategies/hnsw.py +637 -0
  46. exonware/xwnode/edges/strategies/hop2_labels.py +467 -0
  47. exonware/xwnode/edges/strategies/{edge_hyperedge_set.py → hyperedge_set.py} +2 -2
  48. exonware/xwnode/edges/strategies/incidence_matrix.py +250 -0
  49. exonware/xwnode/edges/strategies/k2_tree.py +613 -0
  50. exonware/xwnode/edges/strategies/link_cut.py +626 -0
  51. exonware/xwnode/edges/strategies/multiplex.py +532 -0
  52. exonware/xwnode/edges/strategies/{edge_neural_graph.py → neural_graph.py} +2 -2
  53. exonware/xwnode/edges/strategies/{edge_octree.py → octree.py} +69 -11
  54. exonware/xwnode/edges/strategies/{edge_quadtree.py → quadtree.py} +66 -10
  55. exonware/xwnode/edges/strategies/roaring_adj.py +438 -0
  56. exonware/xwnode/edges/strategies/{edge_rtree.py → rtree.py} +43 -5
  57. exonware/xwnode/edges/strategies/{edge_temporal_edgeset.py → temporal_edgeset.py} +24 -5
  58. exonware/xwnode/edges/strategies/{edge_tree_graph_basic.py → tree_graph_basic.py} +78 -7
  59. exonware/xwnode/edges/strategies/{edge_weighted_graph.py → weighted_graph.py} +188 -10
  60. exonware/xwnode/errors.py +3 -6
  61. exonware/xwnode/facade.py +20 -20
  62. exonware/xwnode/nodes/strategies/__init__.py +29 -9
  63. exonware/xwnode/nodes/strategies/adjacency_list.py +650 -177
  64. exonware/xwnode/nodes/strategies/aho_corasick.py +358 -183
  65. exonware/xwnode/nodes/strategies/array_list.py +36 -3
  66. exonware/xwnode/nodes/strategies/art.py +581 -0
  67. exonware/xwnode/nodes/strategies/{node_avl_tree.py → avl_tree.py} +77 -6
  68. exonware/xwnode/nodes/strategies/{node_b_plus_tree.py → b_plus_tree.py} +81 -40
  69. exonware/xwnode/nodes/strategies/{node_btree.py → b_tree.py} +79 -9
  70. exonware/xwnode/nodes/strategies/base.py +469 -98
  71. exonware/xwnode/nodes/strategies/{node_bitmap.py → bitmap.py} +12 -12
  72. exonware/xwnode/nodes/strategies/{node_bitset_dynamic.py → bitset_dynamic.py} +11 -11
  73. exonware/xwnode/nodes/strategies/{node_bloom_filter.py → bloom_filter.py} +15 -2
  74. exonware/xwnode/nodes/strategies/bloomier_filter.py +519 -0
  75. exonware/xwnode/nodes/strategies/bw_tree.py +531 -0
  76. exonware/xwnode/nodes/strategies/contracts.py +1 -1
  77. exonware/xwnode/nodes/strategies/{node_count_min_sketch.py → count_min_sketch.py} +3 -2
  78. exonware/xwnode/nodes/strategies/{node_cow_tree.py → cow_tree.py} +135 -13
  79. exonware/xwnode/nodes/strategies/crdt_map.py +629 -0
  80. exonware/xwnode/nodes/strategies/{node_cuckoo_hash.py → cuckoo_hash.py} +2 -2
  81. exonware/xwnode/nodes/strategies/{node_xdata_optimized.py → data_interchange_optimized.py} +21 -4
  82. exonware/xwnode/nodes/strategies/dawg.py +876 -0
  83. exonware/xwnode/nodes/strategies/deque.py +321 -153
  84. exonware/xwnode/nodes/strategies/extendible_hash.py +93 -0
  85. exonware/xwnode/nodes/strategies/{node_fenwick_tree.py → fenwick_tree.py} +111 -19
  86. exonware/xwnode/nodes/strategies/hamt.py +403 -0
  87. exonware/xwnode/nodes/strategies/hash_map.py +354 -67
  88. exonware/xwnode/nodes/strategies/heap.py +105 -5
  89. exonware/xwnode/nodes/strategies/hopscotch_hash.py +525 -0
  90. exonware/xwnode/nodes/strategies/{node_hyperloglog.py → hyperloglog.py} +6 -5
  91. exonware/xwnode/nodes/strategies/interval_tree.py +742 -0
  92. exonware/xwnode/nodes/strategies/kd_tree.py +703 -0
  93. exonware/xwnode/nodes/strategies/learned_index.py +533 -0
  94. exonware/xwnode/nodes/strategies/linear_hash.py +93 -0
  95. exonware/xwnode/nodes/strategies/linked_list.py +316 -119
  96. exonware/xwnode/nodes/strategies/{node_lsm_tree.py → lsm_tree.py} +219 -15
  97. exonware/xwnode/nodes/strategies/masstree.py +130 -0
  98. exonware/xwnode/nodes/strategies/{node_persistent_tree.py → persistent_tree.py} +149 -9
  99. exonware/xwnode/nodes/strategies/priority_queue.py +544 -132
  100. exonware/xwnode/nodes/strategies/queue.py +249 -120
  101. exonware/xwnode/nodes/strategies/{node_red_black_tree.py → red_black_tree.py} +183 -72
  102. exonware/xwnode/nodes/strategies/{node_roaring_bitmap.py → roaring_bitmap.py} +19 -6
  103. exonware/xwnode/nodes/strategies/rope.py +717 -0
  104. exonware/xwnode/nodes/strategies/{node_segment_tree.py → segment_tree.py} +106 -106
  105. exonware/xwnode/nodes/strategies/{node_set_hash.py → set_hash.py} +30 -29
  106. exonware/xwnode/nodes/strategies/{node_skip_list.py → skip_list.py} +74 -6
  107. exonware/xwnode/nodes/strategies/sparse_matrix.py +427 -131
  108. exonware/xwnode/nodes/strategies/{node_splay_tree.py → splay_tree.py} +55 -6
  109. exonware/xwnode/nodes/strategies/stack.py +244 -112
  110. exonware/xwnode/nodes/strategies/{node_suffix_array.py → suffix_array.py} +5 -1
  111. exonware/xwnode/nodes/strategies/t_tree.py +94 -0
  112. exonware/xwnode/nodes/strategies/{node_treap.py → treap.py} +75 -6
  113. exonware/xwnode/nodes/strategies/{node_tree_graph_hybrid.py → tree_graph_hybrid.py} +46 -5
  114. exonware/xwnode/nodes/strategies/trie.py +153 -9
  115. exonware/xwnode/nodes/strategies/union_find.py +111 -5
  116. exonware/xwnode/nodes/strategies/veb_tree.py +856 -0
  117. exonware/xwnode/strategies/__init__.py +5 -51
  118. exonware/xwnode/version.py +3 -3
  119. {exonware_xwnode-0.0.1.22.dist-info → exonware_xwnode-0.0.1.23.dist-info}/METADATA +23 -3
  120. exonware_xwnode-0.0.1.23.dist-info/RECORD +130 -0
  121. exonware/xwnode/edges/strategies/edge_adj_list.py +0 -353
  122. exonware/xwnode/edges/strategies/edge_adj_matrix.py +0 -445
  123. exonware/xwnode/nodes/strategies/_base_node.py +0 -307
  124. exonware/xwnode/nodes/strategies/node_aho_corasick.py +0 -525
  125. exonware/xwnode/nodes/strategies/node_array_list.py +0 -179
  126. exonware/xwnode/nodes/strategies/node_hash_map.py +0 -273
  127. exonware/xwnode/nodes/strategies/node_heap.py +0 -196
  128. exonware/xwnode/nodes/strategies/node_linked_list.py +0 -413
  129. exonware/xwnode/nodes/strategies/node_trie.py +0 -257
  130. exonware/xwnode/nodes/strategies/node_union_find.py +0 -192
  131. exonware/xwnode/queries/executors/__init__.py +0 -47
  132. exonware/xwnode/queries/executors/advanced/__init__.py +0 -37
  133. exonware/xwnode/queries/executors/advanced/aggregate_executor.py +0 -50
  134. exonware/xwnode/queries/executors/advanced/ask_executor.py +0 -50
  135. exonware/xwnode/queries/executors/advanced/construct_executor.py +0 -50
  136. exonware/xwnode/queries/executors/advanced/describe_executor.py +0 -50
  137. exonware/xwnode/queries/executors/advanced/for_loop_executor.py +0 -50
  138. exonware/xwnode/queries/executors/advanced/foreach_executor.py +0 -50
  139. exonware/xwnode/queries/executors/advanced/join_executor.py +0 -50
  140. exonware/xwnode/queries/executors/advanced/let_executor.py +0 -50
  141. exonware/xwnode/queries/executors/advanced/mutation_executor.py +0 -50
  142. exonware/xwnode/queries/executors/advanced/options_executor.py +0 -50
  143. exonware/xwnode/queries/executors/advanced/pipe_executor.py +0 -50
  144. exonware/xwnode/queries/executors/advanced/subscribe_executor.py +0 -50
  145. exonware/xwnode/queries/executors/advanced/subscription_executor.py +0 -50
  146. exonware/xwnode/queries/executors/advanced/union_executor.py +0 -50
  147. exonware/xwnode/queries/executors/advanced/window_executor.py +0 -51
  148. exonware/xwnode/queries/executors/advanced/with_cte_executor.py +0 -50
  149. exonware/xwnode/queries/executors/aggregation/__init__.py +0 -21
  150. exonware/xwnode/queries/executors/aggregation/avg_executor.py +0 -50
  151. exonware/xwnode/queries/executors/aggregation/count_executor.py +0 -38
  152. exonware/xwnode/queries/executors/aggregation/distinct_executor.py +0 -50
  153. exonware/xwnode/queries/executors/aggregation/group_executor.py +0 -50
  154. exonware/xwnode/queries/executors/aggregation/having_executor.py +0 -50
  155. exonware/xwnode/queries/executors/aggregation/max_executor.py +0 -50
  156. exonware/xwnode/queries/executors/aggregation/min_executor.py +0 -50
  157. exonware/xwnode/queries/executors/aggregation/sum_executor.py +0 -50
  158. exonware/xwnode/queries/executors/aggregation/summarize_executor.py +0 -50
  159. exonware/xwnode/queries/executors/array/__init__.py +0 -9
  160. exonware/xwnode/queries/executors/array/indexing_executor.py +0 -51
  161. exonware/xwnode/queries/executors/array/slicing_executor.py +0 -51
  162. exonware/xwnode/queries/executors/base.py +0 -257
  163. exonware/xwnode/queries/executors/capability_checker.py +0 -204
  164. exonware/xwnode/queries/executors/contracts.py +0 -166
  165. exonware/xwnode/queries/executors/core/__init__.py +0 -17
  166. exonware/xwnode/queries/executors/core/create_executor.py +0 -96
  167. exonware/xwnode/queries/executors/core/delete_executor.py +0 -99
  168. exonware/xwnode/queries/executors/core/drop_executor.py +0 -100
  169. exonware/xwnode/queries/executors/core/insert_executor.py +0 -39
  170. exonware/xwnode/queries/executors/core/select_executor.py +0 -152
  171. exonware/xwnode/queries/executors/core/update_executor.py +0 -102
  172. exonware/xwnode/queries/executors/data/__init__.py +0 -13
  173. exonware/xwnode/queries/executors/data/alter_executor.py +0 -50
  174. exonware/xwnode/queries/executors/data/load_executor.py +0 -50
  175. exonware/xwnode/queries/executors/data/merge_executor.py +0 -50
  176. exonware/xwnode/queries/executors/data/store_executor.py +0 -50
  177. exonware/xwnode/queries/executors/defs.py +0 -93
  178. exonware/xwnode/queries/executors/engine.py +0 -221
  179. exonware/xwnode/queries/executors/errors.py +0 -68
  180. exonware/xwnode/queries/executors/filtering/__init__.py +0 -25
  181. exonware/xwnode/queries/executors/filtering/between_executor.py +0 -80
  182. exonware/xwnode/queries/executors/filtering/filter_executor.py +0 -79
  183. exonware/xwnode/queries/executors/filtering/has_executor.py +0 -70
  184. exonware/xwnode/queries/executors/filtering/in_executor.py +0 -70
  185. exonware/xwnode/queries/executors/filtering/like_executor.py +0 -76
  186. exonware/xwnode/queries/executors/filtering/optional_executor.py +0 -76
  187. exonware/xwnode/queries/executors/filtering/range_executor.py +0 -80
  188. exonware/xwnode/queries/executors/filtering/term_executor.py +0 -77
  189. exonware/xwnode/queries/executors/filtering/values_executor.py +0 -71
  190. exonware/xwnode/queries/executors/filtering/where_executor.py +0 -44
  191. exonware/xwnode/queries/executors/graph/__init__.py +0 -15
  192. exonware/xwnode/queries/executors/graph/in_traverse_executor.py +0 -51
  193. exonware/xwnode/queries/executors/graph/match_executor.py +0 -51
  194. exonware/xwnode/queries/executors/graph/out_executor.py +0 -51
  195. exonware/xwnode/queries/executors/graph/path_executor.py +0 -51
  196. exonware/xwnode/queries/executors/graph/return_executor.py +0 -51
  197. exonware/xwnode/queries/executors/ordering/__init__.py +0 -9
  198. exonware/xwnode/queries/executors/ordering/by_executor.py +0 -50
  199. exonware/xwnode/queries/executors/ordering/order_executor.py +0 -51
  200. exonware/xwnode/queries/executors/projection/__init__.py +0 -9
  201. exonware/xwnode/queries/executors/projection/extend_executor.py +0 -50
  202. exonware/xwnode/queries/executors/projection/project_executor.py +0 -50
  203. exonware/xwnode/queries/executors/registry.py +0 -173
  204. exonware/xwnode/queries/parsers/__init__.py +0 -26
  205. exonware/xwnode/queries/parsers/base.py +0 -86
  206. exonware/xwnode/queries/parsers/contracts.py +0 -46
  207. exonware/xwnode/queries/parsers/errors.py +0 -53
  208. exonware/xwnode/queries/parsers/sql_param_extractor.py +0 -318
  209. exonware/xwnode/queries/strategies/__init__.py +0 -24
  210. exonware/xwnode/queries/strategies/base.py +0 -236
  211. exonware/xwnode/queries/strategies/cql.py +0 -201
  212. exonware/xwnode/queries/strategies/cypher.py +0 -181
  213. exonware/xwnode/queries/strategies/datalog.py +0 -70
  214. exonware/xwnode/queries/strategies/elastic_dsl.py +0 -70
  215. exonware/xwnode/queries/strategies/eql.py +0 -70
  216. exonware/xwnode/queries/strategies/flux.py +0 -70
  217. exonware/xwnode/queries/strategies/gql.py +0 -70
  218. exonware/xwnode/queries/strategies/graphql.py +0 -240
  219. exonware/xwnode/queries/strategies/gremlin.py +0 -181
  220. exonware/xwnode/queries/strategies/hiveql.py +0 -214
  221. exonware/xwnode/queries/strategies/hql.py +0 -70
  222. exonware/xwnode/queries/strategies/jmespath.py +0 -219
  223. exonware/xwnode/queries/strategies/jq.py +0 -66
  224. exonware/xwnode/queries/strategies/json_query.py +0 -66
  225. exonware/xwnode/queries/strategies/jsoniq.py +0 -248
  226. exonware/xwnode/queries/strategies/kql.py +0 -70
  227. exonware/xwnode/queries/strategies/linq.py +0 -238
  228. exonware/xwnode/queries/strategies/logql.py +0 -70
  229. exonware/xwnode/queries/strategies/mql.py +0 -68
  230. exonware/xwnode/queries/strategies/n1ql.py +0 -210
  231. exonware/xwnode/queries/strategies/partiql.py +0 -70
  232. exonware/xwnode/queries/strategies/pig.py +0 -215
  233. exonware/xwnode/queries/strategies/promql.py +0 -70
  234. exonware/xwnode/queries/strategies/sparql.py +0 -220
  235. exonware/xwnode/queries/strategies/sql.py +0 -275
  236. exonware/xwnode/queries/strategies/xml_query.py +0 -66
  237. exonware/xwnode/queries/strategies/xpath.py +0 -223
  238. exonware/xwnode/queries/strategies/xquery.py +0 -258
  239. exonware/xwnode/queries/strategies/xwnode_executor.py +0 -332
  240. exonware/xwnode/queries/strategies/xwquery.py +0 -456
  241. exonware_xwnode-0.0.1.22.dist-info/RECORD +0 -214
  242. /exonware/xwnode/nodes/strategies/{node_ordered_map.py → ordered_map.py} +0 -0
  243. /exonware/xwnode/nodes/strategies/{node_ordered_map_balanced.py → ordered_map_balanced.py} +0 -0
  244. /exonware/xwnode/nodes/strategies/{node_patricia.py → patricia.py} +0 -0
  245. /exonware/xwnode/nodes/strategies/{node_radix_trie.py → radix_trie.py} +0 -0
  246. /exonware/xwnode/nodes/strategies/{node_set_tree.py → set_tree.py} +0 -0
  247. {exonware_xwnode-0.0.1.22.dist-info → exonware_xwnode-0.0.1.23.dist-info}/WHEEL +0 -0
  248. {exonware_xwnode-0.0.1.22.dist-info → exonware_xwnode-0.0.1.23.dist-info}/licenses/LICENSE +0 -0
@@ -1,204 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- #exonware/xwnode/src/exonware/xwnode/queries/executors/capability_checker.py
4
-
5
- Operation Capability Checker
6
-
7
- This module provides capability checking for operations on different node types.
8
-
9
- Company: eXonware.com
10
- Author: Eng. Muhammad AlShehri
11
- Email: connect@exonware.com
12
- Version: 0.0.1.22
13
- Generation Date: 08-Oct-2025
14
- """
15
-
16
- from typing import Dict, List, Set
17
-
18
- # Import NodeType from nodes module per DEV_GUIDELINES
19
- from ...nodes.strategies.contracts import NodeType
20
-
21
-
22
- # Operation-to-NodeType Compatibility Matrix
23
- OPERATION_COMPATIBILITY = {
24
- # Core CRUD Operations (Universal)
25
- 'SELECT': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
26
- 'INSERT': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
27
- 'UPDATE': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
28
- 'DELETE': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
29
- 'CREATE': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
30
- 'DROP': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
31
-
32
- # Filtering Operations (Universal)
33
- 'WHERE': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
34
- 'FILTER': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
35
- 'LIKE': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
36
- 'IN': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
37
- 'HAS': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
38
-
39
- # Range Operations (Tree/Matrix)
40
- 'BETWEEN': {NodeType.TREE, NodeType.MATRIX},
41
- 'RANGE': {NodeType.TREE, NodeType.MATRIX},
42
-
43
- # Aggregation Operations (Universal)
44
- 'GROUP': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
45
- 'BY': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
46
- 'HAVING': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
47
- 'SUMMARIZE': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
48
- 'SUM': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
49
- 'COUNT': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
50
- 'AVG': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
51
- 'MIN': {NodeType.LINEAR, NodeType.TREE, NodeType.MATRIX}, # Optimal on trees
52
- 'MAX': {NodeType.LINEAR, NodeType.TREE, NodeType.MATRIX}, # Optimal on trees
53
- 'DISTINCT': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
54
-
55
- # Ordering Operations (Tree/Linear)
56
- 'ORDER': {NodeType.TREE, NodeType.LINEAR},
57
-
58
- # Join Operations (Universal conceptually)
59
- 'JOIN': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
60
- 'UNION': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
61
- 'WITH': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
62
- 'OPTIONAL': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
63
-
64
- # Graph Operations
65
- 'MATCH': {NodeType.GRAPH, NodeType.TREE, NodeType.HYBRID},
66
- 'PATH': {NodeType.GRAPH, NodeType.TREE, NodeType.HYBRID},
67
- 'OUT': {NodeType.GRAPH, NodeType.TREE, NodeType.HYBRID},
68
- 'IN_TRAVERSE': {NodeType.GRAPH, NodeType.TREE, NodeType.HYBRID},
69
- 'RETURN': {NodeType.GRAPH, NodeType.TREE, NodeType.HYBRID},
70
-
71
- # Projection Operations (Universal)
72
- 'PROJECT': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
73
- 'EXTEND': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
74
-
75
- # Array Operations (Linear/Matrix)
76
- 'SLICING': {NodeType.LINEAR, NodeType.MATRIX},
77
- 'INDEXING': {NodeType.LINEAR, NodeType.MATRIX, NodeType.TREE},
78
-
79
- # Search Operations (Universal)
80
- 'TERM': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
81
-
82
- # Data Operations (Universal)
83
- 'LOAD': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
84
- 'STORE': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
85
- 'MERGE': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
86
- 'ALTER': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
87
-
88
- # Control Flow Operations (Universal)
89
- 'FOREACH': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
90
- 'LET': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
91
- 'FOR': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
92
-
93
- # Window Operations (Time-series, works on linear/tree)
94
- 'WINDOW': {NodeType.LINEAR, NodeType.TREE},
95
- 'AGGREGATE': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
96
-
97
- # Metadata Operations (Universal)
98
- 'DESCRIBE': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
99
- 'CONSTRUCT': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
100
- 'ASK': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
101
-
102
- # Advanced Operations (Universal)
103
- 'SUBSCRIBE': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
104
- 'SUBSCRIPTION': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
105
- 'MUTATION': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
106
- 'PIPE': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
107
- 'OPTIONS': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
108
- 'VALUES': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
109
- }
110
-
111
-
112
- def check_operation_compatibility(operation: str, node_type: NodeType) -> bool:
113
- """
114
- Check if an operation is compatible with a node type.
115
-
116
- Args:
117
- operation: Operation name (e.g., "SELECT")
118
- node_type: Node type to check
119
-
120
- Returns:
121
- True if operation is compatible with node type
122
- """
123
- operation = operation.upper()
124
-
125
- # Check compatibility matrix
126
- if operation in OPERATION_COMPATIBILITY:
127
- return node_type in OPERATION_COMPATIBILITY[operation]
128
-
129
- # Unknown operation - assume universal (backward compatibility)
130
- return True
131
-
132
-
133
- def get_supported_operations(node_type: NodeType) -> List[str]:
134
- """
135
- Get list of operations supported by a node type.
136
-
137
- Args:
138
- node_type: Node type to check
139
-
140
- Returns:
141
- List of supported operation names
142
- """
143
- supported = []
144
-
145
- for operation, compatible_types in OPERATION_COMPATIBILITY.items():
146
- if node_type in compatible_types:
147
- supported.append(operation)
148
-
149
- return supported
150
-
151
-
152
- def get_universal_operations() -> List[str]:
153
- """
154
- Get list of universal operations (work on all node types).
155
-
156
- Returns:
157
- List of universal operation names
158
- """
159
- universal = []
160
- all_types = {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID}
161
-
162
- for operation, compatible_types in OPERATION_COMPATIBILITY.items():
163
- if compatible_types == all_types:
164
- universal.append(operation)
165
-
166
- return universal
167
-
168
-
169
- def get_type_specific_operations(node_type: NodeType) -> List[str]:
170
- """
171
- Get operations that are specific to (or optimal for) a node type.
172
-
173
- Args:
174
- node_type: Node type to check
175
-
176
- Returns:
177
- List of type-specific operation names
178
- """
179
- specific = []
180
- all_types = {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID}
181
-
182
- for operation, compatible_types in OPERATION_COMPATIBILITY.items():
183
- # If node type supports it but not all types support it
184
- if node_type in compatible_types and compatible_types != all_types:
185
- specific.append(operation)
186
-
187
- return specific
188
-
189
-
190
- # Global registry accessor
191
- def get_global_registry() -> OperationRegistry:
192
- """Get the global operation registry instance."""
193
- return OperationRegistry()
194
-
195
-
196
- __all__ = [
197
- 'OperationRegistry',
198
- 'get_operation_registry',
199
- 'check_operation_compatibility',
200
- 'get_supported_operations',
201
- 'get_universal_operations',
202
- 'get_type_specific_operations',
203
- 'OPERATION_COMPATIBILITY',
204
- ]
@@ -1,166 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- #exonware/xwnode/src/exonware/xwnode/queries/executors/contracts.py
4
-
5
- Operation Executor Contracts
6
-
7
- This module defines the interfaces and data structures for query operation execution.
8
-
9
- Company: eXonware.com
10
- Author: Eng. Muhammad AlShehri
11
- Email: connect@exonware.com
12
- Version: 0.0.1.22
13
- Generation Date: 08-Oct-2025
14
- """
15
-
16
- from abc import ABC, abstractmethod
17
- from typing import Any, Dict, List, Optional
18
- from dataclasses import dataclass, field
19
-
20
- # Import shared types per DEV_GUIDELINES.md
21
- from ...nodes.strategies.contracts import NodeType
22
- from .defs import OperationCapability
23
-
24
-
25
- @dataclass
26
- class Action:
27
- """
28
- Represents a single query action to be executed.
29
-
30
- Actions are parsed from XWQuery Script and contain all information
31
- needed to execute a specific operation.
32
- """
33
- type: str # e.g., "SELECT", "INSERT", "WHERE"
34
- params: Dict[str, Any] # Operation parameters
35
- id: str = "" # Unique action ID
36
- line_number: int = 0 # Source line number
37
- children: List['Action'] = field(default_factory=list) # Nested actions
38
- metadata: Dict[str, Any] = field(default_factory=dict) # Additional metadata
39
-
40
-
41
- @dataclass
42
- class ExecutionContext:
43
- """
44
- Execution context for operation execution.
45
-
46
- Contains all state needed during execution including the target node,
47
- variables, transaction state, and configuration.
48
- """
49
- node: Any # Target XWNode to execute on
50
- variables: Dict[str, Any] = field(default_factory=dict) # Query variables
51
- transaction: Optional[Any] = None # Transaction object (if in transaction)
52
- cache: Optional[Dict[str, Any]] = None # Result cache
53
- parent_results: Dict[str, Any] = field(default_factory=dict) # Results from parent actions
54
- options: Dict[str, Any] = field(default_factory=dict) # Execution options
55
-
56
- def set_result(self, action_id: str, result: Any) -> None:
57
- """Store result for later use by other actions."""
58
- self.parent_results[action_id] = result
59
-
60
- def get_result(self, action_id: str) -> Optional[Any]:
61
- """Get result from previous action."""
62
- return self.parent_results.get(action_id)
63
-
64
-
65
- @dataclass
66
- class ExecutionResult:
67
- """
68
- Result of operation execution.
69
-
70
- Contains the data returned by the operation along with metadata
71
- about the execution.
72
- """
73
- data: Any # Result data
74
- affected_count: int = 0 # Number of items affected
75
- execution_time: float = 0.0 # Execution time in seconds
76
- metadata: Dict[str, Any] = field(default_factory=dict) # Additional metadata
77
- success: bool = True # Whether execution succeeded
78
- error: Optional[str] = None # Error message if failed
79
-
80
-
81
- class IOperationExecutor(ABC):
82
- """
83
- Interface for operation executors.
84
-
85
- All operation executors must implement this interface to be compatible
86
- with the execution engine.
87
- """
88
-
89
- # Operation name (e.g., "SELECT", "INSERT")
90
- OPERATION_NAME: str = ""
91
-
92
- # Supported node types (empty = all types)
93
- SUPPORTED_NODE_TYPES: List[NodeType] = []
94
-
95
- # Required capabilities
96
- REQUIRED_CAPABILITIES: OperationCapability = OperationCapability.NONE
97
-
98
- @abstractmethod
99
- def execute(self, action: Action, context: ExecutionContext) -> ExecutionResult:
100
- """
101
- Execute the operation.
102
-
103
- Args:
104
- action: The action to execute
105
- context: Execution context with node and state
106
-
107
- Returns:
108
- ExecutionResult with data and metadata
109
-
110
- Raises:
111
- UnsupportedOperationError: If operation cannot execute on node type
112
- ExecutionError: If execution fails
113
- """
114
- pass
115
-
116
- @abstractmethod
117
- def validate(self, action: Action, context: ExecutionContext) -> bool:
118
- """
119
- Validate that the action can be executed.
120
-
121
- Args:
122
- action: The action to validate
123
- context: Execution context
124
-
125
- Returns:
126
- True if action is valid and can be executed
127
- """
128
- pass
129
-
130
- def can_execute_on(self, node_type: NodeType) -> bool:
131
- """
132
- Check if this executor can operate on the given node type.
133
-
134
- Args:
135
- node_type: The node type to check
136
-
137
- Returns:
138
- True if this executor supports the node type
139
- """
140
- # Empty list means supports all types
141
- if not self.SUPPORTED_NODE_TYPES:
142
- return True
143
- return node_type in self.SUPPORTED_NODE_TYPES
144
-
145
- def estimate_cost(self, action: Action, context: ExecutionContext) -> int:
146
- """
147
- Estimate execution cost (optional).
148
-
149
- Args:
150
- action: The action to estimate
151
- context: Execution context
152
-
153
- Returns:
154
- Estimated cost (arbitrary units)
155
- """
156
- return 100 # Default cost
157
-
158
-
159
- __all__ = [
160
- 'IOperationExecutor',
161
- 'Action',
162
- 'ExecutionContext',
163
- 'ExecutionResult',
164
- 'OperationCapability',
165
- 'NodeType',
166
- ]
@@ -1,17 +0,0 @@
1
- """Core CRUD operation executors."""
2
-
3
- from .select_executor import SelectExecutor
4
- from .insert_executor import InsertExecutor
5
- from .update_executor import UpdateExecutor
6
- from .delete_executor import DeleteExecutor
7
- from .create_executor import CreateExecutor
8
- from .drop_executor import DropExecutor
9
-
10
- __all__ = [
11
- 'SelectExecutor',
12
- 'InsertExecutor',
13
- 'UpdateExecutor',
14
- 'DeleteExecutor',
15
- 'CreateExecutor',
16
- 'DropExecutor',
17
- ]
@@ -1,96 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- #exonware/xwnode/src/exonware/xwnode/queries/executors/core/create_executor.py
4
-
5
- CREATE Executor
6
-
7
- Company: eXonware.com
8
- Author: Eng. Muhammad AlShehri
9
- Email: connect@exonware.com
10
- Version: 0.0.1.22
11
- Generation Date: 08-Oct-2025
12
- """
13
-
14
- from typing import Any, Dict, List
15
- from ..base import AUniversalOperationExecutor
16
- from ..contracts import Action, ExecutionContext, ExecutionResult
17
- from ..defs import OperationType
18
- from ...nodes.strategies.contracts import NodeType
19
-
20
-
21
- class CreateExecutor(AUniversalOperationExecutor):
22
- """
23
- CREATE operation executor - Universal operation.
24
-
25
- Creates new structures (collections, indices, schemas) in nodes.
26
- Works on all node types (LINEAR, TREE, GRAPH, MATRIX, HYBRID).
27
-
28
- Capability: Universal
29
- Operation Type: CORE
30
- """
31
-
32
- OPERATION_NAME = "CREATE"
33
- OPERATION_TYPE = OperationType.CORE
34
- SUPPORTED_NODE_TYPES = [] # Empty = Universal (all types)
35
-
36
- def _do_execute(self, action: Action, context: ExecutionContext) -> ExecutionResult:
37
- """Execute CREATE operation."""
38
- # 1. Extract parameters
39
- params = action.params
40
- structure_type = params.get('type', 'collection') # collection, index, schema
41
- name = params.get('name', 'new_structure')
42
- schema = params.get('schema', {})
43
- options = params.get('options', {})
44
-
45
- # 2. Get node strategy
46
- node = context.node
47
-
48
- # 3. Execute create
49
- result_data = self._execute_create(node, structure_type, name, schema, options, context)
50
-
51
- # 4. Return result
52
- return ExecutionResult(
53
- success=True,
54
- data=result_data,
55
- operation=self.OPERATION_NAME,
56
- metadata={
57
- 'structure_type': structure_type,
58
- 'name': name,
59
- 'created': result_data.get('created', False)
60
- }
61
- )
62
-
63
- def _execute_create(self, node: Any, structure_type: str, name: str,
64
- schema: Dict, options: Dict, context: ExecutionContext) -> Dict:
65
- """Actual CREATE logic."""
66
- try:
67
- # Create structure based on type
68
- if structure_type == 'collection':
69
- # Create a new collection/path
70
- node.set(name, {})
71
- created = True
72
- elif structure_type == 'index':
73
- # Create an index (simplified)
74
- index_path = f"_indices.{name}"
75
- node.set(index_path, {'type': 'index', 'fields': schema})
76
- created = True
77
- elif structure_type == 'schema':
78
- # Create a schema definition
79
- schema_path = f"_schemas.{name}"
80
- node.set(schema_path, schema)
81
- created = True
82
- else:
83
- created = False
84
-
85
- return {
86
- 'created': created,
87
- 'type': structure_type,
88
- 'name': name,
89
- 'path': name
90
- }
91
- except Exception as e:
92
- return {
93
- 'created': False,
94
- 'error': str(e)
95
- }
96
-
@@ -1,99 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- #exonware/xwnode/src/exonware/xwnode/queries/executors/core/delete_executor.py
4
-
5
- DELETE Executor
6
-
7
- Company: eXonware.com
8
- Author: Eng. Muhammad AlShehri
9
- Email: connect@exonware.com
10
- Version: 0.0.1.22
11
- Generation Date: 08-Oct-2025
12
- """
13
-
14
- from typing import Any, Dict, List
15
- from ..base import AUniversalOperationExecutor
16
- from ..contracts import Action, ExecutionContext, ExecutionResult
17
- from ..defs import OperationType
18
- from ...nodes.strategies.contracts import NodeType
19
-
20
-
21
- class DeleteExecutor(AUniversalOperationExecutor):
22
- """
23
- DELETE operation executor - Universal operation.
24
-
25
- Deletes data from nodes based on specified conditions.
26
- Works on all node types (LINEAR, TREE, GRAPH, MATRIX, HYBRID).
27
-
28
- Capability: Universal
29
- Operation Type: CORE
30
- """
31
-
32
- OPERATION_NAME = "DELETE"
33
- OPERATION_TYPE = OperationType.CORE
34
- SUPPORTED_NODE_TYPES = [] # Empty = Universal (all types)
35
-
36
- def _do_execute(self, action: Action, context: ExecutionContext) -> ExecutionResult:
37
- """Execute DELETE operation."""
38
- # 1. Extract parameters
39
- params = action.params
40
- target = params.get('target', None) # What to delete (path/key)
41
- condition = params.get('where', None) # Delete condition
42
-
43
- # 2. Get node strategy
44
- node = context.node
45
-
46
- # 3. Execute delete
47
- result_data = self._execute_delete(node, target, condition, context)
48
-
49
- # 4. Return result
50
- return ExecutionResult(
51
- success=True,
52
- data=result_data,
53
- operation=self.OPERATION_NAME,
54
- metadata={
55
- 'deleted_count': result_data.get('count', 0),
56
- 'target': target,
57
- 'condition': condition
58
- }
59
- )
60
-
61
- def _execute_delete(self, node: Any, target: str, condition: Any,
62
- context: ExecutionContext) -> Dict:
63
- """Actual DELETE logic."""
64
- deleted_count = 0
65
- deleted_items = []
66
-
67
- if target:
68
- # Delete specific target
69
- try:
70
- current = node.get(target, default=None)
71
- if current is not None and self._matches_condition(current, condition):
72
- node.delete(target)
73
- deleted_count = 1
74
- deleted_items.append(target)
75
- except Exception as e:
76
- return {
77
- 'count': 0,
78
- 'items': [],
79
- 'error': str(e)
80
- }
81
- else:
82
- # Delete all matching items
83
- # This is a simplified implementation
84
- deleted_count = 0
85
- deleted_items = []
86
-
87
- return {
88
- 'count': deleted_count,
89
- 'items': deleted_items
90
- }
91
-
92
- def _matches_condition(self, item: Any, condition: Any) -> bool:
93
- """Check if item matches condition."""
94
- if condition is None:
95
- return True
96
-
97
- # Simplified condition checking
98
- return True
99
-
@@ -1,100 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- #exonware/xwnode/src/exonware/xwnode/queries/executors/core/drop_executor.py
4
-
5
- DROP Executor
6
-
7
- Company: eXonware.com
8
- Author: Eng. Muhammad AlShehri
9
- Email: connect@exonware.com
10
- Version: 0.0.1.22
11
- Generation Date: 08-Oct-2025
12
- """
13
-
14
- from typing import Any, Dict, List
15
- from ..base import AUniversalOperationExecutor
16
- from ..contracts import Action, ExecutionContext, ExecutionResult
17
- from ..defs import OperationType
18
- from ...nodes.strategies.contracts import NodeType
19
-
20
-
21
- class DropExecutor(AUniversalOperationExecutor):
22
- """
23
- DROP operation executor - Universal operation.
24
-
25
- Drops/removes structures (collections, indices, schemas) from nodes.
26
- Works on all node types (LINEAR, TREE, GRAPH, MATRIX, HYBRID).
27
-
28
- Capability: Universal
29
- Operation Type: CORE
30
- """
31
-
32
- OPERATION_NAME = "DROP"
33
- OPERATION_TYPE = OperationType.CORE
34
- SUPPORTED_NODE_TYPES = [] # Empty = Universal (all types)
35
-
36
- def _do_execute(self, action: Action, context: ExecutionContext) -> ExecutionResult:
37
- """Execute DROP operation."""
38
- # 1. Extract parameters
39
- params = action.params
40
- structure_type = params.get('type', 'collection')
41
- name = params.get('name')
42
- if_exists = params.get('if_exists', False)
43
-
44
- # 2. Get node strategy
45
- node = context.node
46
-
47
- # 3. Execute drop
48
- result_data = self._execute_drop(node, structure_type, name, if_exists, context)
49
-
50
- # 4. Return result
51
- return ExecutionResult(
52
- success=True,
53
- data=result_data,
54
- operation=self.OPERATION_NAME,
55
- metadata={
56
- 'structure_type': structure_type,
57
- 'name': name,
58
- 'dropped': result_data.get('dropped', False)
59
- }
60
- )
61
-
62
- def _execute_drop(self, node: Any, structure_type: str, name: str,
63
- if_exists: bool, context: ExecutionContext) -> Dict:
64
- """Actual DROP logic."""
65
- try:
66
- # Determine path based on structure type
67
- if structure_type == 'index':
68
- path = f"_indices.{name}"
69
- elif structure_type == 'schema':
70
- path = f"_schemas.{name}"
71
- else:
72
- path = name
73
-
74
- # Check if exists
75
- exists = node.get(path, default=None) is not None
76
-
77
- if not exists and not if_exists:
78
- return {
79
- 'dropped': False,
80
- 'error': f"Structure '{name}' does not exist"
81
- }
82
-
83
- if exists:
84
- node.delete(path)
85
- dropped = True
86
- else:
87
- dropped = False
88
-
89
- return {
90
- 'dropped': dropped,
91
- 'type': structure_type,
92
- 'name': name,
93
- 'path': path
94
- }
95
- except Exception as e:
96
- return {
97
- 'dropped': False,
98
- 'error': str(e)
99
- }
100
-