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.
- exonware/__init__.py +8 -1
- exonware/xwnode/__init__.py +18 -5
- exonware/xwnode/add_strategy_types.py +165 -0
- exonware/xwnode/base.py +7 -5
- exonware/xwnode/common/__init__.py +1 -1
- exonware/xwnode/common/graph/__init__.py +30 -0
- exonware/xwnode/common/graph/caching.py +131 -0
- exonware/xwnode/common/graph/contracts.py +100 -0
- exonware/xwnode/common/graph/errors.py +44 -0
- exonware/xwnode/common/graph/indexing.py +260 -0
- exonware/xwnode/common/graph/manager.py +568 -0
- exonware/xwnode/common/management/__init__.py +3 -5
- exonware/xwnode/common/management/manager.py +9 -9
- exonware/xwnode/common/management/migration.py +6 -6
- exonware/xwnode/common/monitoring/__init__.py +3 -5
- exonware/xwnode/common/monitoring/metrics.py +7 -3
- exonware/xwnode/common/monitoring/pattern_detector.py +2 -2
- exonware/xwnode/common/monitoring/performance_monitor.py +6 -2
- exonware/xwnode/common/patterns/__init__.py +3 -5
- exonware/xwnode/common/patterns/advisor.py +1 -1
- exonware/xwnode/common/patterns/flyweight.py +6 -2
- exonware/xwnode/common/patterns/registry.py +203 -184
- exonware/xwnode/common/utils/__init__.py +25 -11
- exonware/xwnode/common/utils/simple.py +1 -1
- exonware/xwnode/config.py +3 -8
- exonware/xwnode/contracts.py +4 -105
- exonware/xwnode/defs.py +413 -159
- exonware/xwnode/edges/strategies/__init__.py +86 -4
- exonware/xwnode/edges/strategies/_base_edge.py +2 -2
- exonware/xwnode/edges/strategies/adj_list.py +287 -121
- exonware/xwnode/edges/strategies/adj_matrix.py +316 -222
- exonware/xwnode/edges/strategies/base.py +1 -1
- exonware/xwnode/edges/strategies/{edge_bidir_wrapper.py → bidir_wrapper.py} +45 -4
- exonware/xwnode/edges/strategies/bitemporal.py +520 -0
- exonware/xwnode/edges/strategies/{edge_block_adj_matrix.py → block_adj_matrix.py} +77 -6
- exonware/xwnode/edges/strategies/bv_graph.py +664 -0
- exonware/xwnode/edges/strategies/compressed_graph.py +217 -0
- exonware/xwnode/edges/strategies/{edge_coo.py → coo.py} +46 -4
- exonware/xwnode/edges/strategies/{edge_csc.py → csc.py} +45 -4
- exonware/xwnode/edges/strategies/{edge_csr.py → csr.py} +94 -12
- exonware/xwnode/edges/strategies/{edge_dynamic_adj_list.py → dynamic_adj_list.py} +46 -4
- exonware/xwnode/edges/strategies/edge_list.py +168 -0
- exonware/xwnode/edges/strategies/edge_property_store.py +2 -2
- exonware/xwnode/edges/strategies/euler_tour.py +560 -0
- exonware/xwnode/edges/strategies/{edge_flow_network.py → flow_network.py} +2 -2
- exonware/xwnode/edges/strategies/graphblas.py +449 -0
- exonware/xwnode/edges/strategies/hnsw.py +637 -0
- exonware/xwnode/edges/strategies/hop2_labels.py +467 -0
- exonware/xwnode/edges/strategies/{edge_hyperedge_set.py → hyperedge_set.py} +2 -2
- exonware/xwnode/edges/strategies/incidence_matrix.py +250 -0
- exonware/xwnode/edges/strategies/k2_tree.py +613 -0
- exonware/xwnode/edges/strategies/link_cut.py +626 -0
- exonware/xwnode/edges/strategies/multiplex.py +532 -0
- exonware/xwnode/edges/strategies/{edge_neural_graph.py → neural_graph.py} +2 -2
- exonware/xwnode/edges/strategies/{edge_octree.py → octree.py} +69 -11
- exonware/xwnode/edges/strategies/{edge_quadtree.py → quadtree.py} +66 -10
- exonware/xwnode/edges/strategies/roaring_adj.py +438 -0
- exonware/xwnode/edges/strategies/{edge_rtree.py → rtree.py} +43 -5
- exonware/xwnode/edges/strategies/{edge_temporal_edgeset.py → temporal_edgeset.py} +24 -5
- exonware/xwnode/edges/strategies/{edge_tree_graph_basic.py → tree_graph_basic.py} +78 -7
- exonware/xwnode/edges/strategies/{edge_weighted_graph.py → weighted_graph.py} +188 -10
- exonware/xwnode/errors.py +3 -6
- exonware/xwnode/facade.py +20 -20
- exonware/xwnode/nodes/strategies/__init__.py +29 -9
- exonware/xwnode/nodes/strategies/adjacency_list.py +650 -177
- exonware/xwnode/nodes/strategies/aho_corasick.py +358 -183
- exonware/xwnode/nodes/strategies/array_list.py +36 -3
- exonware/xwnode/nodes/strategies/art.py +581 -0
- exonware/xwnode/nodes/strategies/{node_avl_tree.py → avl_tree.py} +77 -6
- exonware/xwnode/nodes/strategies/{node_b_plus_tree.py → b_plus_tree.py} +81 -40
- exonware/xwnode/nodes/strategies/{node_btree.py → b_tree.py} +79 -9
- exonware/xwnode/nodes/strategies/base.py +469 -98
- exonware/xwnode/nodes/strategies/{node_bitmap.py → bitmap.py} +12 -12
- exonware/xwnode/nodes/strategies/{node_bitset_dynamic.py → bitset_dynamic.py} +11 -11
- exonware/xwnode/nodes/strategies/{node_bloom_filter.py → bloom_filter.py} +15 -2
- exonware/xwnode/nodes/strategies/bloomier_filter.py +519 -0
- exonware/xwnode/nodes/strategies/bw_tree.py +531 -0
- exonware/xwnode/nodes/strategies/contracts.py +1 -1
- exonware/xwnode/nodes/strategies/{node_count_min_sketch.py → count_min_sketch.py} +3 -2
- exonware/xwnode/nodes/strategies/{node_cow_tree.py → cow_tree.py} +135 -13
- exonware/xwnode/nodes/strategies/crdt_map.py +629 -0
- exonware/xwnode/nodes/strategies/{node_cuckoo_hash.py → cuckoo_hash.py} +2 -2
- exonware/xwnode/nodes/strategies/{node_xdata_optimized.py → data_interchange_optimized.py} +21 -4
- exonware/xwnode/nodes/strategies/dawg.py +876 -0
- exonware/xwnode/nodes/strategies/deque.py +321 -153
- exonware/xwnode/nodes/strategies/extendible_hash.py +93 -0
- exonware/xwnode/nodes/strategies/{node_fenwick_tree.py → fenwick_tree.py} +111 -19
- exonware/xwnode/nodes/strategies/hamt.py +403 -0
- exonware/xwnode/nodes/strategies/hash_map.py +354 -67
- exonware/xwnode/nodes/strategies/heap.py +105 -5
- exonware/xwnode/nodes/strategies/hopscotch_hash.py +525 -0
- exonware/xwnode/nodes/strategies/{node_hyperloglog.py → hyperloglog.py} +6 -5
- exonware/xwnode/nodes/strategies/interval_tree.py +742 -0
- exonware/xwnode/nodes/strategies/kd_tree.py +703 -0
- exonware/xwnode/nodes/strategies/learned_index.py +533 -0
- exonware/xwnode/nodes/strategies/linear_hash.py +93 -0
- exonware/xwnode/nodes/strategies/linked_list.py +316 -119
- exonware/xwnode/nodes/strategies/{node_lsm_tree.py → lsm_tree.py} +219 -15
- exonware/xwnode/nodes/strategies/masstree.py +130 -0
- exonware/xwnode/nodes/strategies/{node_persistent_tree.py → persistent_tree.py} +149 -9
- exonware/xwnode/nodes/strategies/priority_queue.py +544 -132
- exonware/xwnode/nodes/strategies/queue.py +249 -120
- exonware/xwnode/nodes/strategies/{node_red_black_tree.py → red_black_tree.py} +183 -72
- exonware/xwnode/nodes/strategies/{node_roaring_bitmap.py → roaring_bitmap.py} +19 -6
- exonware/xwnode/nodes/strategies/rope.py +717 -0
- exonware/xwnode/nodes/strategies/{node_segment_tree.py → segment_tree.py} +106 -106
- exonware/xwnode/nodes/strategies/{node_set_hash.py → set_hash.py} +30 -29
- exonware/xwnode/nodes/strategies/{node_skip_list.py → skip_list.py} +74 -6
- exonware/xwnode/nodes/strategies/sparse_matrix.py +427 -131
- exonware/xwnode/nodes/strategies/{node_splay_tree.py → splay_tree.py} +55 -6
- exonware/xwnode/nodes/strategies/stack.py +244 -112
- exonware/xwnode/nodes/strategies/{node_suffix_array.py → suffix_array.py} +5 -1
- exonware/xwnode/nodes/strategies/t_tree.py +94 -0
- exonware/xwnode/nodes/strategies/{node_treap.py → treap.py} +75 -6
- exonware/xwnode/nodes/strategies/{node_tree_graph_hybrid.py → tree_graph_hybrid.py} +46 -5
- exonware/xwnode/nodes/strategies/trie.py +153 -9
- exonware/xwnode/nodes/strategies/union_find.py +111 -5
- exonware/xwnode/nodes/strategies/veb_tree.py +856 -0
- exonware/xwnode/strategies/__init__.py +5 -51
- exonware/xwnode/version.py +3 -3
- {exonware_xwnode-0.0.1.21.dist-info → exonware_xwnode-0.0.1.23.dist-info}/METADATA +23 -3
- exonware_xwnode-0.0.1.23.dist-info/RECORD +130 -0
- exonware/xwnode/edges/strategies/edge_adj_list.py +0 -353
- exonware/xwnode/edges/strategies/edge_adj_matrix.py +0 -445
- exonware/xwnode/nodes/strategies/_base_node.py +0 -307
- exonware/xwnode/nodes/strategies/node_aho_corasick.py +0 -525
- exonware/xwnode/nodes/strategies/node_array_list.py +0 -179
- exonware/xwnode/nodes/strategies/node_hash_map.py +0 -273
- exonware/xwnode/nodes/strategies/node_heap.py +0 -196
- exonware/xwnode/nodes/strategies/node_linked_list.py +0 -413
- exonware/xwnode/nodes/strategies/node_trie.py +0 -257
- exonware/xwnode/nodes/strategies/node_union_find.py +0 -192
- exonware/xwnode/queries/executors/__init__.py +0 -47
- exonware/xwnode/queries/executors/advanced/__init__.py +0 -37
- exonware/xwnode/queries/executors/advanced/aggregate_executor.py +0 -50
- exonware/xwnode/queries/executors/advanced/ask_executor.py +0 -50
- exonware/xwnode/queries/executors/advanced/construct_executor.py +0 -50
- exonware/xwnode/queries/executors/advanced/describe_executor.py +0 -50
- exonware/xwnode/queries/executors/advanced/for_loop_executor.py +0 -50
- exonware/xwnode/queries/executors/advanced/foreach_executor.py +0 -50
- exonware/xwnode/queries/executors/advanced/join_executor.py +0 -50
- exonware/xwnode/queries/executors/advanced/let_executor.py +0 -50
- exonware/xwnode/queries/executors/advanced/mutation_executor.py +0 -50
- exonware/xwnode/queries/executors/advanced/options_executor.py +0 -50
- exonware/xwnode/queries/executors/advanced/pipe_executor.py +0 -50
- exonware/xwnode/queries/executors/advanced/subscribe_executor.py +0 -50
- exonware/xwnode/queries/executors/advanced/subscription_executor.py +0 -50
- exonware/xwnode/queries/executors/advanced/union_executor.py +0 -50
- exonware/xwnode/queries/executors/advanced/window_executor.py +0 -51
- exonware/xwnode/queries/executors/advanced/with_cte_executor.py +0 -50
- exonware/xwnode/queries/executors/aggregation/__init__.py +0 -21
- exonware/xwnode/queries/executors/aggregation/avg_executor.py +0 -50
- exonware/xwnode/queries/executors/aggregation/count_executor.py +0 -38
- exonware/xwnode/queries/executors/aggregation/distinct_executor.py +0 -50
- exonware/xwnode/queries/executors/aggregation/group_executor.py +0 -50
- exonware/xwnode/queries/executors/aggregation/having_executor.py +0 -50
- exonware/xwnode/queries/executors/aggregation/max_executor.py +0 -50
- exonware/xwnode/queries/executors/aggregation/min_executor.py +0 -50
- exonware/xwnode/queries/executors/aggregation/sum_executor.py +0 -50
- exonware/xwnode/queries/executors/aggregation/summarize_executor.py +0 -50
- exonware/xwnode/queries/executors/array/__init__.py +0 -9
- exonware/xwnode/queries/executors/array/indexing_executor.py +0 -51
- exonware/xwnode/queries/executors/array/slicing_executor.py +0 -51
- exonware/xwnode/queries/executors/base.py +0 -257
- exonware/xwnode/queries/executors/capability_checker.py +0 -204
- exonware/xwnode/queries/executors/contracts.py +0 -166
- exonware/xwnode/queries/executors/core/__init__.py +0 -17
- exonware/xwnode/queries/executors/core/create_executor.py +0 -96
- exonware/xwnode/queries/executors/core/delete_executor.py +0 -99
- exonware/xwnode/queries/executors/core/drop_executor.py +0 -100
- exonware/xwnode/queries/executors/core/insert_executor.py +0 -39
- exonware/xwnode/queries/executors/core/select_executor.py +0 -152
- exonware/xwnode/queries/executors/core/update_executor.py +0 -102
- exonware/xwnode/queries/executors/data/__init__.py +0 -13
- exonware/xwnode/queries/executors/data/alter_executor.py +0 -50
- exonware/xwnode/queries/executors/data/load_executor.py +0 -50
- exonware/xwnode/queries/executors/data/merge_executor.py +0 -50
- exonware/xwnode/queries/executors/data/store_executor.py +0 -50
- exonware/xwnode/queries/executors/defs.py +0 -93
- exonware/xwnode/queries/executors/engine.py +0 -221
- exonware/xwnode/queries/executors/errors.py +0 -68
- exonware/xwnode/queries/executors/filtering/__init__.py +0 -25
- exonware/xwnode/queries/executors/filtering/between_executor.py +0 -80
- exonware/xwnode/queries/executors/filtering/filter_executor.py +0 -79
- exonware/xwnode/queries/executors/filtering/has_executor.py +0 -70
- exonware/xwnode/queries/executors/filtering/in_executor.py +0 -70
- exonware/xwnode/queries/executors/filtering/like_executor.py +0 -76
- exonware/xwnode/queries/executors/filtering/optional_executor.py +0 -76
- exonware/xwnode/queries/executors/filtering/range_executor.py +0 -80
- exonware/xwnode/queries/executors/filtering/term_executor.py +0 -77
- exonware/xwnode/queries/executors/filtering/values_executor.py +0 -71
- exonware/xwnode/queries/executors/filtering/where_executor.py +0 -44
- exonware/xwnode/queries/executors/graph/__init__.py +0 -15
- exonware/xwnode/queries/executors/graph/in_traverse_executor.py +0 -51
- exonware/xwnode/queries/executors/graph/match_executor.py +0 -51
- exonware/xwnode/queries/executors/graph/out_executor.py +0 -51
- exonware/xwnode/queries/executors/graph/path_executor.py +0 -51
- exonware/xwnode/queries/executors/graph/return_executor.py +0 -51
- exonware/xwnode/queries/executors/ordering/__init__.py +0 -9
- exonware/xwnode/queries/executors/ordering/by_executor.py +0 -50
- exonware/xwnode/queries/executors/ordering/order_executor.py +0 -51
- exonware/xwnode/queries/executors/projection/__init__.py +0 -9
- exonware/xwnode/queries/executors/projection/extend_executor.py +0 -50
- exonware/xwnode/queries/executors/projection/project_executor.py +0 -50
- exonware/xwnode/queries/executors/registry.py +0 -173
- exonware/xwnode/queries/parsers/__init__.py +0 -26
- exonware/xwnode/queries/parsers/base.py +0 -86
- exonware/xwnode/queries/parsers/contracts.py +0 -46
- exonware/xwnode/queries/parsers/errors.py +0 -53
- exonware/xwnode/queries/parsers/sql_param_extractor.py +0 -318
- exonware/xwnode/queries/strategies/__init__.py +0 -24
- exonware/xwnode/queries/strategies/base.py +0 -236
- exonware/xwnode/queries/strategies/cql.py +0 -201
- exonware/xwnode/queries/strategies/cypher.py +0 -181
- exonware/xwnode/queries/strategies/datalog.py +0 -70
- exonware/xwnode/queries/strategies/elastic_dsl.py +0 -70
- exonware/xwnode/queries/strategies/eql.py +0 -70
- exonware/xwnode/queries/strategies/flux.py +0 -70
- exonware/xwnode/queries/strategies/gql.py +0 -70
- exonware/xwnode/queries/strategies/graphql.py +0 -240
- exonware/xwnode/queries/strategies/gremlin.py +0 -181
- exonware/xwnode/queries/strategies/hiveql.py +0 -214
- exonware/xwnode/queries/strategies/hql.py +0 -70
- exonware/xwnode/queries/strategies/jmespath.py +0 -219
- exonware/xwnode/queries/strategies/jq.py +0 -66
- exonware/xwnode/queries/strategies/json_query.py +0 -66
- exonware/xwnode/queries/strategies/jsoniq.py +0 -248
- exonware/xwnode/queries/strategies/kql.py +0 -70
- exonware/xwnode/queries/strategies/linq.py +0 -238
- exonware/xwnode/queries/strategies/logql.py +0 -70
- exonware/xwnode/queries/strategies/mql.py +0 -68
- exonware/xwnode/queries/strategies/n1ql.py +0 -210
- exonware/xwnode/queries/strategies/partiql.py +0 -70
- exonware/xwnode/queries/strategies/pig.py +0 -215
- exonware/xwnode/queries/strategies/promql.py +0 -70
- exonware/xwnode/queries/strategies/sparql.py +0 -220
- exonware/xwnode/queries/strategies/sql.py +0 -275
- exonware/xwnode/queries/strategies/xml_query.py +0 -66
- exonware/xwnode/queries/strategies/xpath.py +0 -223
- exonware/xwnode/queries/strategies/xquery.py +0 -258
- exonware/xwnode/queries/strategies/xwnode_executor.py +0 -332
- exonware/xwnode/queries/strategies/xwquery.py +0 -456
- exonware_xwnode-0.0.1.21.dist-info/RECORD +0 -214
- /exonware/xwnode/nodes/strategies/{node_ordered_map.py → ordered_map.py} +0 -0
- /exonware/xwnode/nodes/strategies/{node_ordered_map_balanced.py → ordered_map_balanced.py} +0 -0
- /exonware/xwnode/nodes/strategies/{node_patricia.py → patricia.py} +0 -0
- /exonware/xwnode/nodes/strategies/{node_radix_trie.py → radix_trie.py} +0 -0
- /exonware/xwnode/nodes/strategies/{node_set_tree.py → set_tree.py} +0 -0
- {exonware_xwnode-0.0.1.21.dist-info → exonware_xwnode-0.0.1.23.dist-info}/WHEEL +0 -0
- {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
|