exonware-xwnode 0.0.1.21__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 (250) hide show
  1. exonware/__init__.py +8 -1
  2. exonware/xwnode/__init__.py +18 -5
  3. exonware/xwnode/add_strategy_types.py +165 -0
  4. exonware/xwnode/base.py +7 -5
  5. exonware/xwnode/common/__init__.py +1 -1
  6. exonware/xwnode/common/graph/__init__.py +30 -0
  7. exonware/xwnode/common/graph/caching.py +131 -0
  8. exonware/xwnode/common/graph/contracts.py +100 -0
  9. exonware/xwnode/common/graph/errors.py +44 -0
  10. exonware/xwnode/common/graph/indexing.py +260 -0
  11. exonware/xwnode/common/graph/manager.py +568 -0
  12. exonware/xwnode/common/management/__init__.py +3 -5
  13. exonware/xwnode/common/management/manager.py +9 -9
  14. exonware/xwnode/common/management/migration.py +6 -6
  15. exonware/xwnode/common/monitoring/__init__.py +3 -5
  16. exonware/xwnode/common/monitoring/metrics.py +7 -3
  17. exonware/xwnode/common/monitoring/pattern_detector.py +2 -2
  18. exonware/xwnode/common/monitoring/performance_monitor.py +6 -2
  19. exonware/xwnode/common/patterns/__init__.py +3 -5
  20. exonware/xwnode/common/patterns/advisor.py +1 -1
  21. exonware/xwnode/common/patterns/flyweight.py +6 -2
  22. exonware/xwnode/common/patterns/registry.py +203 -184
  23. exonware/xwnode/common/utils/__init__.py +25 -11
  24. exonware/xwnode/common/utils/simple.py +1 -1
  25. exonware/xwnode/config.py +3 -8
  26. exonware/xwnode/contracts.py +4 -105
  27. exonware/xwnode/defs.py +413 -159
  28. exonware/xwnode/edges/strategies/__init__.py +86 -4
  29. exonware/xwnode/edges/strategies/_base_edge.py +2 -2
  30. exonware/xwnode/edges/strategies/adj_list.py +287 -121
  31. exonware/xwnode/edges/strategies/adj_matrix.py +316 -222
  32. exonware/xwnode/edges/strategies/base.py +1 -1
  33. exonware/xwnode/edges/strategies/{edge_bidir_wrapper.py → bidir_wrapper.py} +45 -4
  34. exonware/xwnode/edges/strategies/bitemporal.py +520 -0
  35. exonware/xwnode/edges/strategies/{edge_block_adj_matrix.py → block_adj_matrix.py} +77 -6
  36. exonware/xwnode/edges/strategies/bv_graph.py +664 -0
  37. exonware/xwnode/edges/strategies/compressed_graph.py +217 -0
  38. exonware/xwnode/edges/strategies/{edge_coo.py → coo.py} +46 -4
  39. exonware/xwnode/edges/strategies/{edge_csc.py → csc.py} +45 -4
  40. exonware/xwnode/edges/strategies/{edge_csr.py → csr.py} +94 -12
  41. exonware/xwnode/edges/strategies/{edge_dynamic_adj_list.py → dynamic_adj_list.py} +46 -4
  42. exonware/xwnode/edges/strategies/edge_list.py +168 -0
  43. exonware/xwnode/edges/strategies/edge_property_store.py +2 -2
  44. exonware/xwnode/edges/strategies/euler_tour.py +560 -0
  45. exonware/xwnode/edges/strategies/{edge_flow_network.py → flow_network.py} +2 -2
  46. exonware/xwnode/edges/strategies/graphblas.py +449 -0
  47. exonware/xwnode/edges/strategies/hnsw.py +637 -0
  48. exonware/xwnode/edges/strategies/hop2_labels.py +467 -0
  49. exonware/xwnode/edges/strategies/{edge_hyperedge_set.py → hyperedge_set.py} +2 -2
  50. exonware/xwnode/edges/strategies/incidence_matrix.py +250 -0
  51. exonware/xwnode/edges/strategies/k2_tree.py +613 -0
  52. exonware/xwnode/edges/strategies/link_cut.py +626 -0
  53. exonware/xwnode/edges/strategies/multiplex.py +532 -0
  54. exonware/xwnode/edges/strategies/{edge_neural_graph.py → neural_graph.py} +2 -2
  55. exonware/xwnode/edges/strategies/{edge_octree.py → octree.py} +69 -11
  56. exonware/xwnode/edges/strategies/{edge_quadtree.py → quadtree.py} +66 -10
  57. exonware/xwnode/edges/strategies/roaring_adj.py +438 -0
  58. exonware/xwnode/edges/strategies/{edge_rtree.py → rtree.py} +43 -5
  59. exonware/xwnode/edges/strategies/{edge_temporal_edgeset.py → temporal_edgeset.py} +24 -5
  60. exonware/xwnode/edges/strategies/{edge_tree_graph_basic.py → tree_graph_basic.py} +78 -7
  61. exonware/xwnode/edges/strategies/{edge_weighted_graph.py → weighted_graph.py} +188 -10
  62. exonware/xwnode/errors.py +3 -6
  63. exonware/xwnode/facade.py +20 -20
  64. exonware/xwnode/nodes/strategies/__init__.py +29 -9
  65. exonware/xwnode/nodes/strategies/adjacency_list.py +650 -177
  66. exonware/xwnode/nodes/strategies/aho_corasick.py +358 -183
  67. exonware/xwnode/nodes/strategies/array_list.py +36 -3
  68. exonware/xwnode/nodes/strategies/art.py +581 -0
  69. exonware/xwnode/nodes/strategies/{node_avl_tree.py → avl_tree.py} +77 -6
  70. exonware/xwnode/nodes/strategies/{node_b_plus_tree.py → b_plus_tree.py} +81 -40
  71. exonware/xwnode/nodes/strategies/{node_btree.py → b_tree.py} +79 -9
  72. exonware/xwnode/nodes/strategies/base.py +469 -98
  73. exonware/xwnode/nodes/strategies/{node_bitmap.py → bitmap.py} +12 -12
  74. exonware/xwnode/nodes/strategies/{node_bitset_dynamic.py → bitset_dynamic.py} +11 -11
  75. exonware/xwnode/nodes/strategies/{node_bloom_filter.py → bloom_filter.py} +15 -2
  76. exonware/xwnode/nodes/strategies/bloomier_filter.py +519 -0
  77. exonware/xwnode/nodes/strategies/bw_tree.py +531 -0
  78. exonware/xwnode/nodes/strategies/contracts.py +1 -1
  79. exonware/xwnode/nodes/strategies/{node_count_min_sketch.py → count_min_sketch.py} +3 -2
  80. exonware/xwnode/nodes/strategies/{node_cow_tree.py → cow_tree.py} +135 -13
  81. exonware/xwnode/nodes/strategies/crdt_map.py +629 -0
  82. exonware/xwnode/nodes/strategies/{node_cuckoo_hash.py → cuckoo_hash.py} +2 -2
  83. exonware/xwnode/nodes/strategies/{node_xdata_optimized.py → data_interchange_optimized.py} +21 -4
  84. exonware/xwnode/nodes/strategies/dawg.py +876 -0
  85. exonware/xwnode/nodes/strategies/deque.py +321 -153
  86. exonware/xwnode/nodes/strategies/extendible_hash.py +93 -0
  87. exonware/xwnode/nodes/strategies/{node_fenwick_tree.py → fenwick_tree.py} +111 -19
  88. exonware/xwnode/nodes/strategies/hamt.py +403 -0
  89. exonware/xwnode/nodes/strategies/hash_map.py +354 -67
  90. exonware/xwnode/nodes/strategies/heap.py +105 -5
  91. exonware/xwnode/nodes/strategies/hopscotch_hash.py +525 -0
  92. exonware/xwnode/nodes/strategies/{node_hyperloglog.py → hyperloglog.py} +6 -5
  93. exonware/xwnode/nodes/strategies/interval_tree.py +742 -0
  94. exonware/xwnode/nodes/strategies/kd_tree.py +703 -0
  95. exonware/xwnode/nodes/strategies/learned_index.py +533 -0
  96. exonware/xwnode/nodes/strategies/linear_hash.py +93 -0
  97. exonware/xwnode/nodes/strategies/linked_list.py +316 -119
  98. exonware/xwnode/nodes/strategies/{node_lsm_tree.py → lsm_tree.py} +219 -15
  99. exonware/xwnode/nodes/strategies/masstree.py +130 -0
  100. exonware/xwnode/nodes/strategies/{node_persistent_tree.py → persistent_tree.py} +149 -9
  101. exonware/xwnode/nodes/strategies/priority_queue.py +544 -132
  102. exonware/xwnode/nodes/strategies/queue.py +249 -120
  103. exonware/xwnode/nodes/strategies/{node_red_black_tree.py → red_black_tree.py} +183 -72
  104. exonware/xwnode/nodes/strategies/{node_roaring_bitmap.py → roaring_bitmap.py} +19 -6
  105. exonware/xwnode/nodes/strategies/rope.py +717 -0
  106. exonware/xwnode/nodes/strategies/{node_segment_tree.py → segment_tree.py} +106 -106
  107. exonware/xwnode/nodes/strategies/{node_set_hash.py → set_hash.py} +30 -29
  108. exonware/xwnode/nodes/strategies/{node_skip_list.py → skip_list.py} +74 -6
  109. exonware/xwnode/nodes/strategies/sparse_matrix.py +427 -131
  110. exonware/xwnode/nodes/strategies/{node_splay_tree.py → splay_tree.py} +55 -6
  111. exonware/xwnode/nodes/strategies/stack.py +244 -112
  112. exonware/xwnode/nodes/strategies/{node_suffix_array.py → suffix_array.py} +5 -1
  113. exonware/xwnode/nodes/strategies/t_tree.py +94 -0
  114. exonware/xwnode/nodes/strategies/{node_treap.py → treap.py} +75 -6
  115. exonware/xwnode/nodes/strategies/{node_tree_graph_hybrid.py → tree_graph_hybrid.py} +46 -5
  116. exonware/xwnode/nodes/strategies/trie.py +153 -9
  117. exonware/xwnode/nodes/strategies/union_find.py +111 -5
  118. exonware/xwnode/nodes/strategies/veb_tree.py +856 -0
  119. exonware/xwnode/strategies/__init__.py +5 -51
  120. exonware/xwnode/version.py +3 -3
  121. {exonware_xwnode-0.0.1.21.dist-info → exonware_xwnode-0.0.1.23.dist-info}/METADATA +23 -3
  122. exonware_xwnode-0.0.1.23.dist-info/RECORD +130 -0
  123. exonware/xwnode/edges/strategies/edge_adj_list.py +0 -353
  124. exonware/xwnode/edges/strategies/edge_adj_matrix.py +0 -445
  125. exonware/xwnode/nodes/strategies/_base_node.py +0 -307
  126. exonware/xwnode/nodes/strategies/node_aho_corasick.py +0 -525
  127. exonware/xwnode/nodes/strategies/node_array_list.py +0 -179
  128. exonware/xwnode/nodes/strategies/node_hash_map.py +0 -273
  129. exonware/xwnode/nodes/strategies/node_heap.py +0 -196
  130. exonware/xwnode/nodes/strategies/node_linked_list.py +0 -413
  131. exonware/xwnode/nodes/strategies/node_trie.py +0 -257
  132. exonware/xwnode/nodes/strategies/node_union_find.py +0 -192
  133. exonware/xwnode/queries/executors/__init__.py +0 -47
  134. exonware/xwnode/queries/executors/advanced/__init__.py +0 -37
  135. exonware/xwnode/queries/executors/advanced/aggregate_executor.py +0 -50
  136. exonware/xwnode/queries/executors/advanced/ask_executor.py +0 -50
  137. exonware/xwnode/queries/executors/advanced/construct_executor.py +0 -50
  138. exonware/xwnode/queries/executors/advanced/describe_executor.py +0 -50
  139. exonware/xwnode/queries/executors/advanced/for_loop_executor.py +0 -50
  140. exonware/xwnode/queries/executors/advanced/foreach_executor.py +0 -50
  141. exonware/xwnode/queries/executors/advanced/join_executor.py +0 -50
  142. exonware/xwnode/queries/executors/advanced/let_executor.py +0 -50
  143. exonware/xwnode/queries/executors/advanced/mutation_executor.py +0 -50
  144. exonware/xwnode/queries/executors/advanced/options_executor.py +0 -50
  145. exonware/xwnode/queries/executors/advanced/pipe_executor.py +0 -50
  146. exonware/xwnode/queries/executors/advanced/subscribe_executor.py +0 -50
  147. exonware/xwnode/queries/executors/advanced/subscription_executor.py +0 -50
  148. exonware/xwnode/queries/executors/advanced/union_executor.py +0 -50
  149. exonware/xwnode/queries/executors/advanced/window_executor.py +0 -51
  150. exonware/xwnode/queries/executors/advanced/with_cte_executor.py +0 -50
  151. exonware/xwnode/queries/executors/aggregation/__init__.py +0 -21
  152. exonware/xwnode/queries/executors/aggregation/avg_executor.py +0 -50
  153. exonware/xwnode/queries/executors/aggregation/count_executor.py +0 -38
  154. exonware/xwnode/queries/executors/aggregation/distinct_executor.py +0 -50
  155. exonware/xwnode/queries/executors/aggregation/group_executor.py +0 -50
  156. exonware/xwnode/queries/executors/aggregation/having_executor.py +0 -50
  157. exonware/xwnode/queries/executors/aggregation/max_executor.py +0 -50
  158. exonware/xwnode/queries/executors/aggregation/min_executor.py +0 -50
  159. exonware/xwnode/queries/executors/aggregation/sum_executor.py +0 -50
  160. exonware/xwnode/queries/executors/aggregation/summarize_executor.py +0 -50
  161. exonware/xwnode/queries/executors/array/__init__.py +0 -9
  162. exonware/xwnode/queries/executors/array/indexing_executor.py +0 -51
  163. exonware/xwnode/queries/executors/array/slicing_executor.py +0 -51
  164. exonware/xwnode/queries/executors/base.py +0 -257
  165. exonware/xwnode/queries/executors/capability_checker.py +0 -204
  166. exonware/xwnode/queries/executors/contracts.py +0 -166
  167. exonware/xwnode/queries/executors/core/__init__.py +0 -17
  168. exonware/xwnode/queries/executors/core/create_executor.py +0 -96
  169. exonware/xwnode/queries/executors/core/delete_executor.py +0 -99
  170. exonware/xwnode/queries/executors/core/drop_executor.py +0 -100
  171. exonware/xwnode/queries/executors/core/insert_executor.py +0 -39
  172. exonware/xwnode/queries/executors/core/select_executor.py +0 -152
  173. exonware/xwnode/queries/executors/core/update_executor.py +0 -102
  174. exonware/xwnode/queries/executors/data/__init__.py +0 -13
  175. exonware/xwnode/queries/executors/data/alter_executor.py +0 -50
  176. exonware/xwnode/queries/executors/data/load_executor.py +0 -50
  177. exonware/xwnode/queries/executors/data/merge_executor.py +0 -50
  178. exonware/xwnode/queries/executors/data/store_executor.py +0 -50
  179. exonware/xwnode/queries/executors/defs.py +0 -93
  180. exonware/xwnode/queries/executors/engine.py +0 -221
  181. exonware/xwnode/queries/executors/errors.py +0 -68
  182. exonware/xwnode/queries/executors/filtering/__init__.py +0 -25
  183. exonware/xwnode/queries/executors/filtering/between_executor.py +0 -80
  184. exonware/xwnode/queries/executors/filtering/filter_executor.py +0 -79
  185. exonware/xwnode/queries/executors/filtering/has_executor.py +0 -70
  186. exonware/xwnode/queries/executors/filtering/in_executor.py +0 -70
  187. exonware/xwnode/queries/executors/filtering/like_executor.py +0 -76
  188. exonware/xwnode/queries/executors/filtering/optional_executor.py +0 -76
  189. exonware/xwnode/queries/executors/filtering/range_executor.py +0 -80
  190. exonware/xwnode/queries/executors/filtering/term_executor.py +0 -77
  191. exonware/xwnode/queries/executors/filtering/values_executor.py +0 -71
  192. exonware/xwnode/queries/executors/filtering/where_executor.py +0 -44
  193. exonware/xwnode/queries/executors/graph/__init__.py +0 -15
  194. exonware/xwnode/queries/executors/graph/in_traverse_executor.py +0 -51
  195. exonware/xwnode/queries/executors/graph/match_executor.py +0 -51
  196. exonware/xwnode/queries/executors/graph/out_executor.py +0 -51
  197. exonware/xwnode/queries/executors/graph/path_executor.py +0 -51
  198. exonware/xwnode/queries/executors/graph/return_executor.py +0 -51
  199. exonware/xwnode/queries/executors/ordering/__init__.py +0 -9
  200. exonware/xwnode/queries/executors/ordering/by_executor.py +0 -50
  201. exonware/xwnode/queries/executors/ordering/order_executor.py +0 -51
  202. exonware/xwnode/queries/executors/projection/__init__.py +0 -9
  203. exonware/xwnode/queries/executors/projection/extend_executor.py +0 -50
  204. exonware/xwnode/queries/executors/projection/project_executor.py +0 -50
  205. exonware/xwnode/queries/executors/registry.py +0 -173
  206. exonware/xwnode/queries/parsers/__init__.py +0 -26
  207. exonware/xwnode/queries/parsers/base.py +0 -86
  208. exonware/xwnode/queries/parsers/contracts.py +0 -46
  209. exonware/xwnode/queries/parsers/errors.py +0 -53
  210. exonware/xwnode/queries/parsers/sql_param_extractor.py +0 -318
  211. exonware/xwnode/queries/strategies/__init__.py +0 -24
  212. exonware/xwnode/queries/strategies/base.py +0 -236
  213. exonware/xwnode/queries/strategies/cql.py +0 -201
  214. exonware/xwnode/queries/strategies/cypher.py +0 -181
  215. exonware/xwnode/queries/strategies/datalog.py +0 -70
  216. exonware/xwnode/queries/strategies/elastic_dsl.py +0 -70
  217. exonware/xwnode/queries/strategies/eql.py +0 -70
  218. exonware/xwnode/queries/strategies/flux.py +0 -70
  219. exonware/xwnode/queries/strategies/gql.py +0 -70
  220. exonware/xwnode/queries/strategies/graphql.py +0 -240
  221. exonware/xwnode/queries/strategies/gremlin.py +0 -181
  222. exonware/xwnode/queries/strategies/hiveql.py +0 -214
  223. exonware/xwnode/queries/strategies/hql.py +0 -70
  224. exonware/xwnode/queries/strategies/jmespath.py +0 -219
  225. exonware/xwnode/queries/strategies/jq.py +0 -66
  226. exonware/xwnode/queries/strategies/json_query.py +0 -66
  227. exonware/xwnode/queries/strategies/jsoniq.py +0 -248
  228. exonware/xwnode/queries/strategies/kql.py +0 -70
  229. exonware/xwnode/queries/strategies/linq.py +0 -238
  230. exonware/xwnode/queries/strategies/logql.py +0 -70
  231. exonware/xwnode/queries/strategies/mql.py +0 -68
  232. exonware/xwnode/queries/strategies/n1ql.py +0 -210
  233. exonware/xwnode/queries/strategies/partiql.py +0 -70
  234. exonware/xwnode/queries/strategies/pig.py +0 -215
  235. exonware/xwnode/queries/strategies/promql.py +0 -70
  236. exonware/xwnode/queries/strategies/sparql.py +0 -220
  237. exonware/xwnode/queries/strategies/sql.py +0 -275
  238. exonware/xwnode/queries/strategies/xml_query.py +0 -66
  239. exonware/xwnode/queries/strategies/xpath.py +0 -223
  240. exonware/xwnode/queries/strategies/xquery.py +0 -258
  241. exonware/xwnode/queries/strategies/xwnode_executor.py +0 -332
  242. exonware/xwnode/queries/strategies/xwquery.py +0 -456
  243. exonware_xwnode-0.0.1.21.dist-info/RECORD +0 -214
  244. /exonware/xwnode/nodes/strategies/{node_ordered_map.py → ordered_map.py} +0 -0
  245. /exonware/xwnode/nodes/strategies/{node_ordered_map_balanced.py → ordered_map_balanced.py} +0 -0
  246. /exonware/xwnode/nodes/strategies/{node_patricia.py → patricia.py} +0 -0
  247. /exonware/xwnode/nodes/strategies/{node_radix_trie.py → radix_trie.py} +0 -0
  248. /exonware/xwnode/nodes/strategies/{node_set_tree.py → set_tree.py} +0 -0
  249. {exonware_xwnode-0.0.1.21.dist-info → exonware_xwnode-0.0.1.23.dist-info}/WHEEL +0 -0
  250. {exonware_xwnode-0.0.1.21.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.21
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.21
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.21
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.21
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.21
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.21
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.21
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
- ]