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,50 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- #exonware/xwnode/src/exonware/xwnode/queries/executors/aggregation/max_executor.py
4
-
5
- MAX 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: 09-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
-
19
- class MaxExecutor(AUniversalOperationExecutor):
20
- """
21
- MAX operation executor.
22
-
23
- Finds maximum value
24
-
25
- Capability: Universal
26
- Operation Type: AGGREGATION
27
- """
28
-
29
- OPERATION_NAME = "MAX"
30
- OPERATION_TYPE = OperationType.AGGREGATION
31
- SUPPORTED_NODE_TYPES = [] # Universal
32
-
33
- def _do_execute(self, action: Action, context: ExecutionContext) -> ExecutionResult:
34
- """Execute MAX operation."""
35
- params = action.params
36
- node = context.node
37
-
38
- result_data = self._execute_max(node, params, context)
39
-
40
- return ExecutionResult(
41
- success=True,
42
- data=result_data,
43
- operation=self.OPERATION_NAME,
44
- metadata={'operation': self.OPERATION_NAME}
45
- )
46
-
47
- def _execute_max(self, node: Any, params: Dict, context: ExecutionContext) -> Dict:
48
- """Execute max logic."""
49
- # Implementation here
50
- return {'result': 'MAX executed', 'params': params}
@@ -1,50 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- #exonware/xwnode/src/exonware/xwnode/queries/executors/aggregation/min_executor.py
4
-
5
- MIN 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: 09-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
-
19
- class MinExecutor(AUniversalOperationExecutor):
20
- """
21
- MIN operation executor.
22
-
23
- Finds minimum value
24
-
25
- Capability: Universal
26
- Operation Type: AGGREGATION
27
- """
28
-
29
- OPERATION_NAME = "MIN"
30
- OPERATION_TYPE = OperationType.AGGREGATION
31
- SUPPORTED_NODE_TYPES = [] # Universal
32
-
33
- def _do_execute(self, action: Action, context: ExecutionContext) -> ExecutionResult:
34
- """Execute MIN operation."""
35
- params = action.params
36
- node = context.node
37
-
38
- result_data = self._execute_min(node, params, context)
39
-
40
- return ExecutionResult(
41
- success=True,
42
- data=result_data,
43
- operation=self.OPERATION_NAME,
44
- metadata={'operation': self.OPERATION_NAME}
45
- )
46
-
47
- def _execute_min(self, node: Any, params: Dict, context: ExecutionContext) -> Dict:
48
- """Execute min logic."""
49
- # Implementation here
50
- return {'result': 'MIN executed', 'params': params}
@@ -1,50 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- #exonware/xwnode/src/exonware/xwnode/queries/executors/aggregation/sum_executor.py
4
-
5
- SUM 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: 09-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
-
19
- class SumExecutor(AUniversalOperationExecutor):
20
- """
21
- SUM operation executor.
22
-
23
- Computes sum of numeric values
24
-
25
- Capability: Universal
26
- Operation Type: AGGREGATION
27
- """
28
-
29
- OPERATION_NAME = "SUM"
30
- OPERATION_TYPE = OperationType.AGGREGATION
31
- SUPPORTED_NODE_TYPES = [] # Universal
32
-
33
- def _do_execute(self, action: Action, context: ExecutionContext) -> ExecutionResult:
34
- """Execute SUM operation."""
35
- params = action.params
36
- node = context.node
37
-
38
- result_data = self._execute_sum(node, params, context)
39
-
40
- return ExecutionResult(
41
- success=True,
42
- data=result_data,
43
- operation=self.OPERATION_NAME,
44
- metadata={'operation': self.OPERATION_NAME}
45
- )
46
-
47
- def _execute_sum(self, node: Any, params: Dict, context: ExecutionContext) -> Dict:
48
- """Execute sum logic."""
49
- # Implementation here
50
- return {'result': 'SUM executed', 'params': params}
@@ -1,50 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- #exonware/xwnode/src/exonware/xwnode/queries/executors/aggregation/summarize_executor.py
4
-
5
- SUMMARIZE 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: 09-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
-
19
- class SummarizeExecutor(AUniversalOperationExecutor):
20
- """
21
- SUMMARIZE operation executor.
22
-
23
- Summarizes data with aggregations
24
-
25
- Capability: Universal
26
- Operation Type: AGGREGATION
27
- """
28
-
29
- OPERATION_NAME = "SUMMARIZE"
30
- OPERATION_TYPE = OperationType.AGGREGATION
31
- SUPPORTED_NODE_TYPES = [] # Universal
32
-
33
- def _do_execute(self, action: Action, context: ExecutionContext) -> ExecutionResult:
34
- """Execute SUMMARIZE operation."""
35
- params = action.params
36
- node = context.node
37
-
38
- result_data = self._execute_summarize(node, params, context)
39
-
40
- return ExecutionResult(
41
- success=True,
42
- data=result_data,
43
- operation=self.OPERATION_NAME,
44
- metadata={'operation': self.OPERATION_NAME}
45
- )
46
-
47
- def _execute_summarize(self, node: Any, params: Dict, context: ExecutionContext) -> Dict:
48
- """Execute summarize logic."""
49
- # Implementation here
50
- return {'result': 'SUMMARIZE executed', 'params': params}
@@ -1,9 +0,0 @@
1
- """Array operation executors."""
2
-
3
- from .slicing_executor import SlicingExecutor
4
- from .indexing_executor import IndexingExecutor
5
-
6
- __all__ = [
7
- 'SlicingExecutor',
8
- 'IndexingExecutor',
9
- ]
@@ -1,51 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- #exonware/xwnode/src/exonware/xwnode/queries/executors/array/indexing_executor.py
4
-
5
- INDEXING 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: 09-Oct-2025
12
- """
13
-
14
- from typing import Any, Dict, List
15
- from ..base import AOperationExecutor
16
- from ..contracts import Action, ExecutionContext, ExecutionResult
17
- from ..defs import OperationType
18
- from ...nodes.strategies.contracts import NodeType
19
-
20
- class IndexingExecutor(AOperationExecutor):
21
- """
22
- INDEXING operation executor.
23
-
24
- Array indexing operations
25
-
26
- Capability: LINEAR, MATRIX, TREE only
27
- Operation Type: ARRAY
28
- """
29
-
30
- OPERATION_NAME = "INDEXING"
31
- OPERATION_TYPE = OperationType.ARRAY
32
- SUPPORTED_NODE_TYPES = [NodeType.LINEAR, NodeType.MATRIX, NodeType.TREE]
33
-
34
- def _do_execute(self, action: Action, context: ExecutionContext) -> ExecutionResult:
35
- """Execute INDEXING operation."""
36
- params = action.params
37
- node = context.node
38
-
39
- result_data = self._execute_indexing(node, params, context)
40
-
41
- return ExecutionResult(
42
- success=True,
43
- data=result_data,
44
- operation=self.OPERATION_NAME,
45
- metadata={'operation': self.OPERATION_NAME}
46
- )
47
-
48
- def _execute_indexing(self, node: Any, params: Dict, context: ExecutionContext) -> Dict:
49
- """Execute indexing logic."""
50
- # Implementation here
51
- return {'result': 'INDEXING executed', 'params': params}
@@ -1,51 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- #exonware/xwnode/src/exonware/xwnode/queries/executors/array/slicing_executor.py
4
-
5
- SLICING 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: 09-Oct-2025
12
- """
13
-
14
- from typing import Any, Dict, List
15
- from ..base import AOperationExecutor
16
- from ..contracts import Action, ExecutionContext, ExecutionResult
17
- from ..defs import OperationType
18
- from ...nodes.strategies.contracts import NodeType
19
-
20
- class SlicingExecutor(AOperationExecutor):
21
- """
22
- SLICING operation executor.
23
-
24
- Array slicing operations
25
-
26
- Capability: LINEAR, MATRIX only
27
- Operation Type: ARRAY
28
- """
29
-
30
- OPERATION_NAME = "SLICING"
31
- OPERATION_TYPE = OperationType.ARRAY
32
- SUPPORTED_NODE_TYPES = [NodeType.LINEAR, NodeType.MATRIX]
33
-
34
- def _do_execute(self, action: Action, context: ExecutionContext) -> ExecutionResult:
35
- """Execute SLICING operation."""
36
- params = action.params
37
- node = context.node
38
-
39
- result_data = self._execute_slicing(node, params, context)
40
-
41
- return ExecutionResult(
42
- success=True,
43
- data=result_data,
44
- operation=self.OPERATION_NAME,
45
- metadata={'operation': self.OPERATION_NAME}
46
- )
47
-
48
- def _execute_slicing(self, node: Any, params: Dict, context: ExecutionContext) -> Dict:
49
- """Execute slicing logic."""
50
- # Implementation here
51
- return {'result': 'SLICING executed', 'params': params}
@@ -1,257 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- #exonware/xwnode/src/exonware/xwnode/queries/executors/base.py
4
-
5
- Operation Executor Base Classes
6
-
7
- This module provides base classes for operation executors with capability checking.
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
- import time
17
- from abc import ABC, abstractmethod
18
- from typing import Any, Dict, List, Optional
19
-
20
- from .contracts import (
21
- IOperationExecutor,
22
- Action,
23
- ExecutionContext,
24
- ExecutionResult,
25
- NodeType
26
- )
27
- from .defs import OperationCapability
28
- from .errors import UnsupportedOperationError # Reuse from root via errors.py
29
- from ...errors import XWNodeValueError
30
-
31
-
32
- class AOperationExecutor(IOperationExecutor):
33
- """
34
- Abstract base class for operation executors.
35
-
36
- Provides common functionality including:
37
- - Capability checking
38
- - Performance monitoring
39
- - Error handling
40
- - Validation
41
- """
42
-
43
- # Operation name (must be set by subclasses)
44
- OPERATION_NAME: str = "UNKNOWN"
45
-
46
- # Supported node types (empty = all types)
47
- SUPPORTED_NODE_TYPES: List[NodeType] = []
48
-
49
- # Required capabilities
50
- REQUIRED_CAPABILITIES: OperationCapability = OperationCapability.NONE
51
-
52
- def __init__(self):
53
- """Initialize operation executor."""
54
- self._execution_count = 0
55
- self._total_time = 0.0
56
- self._error_count = 0
57
-
58
- def execute(self, action: Action, context: ExecutionContext) -> ExecutionResult:
59
- """
60
- Execute operation with monitoring and error handling.
61
-
62
- This method implements the Template Method pattern:
63
- 1. Validate
64
- 2. Check capability
65
- 3. Execute (delegated to subclass)
66
- 4. Monitor performance
67
- """
68
- start_time = time.time()
69
-
70
- try:
71
- # Validate action
72
- if not self.validate(action, context):
73
- raise XWNodeValueError(f"Invalid action: {action.type}")
74
-
75
- # Check capability
76
- self.validate_capability_or_raise(context)
77
-
78
- # Execute (delegated to subclass)
79
- result = self._do_execute(action, context)
80
-
81
- # Update metrics
82
- execution_time = time.time() - start_time
83
- self._execution_count += 1
84
- self._total_time += execution_time
85
- result.execution_time = execution_time
86
-
87
- return result
88
-
89
- except Exception as e:
90
- self._error_count += 1
91
- execution_time = time.time() - start_time
92
-
93
- return ExecutionResult(
94
- data=None,
95
- success=False,
96
- error=str(e),
97
- execution_time=execution_time
98
- )
99
-
100
- @abstractmethod
101
- def _do_execute(self, action: Action, context: ExecutionContext) -> ExecutionResult:
102
- """
103
- Execute the actual operation (implemented by subclasses).
104
-
105
- Args:
106
- action: The action to execute
107
- context: Execution context
108
-
109
- Returns:
110
- ExecutionResult with data
111
- """
112
- pass
113
-
114
- def validate(self, action: Action, context: ExecutionContext) -> bool:
115
- """
116
- Validate action before execution.
117
-
118
- Default implementation checks basic requirements.
119
- Subclasses can override for specific validation.
120
- """
121
- if not action or not action.type:
122
- return False
123
- if not context or not context.node:
124
- return False
125
- return True
126
-
127
- def can_execute_on(self, node_type: NodeType) -> bool:
128
- """
129
- Check if this executor can operate on the given node type.
130
-
131
- Args:
132
- node_type: The node type to check
133
-
134
- Returns:
135
- True if this executor supports the node type
136
- """
137
- # Empty list means supports all types (universal operation)
138
- if not self.SUPPORTED_NODE_TYPES:
139
- return True
140
- return node_type in self.SUPPORTED_NODE_TYPES
141
-
142
- def validate_capability_or_raise(self, context: ExecutionContext) -> None:
143
- """
144
- Validate operation can execute on node, raise if not.
145
-
146
- Args:
147
- context: Execution context
148
-
149
- Raises:
150
- UnsupportedOperationError: If operation cannot execute on node type
151
- """
152
- # Get node's strategy type
153
- if hasattr(context.node, '_strategy') and hasattr(context.node._strategy, 'STRATEGY_TYPE'):
154
- node_type = context.node._strategy.STRATEGY_TYPE
155
- elif hasattr(context.node, 'STRATEGY_TYPE'):
156
- node_type = context.node.STRATEGY_TYPE
157
- else:
158
- # Default to TREE for backward compatibility
159
- node_type = NodeType.TREE
160
-
161
- # Check if operation can execute on this node type
162
- if not self.can_execute_on(node_type):
163
- supported = [nt.name for nt in self.SUPPORTED_NODE_TYPES]
164
- raise UnsupportedOperationError(
165
- self.OPERATION_NAME,
166
- node_type,
167
- f"Requires one of: {supported}"
168
- )
169
-
170
- def estimate_cost(self, action: Action, context: ExecutionContext) -> int:
171
- """
172
- Estimate execution cost.
173
-
174
- Default implementation returns fixed cost.
175
- Subclasses can override for more accurate estimates.
176
- """
177
- return 100
178
-
179
- def get_stats(self) -> Dict[str, Any]:
180
- """Get execution statistics for this executor."""
181
- avg_time = self._total_time / self._execution_count if self._execution_count > 0 else 0
182
-
183
- return {
184
- 'operation': self.OPERATION_NAME,
185
- 'execution_count': self._execution_count,
186
- 'total_time': self._total_time,
187
- 'average_time': avg_time,
188
- 'error_count': self._error_count,
189
- 'success_rate': (self._execution_count - self._error_count) / self._execution_count if self._execution_count > 0 else 1.0
190
- }
191
-
192
-
193
- class AUniversalOperationExecutor(AOperationExecutor):
194
- """
195
- Base class for universal operations that work on all node types.
196
-
197
- Universal operations:
198
- - SELECT, INSERT, UPDATE, DELETE
199
- - WHERE, FILTER
200
- - GROUP BY, COUNT, SUM, AVG
201
- - PROJECT, EXTEND
202
- """
203
-
204
- # Universal operations support all node types (empty list)
205
- SUPPORTED_NODE_TYPES: List[NodeType] = []
206
-
207
-
208
- class ATreeOperationExecutor(AOperationExecutor):
209
- """
210
- Base class for tree-specific operations.
211
-
212
- Tree operations:
213
- - BETWEEN, RANGE
214
- - ORDER BY
215
- - MIN, MAX (optimal on trees)
216
- """
217
-
218
- # Only works on tree nodes
219
- SUPPORTED_NODE_TYPES: List[NodeType] = [NodeType.TREE]
220
- REQUIRED_CAPABILITIES: OperationCapability = OperationCapability.REQUIRES_ORDERED
221
-
222
-
223
- class AGraphOperationExecutor(AOperationExecutor):
224
- """
225
- Base class for graph-specific operations.
226
-
227
- Graph operations:
228
- - MATCH, PATH
229
- - OUT, IN_TRAVERSE
230
- - Graph traversal
231
- """
232
-
233
- # Only works on graph nodes
234
- SUPPORTED_NODE_TYPES: List[NodeType] = [NodeType.GRAPH, NodeType.TREE] # Trees can act as graphs
235
-
236
-
237
- class ALinearOperationExecutor(AOperationExecutor):
238
- """
239
- Base class for linear-specific operations.
240
-
241
- Linear operations:
242
- - SLICING, INDEXING
243
- - Sequential operations
244
- """
245
-
246
- # Only works on linear and matrix nodes
247
- SUPPORTED_NODE_TYPES: List[NodeType] = [NodeType.LINEAR, NodeType.MATRIX]
248
-
249
-
250
- __all__ = [
251
- 'AOperationExecutor',
252
- 'AUniversalOperationExecutor',
253
- 'ATreeOperationExecutor',
254
- 'AGraphOperationExecutor',
255
- 'ALinearOperationExecutor',
256
- 'UnsupportedOperationError',
257
- ]