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,332 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- XWNode Query Action Executor
4
-
5
- This module implements the XWNode query action executor that provides
6
- a unified interface for executing queries across all supported query types
7
- using the existing XWNode strategy system.
8
-
9
- Company: eXonware.com
10
- Author: Eng. Muhammad AlShehri
11
- Email: connect@exonware.com
12
- Version: 0.0.1.21
13
- Generation Date: January 2, 2025
14
- """
15
-
16
- from typing import Any, Dict, List, Optional, Type
17
- from datetime import datetime
18
-
19
- from .base import AQueryActionExecutor
20
- from .xwquery_strategy import XWQueryScriptStrategy
21
- from ...base import XWNodeBase
22
- from ...contracts import QueryMode, QueryTrait
23
- from ...errors import XWNodeTypeError, XWNodeValueError
24
-
25
-
26
- class XWNodeQueryActionExecutor(AQueryActionExecutor):
27
- """
28
- XWNode implementation of query action executor.
29
-
30
- This executor provides a unified interface for executing queries across
31
- all 35+ supported query types using the existing XWNode strategy system.
32
- """
33
-
34
- def __init__(self):
35
- super().__init__()
36
- self._mode = QueryMode.AUTO
37
- self._traits = QueryTrait.STRUCTURED | QueryTrait.ANALYTICAL | QueryTrait.BATCH
38
-
39
- # All supported query types from XWNode
40
- self._supported_queries = [
41
- # Structured & Document Query Languages
42
- "SQL", "HIVEQL", "PIG", "CQL", "N1QL", "KQL", "DATALOG",
43
- "MQL", "PARTIQL",
44
-
45
- # Search Query Languages
46
- "ELASTIC_DSL", "EQL", "LUCENE",
47
-
48
- # Time Series & Monitoring
49
- "FLUX", "PROMQL",
50
-
51
- # Data Streaming
52
- "KSQL",
53
-
54
- # Graph Query Languages
55
- "GRAPHQL", "SPARQL", "GREMLIN", "CYPHER", "GQL",
56
-
57
- # ORM / Integrated Query
58
- "LINQ", "HQL",
59
-
60
- # Markup & Document Structure
61
- "JSONIQ", "JMESPATH", "JQ", "XQUERY", "XPATH",
62
-
63
- # Logs & Analytics
64
- "LOGQL", "SPL",
65
-
66
- # SQL Engines
67
- "TRINO_SQL", "BIGQUERY_SQL", "SNOWFLAKE_SQL",
68
-
69
- # Generic Query Languages
70
- "XML_QUERY", "JSON_QUERY"
71
- ]
72
-
73
- self._strategy_cache = {}
74
- self._execution_stats = {
75
- "total_queries": 0,
76
- "successful_queries": 0,
77
- "failed_queries": 0,
78
- "execution_times": []
79
- }
80
-
81
- def execute_query(self, query: str, query_type: str, **kwargs) -> Any:
82
- """Execute a query using the appropriate XWNode strategy."""
83
- if not self.validate_query(query, query_type):
84
- raise XWNodeValueError(f"Invalid {query_type} query: {query}")
85
-
86
- start_time = datetime.now()
87
- self._execution_stats["total_queries"] += 1
88
-
89
- try:
90
- # Get or create strategy instance
91
- strategy = self._get_strategy(query_type)
92
-
93
- # Execute the query
94
- result = strategy.execute(query, **kwargs)
95
-
96
- # Update stats
97
- execution_time = (datetime.now() - start_time).total_seconds()
98
- self._execution_stats["successful_queries"] += 1
99
- self._execution_stats["execution_times"].append(execution_time)
100
-
101
- return {
102
- "result": result,
103
- "query_type": query_type,
104
- "execution_time": f"{execution_time:.3f}s",
105
- "backend": "XWNODE",
106
- "strategy_used": strategy.__class__.__name__
107
- }
108
-
109
- except Exception as e:
110
- self._execution_stats["failed_queries"] += 1
111
- raise XWNodeValueError(f"Query execution failed: {e}")
112
-
113
- def validate_query(self, query: str, query_type: str) -> bool:
114
- """Validate if XWNode can handle this query type."""
115
- if query_type.upper() not in self._supported_queries:
116
- return False
117
-
118
- try:
119
- strategy = self._get_strategy(query_type)
120
- return strategy.validate_query(query)
121
- except Exception:
122
- return False
123
-
124
- def get_supported_query_types(self) -> List[str]:
125
- """Get list of query types supported by XWNode."""
126
- return self._supported_queries.copy()
127
-
128
- def _get_strategy(self, query_type: str) -> Any:
129
- """Get or create strategy instance for query type."""
130
- query_type_upper = query_type.upper()
131
-
132
- if query_type_upper in self._strategy_cache:
133
- return self._strategy_cache[query_type_upper]
134
-
135
- # Import and create strategy instance
136
- strategy_class = self._get_strategy_class(query_type_upper)
137
- if not strategy_class:
138
- raise XWNodeValueError(f"No strategy available for query type: {query_type}")
139
-
140
- strategy = strategy_class()
141
- self._strategy_cache[query_type_upper] = strategy
142
- return strategy
143
-
144
- def _get_strategy_class(self, query_type: str) -> Optional[Type]:
145
- """Get strategy class for query type."""
146
- strategy_map = {
147
- "SQL": "sql",
148
- "HIVEQL": "hiveql",
149
- "PIG": "pig",
150
- "CQL": "cql",
151
- "N1QL": "n1ql",
152
- "KQL": "kql",
153
- "DATALOG": "datalog",
154
- "MQL": "mql",
155
- "PARTIQL": "partiql",
156
- "ELASTIC_DSL": "elastic_dsl",
157
- "EQL": "eql",
158
- "LUCENE": "lucene",
159
- "FLUX": "flux",
160
- "PROMQL": "promql",
161
- "KSQL": "ksql",
162
- "GRAPHQL": "graphql",
163
- "SPARQL": "sparql",
164
- "GREMLIN": "gremlin",
165
- "CYPHER": "cypher",
166
- "GQL": "gql",
167
- "LINQ": "linq",
168
- "HQL": "hql",
169
- "JSONIQ": "jsoniq",
170
- "JMESPATH": "jmespath",
171
- "JQ": "jq",
172
- "XQUERY": "xquery",
173
- "XPATH": "xpath",
174
- "LOGQL": "logql",
175
- "SPL": "spl",
176
- "TRINO_SQL": "trino_sql",
177
- "BIGQUERY_SQL": "bigquery_sql",
178
- "SNOWFLAKE_SQL": "snowflake_sql",
179
- "XML_QUERY": "xml_query",
180
- "JSON_QUERY": "json_query"
181
- }
182
-
183
- module_name = strategy_map.get(query_type)
184
- if not module_name:
185
- return None
186
-
187
- try:
188
- module = __import__(f'.{module_name}', fromlist=['.'], package=__package__)
189
- strategy_class_name = f"{query_type.title()}Strategy"
190
- return getattr(module, strategy_class_name, None)
191
- except (ImportError, AttributeError):
192
- return None
193
-
194
- def to_native(self) -> XWQueryScriptStrategy:
195
- """Convert to XWQueryScriptStrategy using actions."""
196
- return XWQueryScriptStrategy()
197
-
198
- def to_actions_tree(self, query: str) -> XWNodeBase:
199
- """Convert query to actions tree using XWQuery Script."""
200
- script_strategy = XWQueryScriptStrategy()
201
- return script_strategy.parse_script(query).get_actions_tree()
202
-
203
- def from_actions_tree(self, actions_tree: XWNodeBase) -> str:
204
- """Convert actions tree to query using XWQuery Script."""
205
- script_strategy = XWQueryScriptStrategy(actions_tree)
206
- return script_strategy.to_format("SQL") # Default to SQL
207
-
208
- def get_execution_stats(self) -> Dict[str, Any]:
209
- """Get execution statistics."""
210
- stats = self._execution_stats.copy()
211
-
212
- if stats["execution_times"]:
213
- stats["avg_execution_time"] = sum(stats["execution_times"]) / len(stats["execution_times"])
214
- stats["min_execution_time"] = min(stats["execution_times"])
215
- stats["max_execution_time"] = max(stats["execution_times"])
216
- else:
217
- stats["avg_execution_time"] = 0
218
- stats["min_execution_time"] = 0
219
- stats["max_execution_time"] = 0
220
-
221
- stats["success_rate"] = (
222
- stats["successful_queries"] / stats["total_queries"]
223
- if stats["total_queries"] > 0 else 0
224
- )
225
-
226
- return stats
227
-
228
- def clear_cache(self):
229
- """Clear strategy cache."""
230
- self._strategy_cache.clear()
231
-
232
- def reset_stats(self):
233
- """Reset execution statistics."""
234
- self._execution_stats = {
235
- "total_queries": 0,
236
- "successful_queries": 0,
237
- "failed_queries": 0,
238
- "execution_times": []
239
- }
240
-
241
- def get_backend_info(self) -> Dict[str, Any]:
242
- """Get XWNode backend information."""
243
- return {
244
- "backend": "XWNODE",
245
- "version": "0.0.1",
246
- "capabilities": [
247
- "multi_language_queries",
248
- "format_agnostic",
249
- "strategy_pattern",
250
- "enterprise_features",
251
- "xwquery_script_support"
252
- ],
253
- "supported_query_types": len(self._supported_queries),
254
- "performance_class": "high_performance",
255
- "execution_stats": self.get_execution_stats()
256
- }
257
-
258
- def estimate_cost(self, query: str, query_type: str) -> Dict[str, Any]:
259
- """Estimate execution cost for XWNode."""
260
- try:
261
- strategy = self._get_strategy(query_type)
262
- plan = strategy.get_query_plan(query)
263
-
264
- return {
265
- "backend": "XWNODE",
266
- "complexity": plan.get("complexity", "UNKNOWN"),
267
- "estimated_cost": plan.get("estimated_cost", 0),
268
- "execution_time": f"{plan.get('estimated_cost', 0)}ms",
269
- "memory_usage": "low",
270
- "strategy_used": strategy.__class__.__name__
271
- }
272
- except Exception:
273
- return {
274
- "backend": "XWNODE",
275
- "complexity": "UNKNOWN",
276
- "estimated_cost": 0,
277
- "execution_time": "0ms",
278
- "memory_usage": "low",
279
- "strategy_used": "Unknown"
280
- }
281
-
282
- def execute(self, query: str, context: Dict[str, Any] = None, **kwargs) -> Any:
283
- """Execute query using XWNode strategies."""
284
- # Determine query type automatically if not specified
285
- query_type = kwargs.get('query_type', self._detect_query_type(query))
286
- return self.execute_query(query, query_type, **kwargs)
287
-
288
- def get_query_plan(self, query: str) -> Dict[str, Any]:
289
- """Get query execution plan."""
290
- query_type = self._detect_query_type(query)
291
- try:
292
- strategy = self._get_strategy(query_type)
293
- return strategy.get_query_plan(query)
294
- except Exception:
295
- return {
296
- "query_type": query_type,
297
- "complexity": "UNKNOWN",
298
- "estimated_cost": 0,
299
- "backend": "XWNODE"
300
- }
301
-
302
- def can_handle(self, query_string: str) -> bool:
303
- """Check if XWNode can handle this query."""
304
- query_type = self._detect_query_type(query_string)
305
- return query_type in self._supported_queries
306
-
307
- def get_supported_operations(self) -> List[str]:
308
- """Get list of supported operations."""
309
- return self._supported_queries.copy()
310
-
311
- def estimate_complexity(self, query_string: str) -> Dict[str, Any]:
312
- """Estimate query complexity."""
313
- query_type = self._detect_query_type(query_string)
314
- return self.estimate_cost(query_string, query_type)
315
-
316
- def _detect_query_type(self, query: str) -> str:
317
- """Detect query type from query string."""
318
- query_upper = query.upper()
319
-
320
- # Simple detection logic
321
- if any(keyword in query_upper for keyword in ['SELECT', 'INSERT', 'UPDATE', 'DELETE', 'CREATE', 'DROP']):
322
- return "SQL"
323
- elif 'MATCH' in query_upper and ('(' in query or ')' in query):
324
- return "CYPHER"
325
- elif 'PREFIX' in query_upper or 'SELECT' in query_upper and 'WHERE' in query_upper:
326
- return "SPARQL"
327
- elif query.strip().startswith('{') and 'query' in query_upper:
328
- return "GRAPHQL"
329
- elif 'FROM' in query_upper and 'WHERE' in query_upper:
330
- return "KQL"
331
- else:
332
- return "SQL" # Default fallback