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,214 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- HiveQL Query Strategy
4
-
5
- This module implements the HiveQL query strategy for Apache Hive SQL operations.
6
-
7
- Company: eXonware.com
8
- Author: Eng. Muhammad AlShehri
9
- Email: connect@exonware.com
10
- Version: 0.0.1.21
11
- Generation Date: January 2, 2025
12
- """
13
-
14
- import re
15
- from typing import Any, Dict, List, Optional, Union
16
- from .base import AStructuredQueryStrategy
17
- from ...errors import XWNodeTypeError, XWNodeValueError
18
- from ...contracts import QueryMode, QueryTrait
19
-
20
-
21
- class HiveQLStrategy(AStructuredQueryStrategy):
22
- """
23
- HiveQL query strategy for Apache Hive SQL operations.
24
-
25
- Supports:
26
- - Hive-specific SQL extensions
27
- - Partitioned tables
28
- - Bucketed tables
29
- - UDFs and UDAFs
30
- - MapReduce operations
31
- """
32
-
33
- def __init__(self, **options):
34
- super().__init__(**options)
35
- self._mode = QueryMode.HIVEQL
36
- self._traits = QueryTrait.STRUCTURED | QueryTrait.ANALYTICAL | QueryTrait.BATCH
37
-
38
- def execute(self, query: str, **kwargs) -> Any:
39
- """Execute HiveQL query."""
40
- if not self.validate_query(query):
41
- raise XWNodeValueError(f"Invalid HiveQL query: {query}")
42
-
43
- query_type = self._get_query_type(query)
44
-
45
- if query_type == "SELECT":
46
- return self._execute_select(query, **kwargs)
47
- elif query_type == "INSERT":
48
- return self._execute_insert(query, **kwargs)
49
- elif query_type == "CREATE":
50
- return self._execute_create(query, **kwargs)
51
- elif query_type == "LOAD":
52
- return self._execute_load(query, **kwargs)
53
- else:
54
- raise XWNodeValueError(f"Unsupported query type: {query_type}")
55
-
56
- def validate_query(self, query: str) -> bool:
57
- """Validate HiveQL query syntax."""
58
- if not query or not isinstance(query, str):
59
- return False
60
-
61
- # HiveQL validation
62
- query = query.strip().upper()
63
- valid_operations = ["SELECT", "INSERT", "CREATE", "DROP", "ALTER", "LOAD", "EXPORT", "IMPORT"]
64
-
65
- for operation in valid_operations:
66
- if query.startswith(operation):
67
- return True
68
-
69
- return False
70
-
71
- def get_query_plan(self, query: str) -> Dict[str, Any]:
72
- """Get HiveQL query execution plan."""
73
- query_type = self._get_query_type(query)
74
-
75
- return {
76
- "query_type": query_type,
77
- "operation": query_type,
78
- "complexity": self._estimate_complexity(query),
79
- "estimated_cost": self._estimate_cost(query),
80
- "mapreduce_jobs": self._estimate_mapreduce_jobs(query),
81
- "optimization_hints": self._get_optimization_hints(query)
82
- }
83
-
84
- def select_query(self, table: str, columns: List[str], where_clause: str = None) -> Any:
85
- """Execute SELECT query."""
86
- query = f"SELECT {', '.join(columns)} FROM {table}"
87
- if where_clause:
88
- query += f" WHERE {where_clause}"
89
-
90
- return self.execute(query)
91
-
92
- def insert_query(self, table: str, data: Dict[str, Any]) -> Any:
93
- """Execute INSERT query."""
94
- columns = list(data.keys())
95
- values = list(data.values())
96
-
97
- query = f"INSERT INTO {table} ({', '.join(columns)}) VALUES ({', '.join(['?' for _ in values])})"
98
- return self.execute(query, values=values)
99
-
100
- def update_query(self, table: str, data: Dict[str, Any], where_clause: str = None) -> Any:
101
- """Execute UPDATE query."""
102
- # HiveQL doesn't support UPDATE, use INSERT OVERWRITE instead
103
- set_clause = ', '.join([f"{k} = ?" for k in data.keys()])
104
- query = f"INSERT OVERWRITE TABLE {table} SELECT {set_clause} FROM {table}"
105
-
106
- if where_clause:
107
- query += f" WHERE {where_clause}"
108
-
109
- return self.execute(query, values=list(data.values()))
110
-
111
- def delete_query(self, table: str, where_clause: str = None) -> Any:
112
- """Execute DELETE query."""
113
- # HiveQL doesn't support DELETE, use INSERT OVERWRITE instead
114
- query = f"INSERT OVERWRITE TABLE {table} SELECT * FROM {table}"
115
- if where_clause:
116
- query += f" WHERE NOT ({where_clause})"
117
-
118
- return self.execute(query)
119
-
120
- def join_query(self, tables: List[str], join_conditions: List[str]) -> Any:
121
- """Execute JOIN query."""
122
- if len(tables) < 2:
123
- raise XWNodeValueError("JOIN requires at least 2 tables")
124
-
125
- query = f"SELECT * FROM {tables[0]}"
126
- for i, table in enumerate(tables[1:], 1):
127
- if i <= len(join_conditions):
128
- query += f" JOIN {table} ON {join_conditions[i-1]}"
129
- else:
130
- query += f" CROSS JOIN {table}"
131
-
132
- return self.execute(query)
133
-
134
- def aggregate_query(self, table: str, functions: List[str], group_by: List[str] = None) -> Any:
135
- """Execute aggregate query."""
136
- query = f"SELECT {', '.join(functions)} FROM {table}"
137
- if group_by:
138
- query += f" GROUP BY {', '.join(group_by)}"
139
-
140
- return self.execute(query)
141
-
142
- def _get_query_type(self, query: str) -> str:
143
- """Extract query type from HiveQL query."""
144
- query = query.strip().upper()
145
- for operation in ["SELECT", "INSERT", "CREATE", "DROP", "ALTER", "LOAD", "EXPORT", "IMPORT"]:
146
- if query.startswith(operation):
147
- return operation
148
- return "UNKNOWN"
149
-
150
- def _execute_select(self, query: str, **kwargs) -> Any:
151
- """Execute SELECT query."""
152
- return {"result": "HiveQL SELECT executed", "query": query}
153
-
154
- def _execute_insert(self, query: str, **kwargs) -> Any:
155
- """Execute INSERT query."""
156
- return {"result": "HiveQL INSERT executed", "query": query}
157
-
158
- def _execute_create(self, query: str, **kwargs) -> Any:
159
- """Execute CREATE query."""
160
- return {"result": "HiveQL CREATE executed", "query": query}
161
-
162
- def _execute_load(self, query: str, **kwargs) -> Any:
163
- """Execute LOAD query."""
164
- return {"result": "HiveQL LOAD executed", "query": query}
165
-
166
- def _estimate_complexity(self, query: str) -> str:
167
- """Estimate query complexity."""
168
- query = query.upper()
169
- if "JOIN" in query or "UNION" in query:
170
- return "HIGH"
171
- elif "GROUP BY" in query or "ORDER BY" in query:
172
- return "MEDIUM"
173
- else:
174
- return "LOW"
175
-
176
- def _estimate_cost(self, query: str) -> int:
177
- """Estimate query cost."""
178
- complexity = self._estimate_complexity(query)
179
- if complexity == "HIGH":
180
- return 200 # Higher cost due to MapReduce
181
- elif complexity == "MEDIUM":
182
- return 100
183
- else:
184
- return 50
185
-
186
- def _estimate_mapreduce_jobs(self, query: str) -> int:
187
- """Estimate number of MapReduce jobs."""
188
- query = query.upper()
189
- jobs = 1 # Base job
190
-
191
- if "JOIN" in query:
192
- jobs += 1
193
- if "GROUP BY" in query:
194
- jobs += 1
195
- if "ORDER BY" in query:
196
- jobs += 1
197
-
198
- return jobs
199
-
200
- def _get_optimization_hints(self, query: str) -> List[str]:
201
- """Get query optimization hints."""
202
- hints = []
203
- query = query.upper()
204
-
205
- if "SELECT *" in query:
206
- hints.append("Consider specifying columns instead of using *")
207
- if "WHERE" not in query and "SELECT" in query:
208
- hints.append("Consider adding WHERE clause to limit results")
209
- if "JOIN" in query:
210
- hints.append("Consider using partitioned tables for JOINs")
211
- if "GROUP BY" in query:
212
- hints.append("Consider using bucketed tables for GROUP BY")
213
-
214
- return hints
@@ -1,70 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- HQL Query Strategy
4
-
5
- This module implements the HQL query strategy for Hibernate Query Language operations.
6
-
7
- Company: eXonware.com
8
- Author: Eng. Muhammad AlShehri
9
- Email: connect@exonware.com
10
- Version: 0.0.1.21
11
- Generation Date: January 2, 2025
12
- """
13
-
14
- from typing import Any, Dict, List, Optional
15
- from .base import AStructuredQueryStrategy
16
- from ...errors import XWNodeValueError
17
- from ...contracts import QueryMode, QueryTrait
18
-
19
-
20
- class HQLStrategy(AStructuredQueryStrategy):
21
- """HQL query strategy for Hibernate Query Language operations."""
22
-
23
- def __init__(self, **options):
24
- super().__init__(**options)
25
- self._mode = QueryMode.HQL
26
- self._traits = QueryTrait.STRUCTURED | QueryTrait.ANALYTICAL | QueryTrait.BATCH
27
-
28
- def execute(self, query: str, **kwargs) -> Any:
29
- """Execute HQL query."""
30
- if not self.validate_query(query):
31
- raise XWNodeValueError(f"Invalid HQL query: {query}")
32
- return {"result": "HQL query executed", "query": query}
33
-
34
- def validate_query(self, query: str) -> bool:
35
- """Validate HQL query syntax."""
36
- if not query or not isinstance(query, str):
37
- return False
38
- return any(op in query.upper() for op in ["FROM", "SELECT", "WHERE", "UPDATE", "DELETE", "INSERT"])
39
-
40
- def get_query_plan(self, query: str) -> Dict[str, Any]:
41
- """Get HQL query execution plan."""
42
- return {
43
- "query_type": "HQL",
44
- "complexity": "MEDIUM",
45
- "estimated_cost": 100
46
- }
47
-
48
- def select_query(self, table: str, columns: List[str], where_clause: str = None) -> Any:
49
- """Execute SELECT query."""
50
- return self.execute(f"SELECT {', '.join(columns)} FROM {table}")
51
-
52
- def insert_query(self, table: str, data: Dict[str, Any]) -> Any:
53
- """Execute INSERT query."""
54
- return self.execute(f"INSERT INTO {table} VALUES {data}")
55
-
56
- def update_query(self, table: str, data: Dict[str, Any], where_clause: str = None) -> Any:
57
- """Execute UPDATE query."""
58
- return self.execute(f"UPDATE {table} SET {data}")
59
-
60
- def delete_query(self, table: str, where_clause: str = None) -> Any:
61
- """Execute DELETE query."""
62
- return self.execute(f"DELETE FROM {table}")
63
-
64
- def join_query(self, tables: List[str], join_conditions: List[str]) -> Any:
65
- """Execute JOIN query."""
66
- return self.execute(f"FROM {tables[0]} JOIN {tables[1]}")
67
-
68
- def aggregate_query(self, table: str, functions: List[str], group_by: List[str] = None) -> Any:
69
- """Execute aggregate query."""
70
- return self.execute(f"SELECT {', '.join(functions)} FROM {table}")
@@ -1,219 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- JMESPath Query Strategy
4
-
5
- This module implements the JMESPath query strategy for JSON data queries.
6
-
7
- Company: eXonware.com
8
- Author: Eng. Muhammad AlShehri
9
- Email: connect@exonware.com
10
- Version: 0.0.1.21
11
- Generation Date: January 2, 2025
12
- """
13
-
14
- import re
15
- from typing import Any, Dict, List, Optional, Union
16
- from .base import ADocumentQueryStrategy
17
- from ...errors import XWNodeTypeError, XWNodeValueError
18
- from ...contracts import QueryMode, QueryTrait
19
-
20
-
21
- class JMESPathStrategy(ADocumentQueryStrategy):
22
- """
23
- JMESPath query strategy for JSON data queries.
24
-
25
- Supports:
26
- - JMESPath expressions
27
- - Projections and filters
28
- - Functions and operators
29
- - Multi-select and pipe expressions
30
- - Flatten and sort operations
31
- """
32
-
33
- def __init__(self, **options):
34
- super().__init__(**options)
35
- self._mode = QueryMode.JMESPATH
36
- self._traits = QueryTrait.DOCUMENT | QueryTrait.STRUCTURED | QueryTrait.ANALYTICAL
37
-
38
- def execute(self, query: str, **kwargs) -> Any:
39
- """Execute JMESPath query."""
40
- if not self.validate_query(query):
41
- raise XWNodeValueError(f"Invalid JMESPath query: {query}")
42
-
43
- query_type = self._get_query_type(query)
44
-
45
- if query_type == "projection":
46
- return self._execute_projection(query, **kwargs)
47
- elif query_type == "filter":
48
- return self._execute_filter(query, **kwargs)
49
- elif query_type == "function":
50
- return self._execute_function(query, **kwargs)
51
- else:
52
- raise XWNodeValueError(f"Unsupported query type: {query_type}")
53
-
54
- def validate_query(self, query: str) -> bool:
55
- """Validate JMESPath query syntax."""
56
- if not query or not isinstance(query, str):
57
- return False
58
-
59
- # Basic JMESPath validation
60
- query = query.strip()
61
-
62
- # Check for JMESPath syntax
63
- if query.startswith(".") or query.startswith("[") or query.startswith("@"):
64
- return True
65
-
66
- # Check for JMESPath functions
67
- jmespath_functions = ["length", "keys", "values", "sort", "reverse", "flatten", "unique", "join", "split", "to_string", "to_number", "type", "starts_with", "ends_with", "contains", "abs", "ceil", "floor", "max", "min", "sum", "avg", "sort_by", "group_by", "map", "filter", "merge", "merge_left", "merge_right"]
68
-
69
- for func in jmespath_functions:
70
- if func in query:
71
- return True
72
-
73
- # Check for operators
74
- if "||" in query or "&&" in query or "==" in query or "!=" in query or ">" in query or "<" in query:
75
- return True
76
-
77
- return False
78
-
79
- def get_query_plan(self, query: str) -> Dict[str, Any]:
80
- """Get JMESPath query execution plan."""
81
- query_type = self._get_query_type(query)
82
-
83
- return {
84
- "query_type": query_type,
85
- "operation": query_type,
86
- "complexity": self._estimate_complexity(query),
87
- "estimated_cost": self._estimate_cost(query),
88
- "expressions": self._extract_expressions(query),
89
- "optimization_hints": self._get_optimization_hints(query)
90
- }
91
-
92
- def path_query(self, path: str) -> Any:
93
- """Execute path-based query."""
94
- # JMESPath path queries
95
- query = f"$.{path}"
96
- return self.execute(query)
97
-
98
- def filter_query(self, filter_expression: str) -> Any:
99
- """Execute filter query."""
100
- query = f"[?{filter_expression}]"
101
- return self.execute(query)
102
-
103
- def projection_query(self, fields: List[str]) -> Any:
104
- """Execute projection query."""
105
- if len(fields) == 1:
106
- query = f"$.{fields[0]}"
107
- else:
108
- field_list = ", ".join([f"'{field}': @.{field}" for field in fields])
109
- query = f"{{{field_list}}}"
110
-
111
- return self.execute(query)
112
-
113
- def sort_query(self, sort_fields: List[str], order: str = "asc") -> Any:
114
- """Execute sort query."""
115
- if order.lower() == "desc":
116
- query = f"sort_by(@, &{sort_fields[0]}) | reverse(@)"
117
- else:
118
- query = f"sort_by(@, &{sort_fields[0]})"
119
-
120
- return self.execute(query)
121
-
122
- def limit_query(self, limit: int, offset: int = 0) -> Any:
123
- """Execute limit query."""
124
- if offset > 0:
125
- query = f"[{offset}:{offset + limit}]"
126
- else:
127
- query = f"[:{limit}]"
128
-
129
- return self.execute(query)
130
-
131
- def _get_query_type(self, query: str) -> str:
132
- """Extract query type from JMESPath query."""
133
- query = query.strip()
134
-
135
- if "[" in query and "]" in query:
136
- return "filter"
137
- elif "{" in query and "}" in query:
138
- return "projection"
139
- elif "(" in query and ")" in query:
140
- return "function"
141
- else:
142
- return "path"
143
-
144
- def _execute_projection(self, query: str, **kwargs) -> Any:
145
- """Execute projection query."""
146
- return {"result": "JMESPath projection executed", "query": query}
147
-
148
- def _execute_filter(self, query: str, **kwargs) -> Any:
149
- """Execute filter query."""
150
- return {"result": "JMESPath filter executed", "query": query}
151
-
152
- def _execute_function(self, query: str, **kwargs) -> Any:
153
- """Execute function query."""
154
- return {"result": "JMESPath function executed", "query": query}
155
-
156
- def _estimate_complexity(self, query: str) -> str:
157
- """Estimate query complexity."""
158
- expressions = self._extract_expressions(query)
159
-
160
- if len(expressions) > 5:
161
- return "HIGH"
162
- elif len(expressions) > 2:
163
- return "MEDIUM"
164
- else:
165
- return "LOW"
166
-
167
- def _estimate_cost(self, query: str) -> int:
168
- """Estimate query cost."""
169
- complexity = self._estimate_complexity(query)
170
- if complexity == "HIGH":
171
- return 80
172
- elif complexity == "MEDIUM":
173
- return 40
174
- else:
175
- return 20
176
-
177
- def _extract_expressions(self, query: str) -> List[str]:
178
- """Extract JMESPath expressions from query."""
179
- expressions = []
180
-
181
- # Path expressions
182
- if "." in query:
183
- expressions.append("path")
184
- if "[" in query and "]" in query:
185
- expressions.append("filter")
186
- if "{" in query and "}" in query:
187
- expressions.append("projection")
188
- if "|" in query:
189
- expressions.append("pipe")
190
- if "||" in query or "&&" in query:
191
- expressions.append("logical")
192
- if "==" in query or "!=" in query or ">" in query or "<" in query:
193
- expressions.append("comparison")
194
-
195
- # Functions
196
- jmespath_functions = ["length", "keys", "values", "sort", "reverse", "flatten", "unique", "join", "split", "to_string", "to_number", "type", "starts_with", "ends_with", "contains", "abs", "ceil", "floor", "max", "min", "sum", "avg", "sort_by", "group_by", "map", "filter", "merge", "merge_left", "merge_right"]
197
- for func in jmespath_functions:
198
- if func in query:
199
- expressions.append(func)
200
-
201
- return expressions
202
-
203
- def _get_optimization_hints(self, query: str) -> List[str]:
204
- """Get query optimization hints."""
205
- hints = []
206
-
207
- if "|" in query:
208
- hints.append("Consider combining operations to reduce pipe operations")
209
-
210
- if "[" in query and "]" in query:
211
- hints.append("Consider using specific paths instead of array operations when possible")
212
-
213
- if "{" in query and "}" in query:
214
- hints.append("Consider using multi-select for better performance")
215
-
216
- if "sort" in query:
217
- hints.append("Consider using sort_by for complex sorting operations")
218
-
219
- return hints
@@ -1,66 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- jq Query Strategy
4
-
5
- This module implements the jq query strategy for jq JSON processor operations.
6
-
7
- Company: eXonware.com
8
- Author: Eng. Muhammad AlShehri
9
- Email: connect@exonware.com
10
- Version: 0.0.1.21
11
- Generation Date: January 2, 2025
12
- """
13
-
14
- from typing import Any, Dict, List, Optional
15
- from .base import ADocumentQueryStrategy
16
- from ...errors import XWNodeValueError
17
- from ...contracts import QueryMode, QueryTrait
18
-
19
-
20
- class JQStrategy(ADocumentQueryStrategy):
21
- """jq query strategy for jq JSON processor operations."""
22
-
23
- def __init__(self, **options):
24
- super().__init__(**options)
25
- self._mode = QueryMode.JQ
26
- self._traits = QueryTrait.DOCUMENT | QueryTrait.ANALYTICAL | QueryTrait.STREAMING
27
-
28
- def execute(self, query: str, **kwargs) -> Any:
29
- """Execute jq query."""
30
- if not self.validate_query(query):
31
- raise XWNodeValueError(f"Invalid jq query: {query}")
32
- return {"result": "jq query executed", "query": query}
33
-
34
- def validate_query(self, query: str) -> bool:
35
- """Validate jq query syntax."""
36
- if not query or not isinstance(query, str):
37
- return False
38
- return any(op in query for op in [".", "|", "select", "map", "filter", "group_by", "sort_by"])
39
-
40
- def get_query_plan(self, query: str) -> Dict[str, Any]:
41
- """Get jq query execution plan."""
42
- return {
43
- "query_type": "jq",
44
- "complexity": "MEDIUM",
45
- "estimated_cost": 60
46
- }
47
-
48
- def path_query(self, path: str) -> Any:
49
- """Execute path-based query."""
50
- return self.execute(f".{path}")
51
-
52
- def filter_query(self, filter_expression: str) -> Any:
53
- """Execute filter query."""
54
- return self.execute(f"select({filter_expression})")
55
-
56
- def projection_query(self, fields: List[str]) -> Any:
57
- """Execute projection query."""
58
- return self.execute(f"{{{', '.join(f'{field}: .{field}' for field in fields)}}}")
59
-
60
- def sort_query(self, sort_fields: List[str], order: str = "asc") -> Any:
61
- """Execute sort query."""
62
- return self.execute(f"sort_by(.{sort_fields[0]})")
63
-
64
- def limit_query(self, limit: int, offset: int = 0) -> Any:
65
- """Execute limit query."""
66
- return self.execute(f".[{offset}:{offset + limit}]")
@@ -1,66 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- JSON Query Strategy
4
-
5
- This module implements the JSON Query strategy for generic JSON operations.
6
-
7
- Company: eXonware.com
8
- Author: Eng. Muhammad AlShehri
9
- Email: connect@exonware.com
10
- Version: 0.0.1.21
11
- Generation Date: January 2, 2025
12
- """
13
-
14
- from typing import Any, Dict, List, Optional
15
- from .base import ADocumentQueryStrategy
16
- from ...errors import XWNodeValueError
17
- from ...contracts import QueryMode, QueryTrait
18
-
19
-
20
- class JSONQueryStrategy(ADocumentQueryStrategy):
21
- """JSON Query strategy for generic JSON operations."""
22
-
23
- def __init__(self, **options):
24
- super().__init__(**options)
25
- self._mode = QueryMode.JSON_QUERY
26
- self._traits = QueryTrait.DOCUMENT | QueryTrait.STRUCTURED | QueryTrait.ANALYTICAL
27
-
28
- def execute(self, query: str, **kwargs) -> Any:
29
- """Execute JSON query."""
30
- if not self.validate_query(query):
31
- raise XWNodeValueError(f"Invalid JSON query: {query}")
32
- return {"result": "JSON query executed", "query": query}
33
-
34
- def validate_query(self, query: str) -> bool:
35
- """Validate JSON query syntax."""
36
- if not query or not isinstance(query, str):
37
- return False
38
- return any(op in query for op in ["$", ".", "[", "]", "?", ":", "{", "}"])
39
-
40
- def get_query_plan(self, query: str) -> Dict[str, Any]:
41
- """Get JSON query execution plan."""
42
- return {
43
- "query_type": "JSON_QUERY",
44
- "complexity": "MEDIUM",
45
- "estimated_cost": 50
46
- }
47
-
48
- def path_query(self, path: str) -> Any:
49
- """Execute path-based query."""
50
- return self.execute(f"$.{path}")
51
-
52
- def filter_query(self, filter_expression: str) -> Any:
53
- """Execute filter query."""
54
- return self.execute(f"$[?{filter_expression}]")
55
-
56
- def projection_query(self, fields: List[str]) -> Any:
57
- """Execute projection query."""
58
- return self.execute(f"$[{', '.join(fields)}]")
59
-
60
- def sort_query(self, sort_fields: List[str], order: str = "asc") -> Any:
61
- """Execute sort query."""
62
- return self.execute(f"$[sort by {sort_fields[0]}]")
63
-
64
- def limit_query(self, limit: int, offset: int = 0) -> Any:
65
- """Execute limit query."""
66
- return self.execute(f"$[{offset}:{offset + limit}]")