exonware-xwnode 0.0.1.22__py3-none-any.whl → 0.0.1.24__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 +1 -1
- exonware/xwnode/__init__.py +18 -5
- exonware/xwnode/add_strategy_types.py +165 -0
- 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 +2 -2
- exonware/xwnode/common/management/migration.py +3 -3
- exonware/xwnode/common/monitoring/__init__.py +3 -5
- exonware/xwnode/common/monitoring/metrics.py +6 -2
- exonware/xwnode/common/monitoring/pattern_detector.py +1 -1
- exonware/xwnode/common/monitoring/performance_monitor.py +5 -1
- exonware/xwnode/common/patterns/__init__.py +3 -5
- exonware/xwnode/common/patterns/flyweight.py +5 -1
- exonware/xwnode/common/patterns/registry.py +202 -183
- 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.24.dist-info/METADATA +900 -0
- exonware_xwnode-0.0.1.24.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.22.dist-info/METADATA +0 -168
- exonware_xwnode-0.0.1.22.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.22.dist-info → exonware_xwnode-0.0.1.24.dist-info}/WHEEL +0 -0
- {exonware_xwnode-0.0.1.22.dist-info → exonware_xwnode-0.0.1.24.dist-info}/licenses/LICENSE +0 -0
@@ -1,210 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python3
|
2
|
-
"""
|
3
|
-
N1QL Query Strategy
|
4
|
-
|
5
|
-
This module implements the N1QL query strategy for Couchbase Query Language operations.
|
6
|
-
|
7
|
-
Company: eXonware.com
|
8
|
-
Author: Eng. Muhammad AlShehri
|
9
|
-
Email: connect@exonware.com
|
10
|
-
Version: 0.0.1.22
|
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 N1QLStrategy(AStructuredQueryStrategy):
|
22
|
-
"""
|
23
|
-
N1QL query strategy for Couchbase Query Language operations.
|
24
|
-
|
25
|
-
Supports:
|
26
|
-
- N1QL 1.0+ features
|
27
|
-
- SELECT, INSERT, UPDATE, DELETE operations
|
28
|
-
- CREATE, DROP, ALTER operations
|
29
|
-
- JSON document operations
|
30
|
-
- Array and object operations
|
31
|
-
"""
|
32
|
-
|
33
|
-
def __init__(self, **options):
|
34
|
-
super().__init__(**options)
|
35
|
-
self._mode = QueryMode.N1QL
|
36
|
-
self._traits = QueryTrait.STRUCTURED | QueryTrait.ANALYTICAL | QueryTrait.BATCH
|
37
|
-
|
38
|
-
def execute(self, query: str, **kwargs) -> Any:
|
39
|
-
"""Execute N1QL query."""
|
40
|
-
if not self.validate_query(query):
|
41
|
-
raise XWNodeValueError(f"Invalid N1QL 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 == "UPDATE":
|
50
|
-
return self._execute_update(query, **kwargs)
|
51
|
-
elif query_type == "DELETE":
|
52
|
-
return self._execute_delete(query, **kwargs)
|
53
|
-
else:
|
54
|
-
raise XWNodeValueError(f"Unsupported query type: {query_type}")
|
55
|
-
|
56
|
-
def validate_query(self, query: str) -> bool:
|
57
|
-
"""Validate N1QL query syntax."""
|
58
|
-
if not query or not isinstance(query, str):
|
59
|
-
return False
|
60
|
-
|
61
|
-
# Basic N1QL validation
|
62
|
-
query = query.strip().upper()
|
63
|
-
valid_operations = ["SELECT", "INSERT", "UPDATE", "DELETE", "CREATE", "DROP", "ALTER", "USE", "EXPLAIN", "PREPARE", "EXECUTE", "INFER", "BUILD", "REBUILD", "ANALYZE", "UPDATE STATISTICS"]
|
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 N1QL 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
|
-
"operations": self._extract_operations(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
|
-
set_clause = ', '.join([f"{k} = ?" for k in data.keys()])
|
103
|
-
query = f"UPDATE {table} SET {set_clause}"
|
104
|
-
|
105
|
-
if where_clause:
|
106
|
-
query += f" WHERE {where_clause}"
|
107
|
-
|
108
|
-
return self.execute(query, values=list(data.values()))
|
109
|
-
|
110
|
-
def delete_query(self, table: str, where_clause: str = None) -> Any:
|
111
|
-
"""Execute DELETE query."""
|
112
|
-
query = f"DELETE FROM {table}"
|
113
|
-
if where_clause:
|
114
|
-
query += f" WHERE {where_clause}"
|
115
|
-
|
116
|
-
return self.execute(query)
|
117
|
-
|
118
|
-
def join_query(self, tables: List[str], join_conditions: List[str]) -> Any:
|
119
|
-
"""Execute JOIN query."""
|
120
|
-
if len(tables) < 2:
|
121
|
-
raise XWNodeValueError("JOIN requires at least 2 tables")
|
122
|
-
|
123
|
-
query = f"SELECT * FROM {tables[0]}"
|
124
|
-
for i, table in enumerate(tables[1:], 1):
|
125
|
-
if i <= len(join_conditions):
|
126
|
-
query += f" JOIN {table} ON {join_conditions[i-1]}"
|
127
|
-
else:
|
128
|
-
query += f" CROSS JOIN {table}"
|
129
|
-
|
130
|
-
return self.execute(query)
|
131
|
-
|
132
|
-
def aggregate_query(self, table: str, functions: List[str], group_by: List[str] = None) -> Any:
|
133
|
-
"""Execute aggregate query."""
|
134
|
-
query = f"SELECT {', '.join(functions)} FROM {table}"
|
135
|
-
if group_by:
|
136
|
-
query += f" GROUP BY {', '.join(group_by)}"
|
137
|
-
|
138
|
-
return self.execute(query)
|
139
|
-
|
140
|
-
def _get_query_type(self, query: str) -> str:
|
141
|
-
"""Extract query type from N1QL query."""
|
142
|
-
query = query.strip().upper()
|
143
|
-
for operation in ["SELECT", "INSERT", "UPDATE", "DELETE", "CREATE", "DROP", "ALTER", "USE", "EXPLAIN", "PREPARE", "EXECUTE", "INFER", "BUILD", "REBUILD", "ANALYZE", "UPDATE STATISTICS"]:
|
144
|
-
if query.startswith(operation):
|
145
|
-
return operation
|
146
|
-
return "UNKNOWN"
|
147
|
-
|
148
|
-
def _execute_select(self, query: str, **kwargs) -> Any:
|
149
|
-
"""Execute SELECT query."""
|
150
|
-
return {"result": "N1QL SELECT executed", "query": query}
|
151
|
-
|
152
|
-
def _execute_insert(self, query: str, **kwargs) -> Any:
|
153
|
-
"""Execute INSERT query."""
|
154
|
-
return {"result": "N1QL INSERT executed", "query": query}
|
155
|
-
|
156
|
-
def _execute_update(self, query: str, **kwargs) -> Any:
|
157
|
-
"""Execute UPDATE query."""
|
158
|
-
return {"result": "N1QL UPDATE executed", "query": query}
|
159
|
-
|
160
|
-
def _execute_delete(self, query: str, **kwargs) -> Any:
|
161
|
-
"""Execute DELETE query."""
|
162
|
-
return {"result": "N1QL DELETE executed", "query": query}
|
163
|
-
|
164
|
-
def _estimate_complexity(self, query: str) -> str:
|
165
|
-
"""Estimate query complexity."""
|
166
|
-
operations = self._extract_operations(query)
|
167
|
-
|
168
|
-
if len(operations) > 5:
|
169
|
-
return "HIGH"
|
170
|
-
elif len(operations) > 2:
|
171
|
-
return "MEDIUM"
|
172
|
-
else:
|
173
|
-
return "LOW"
|
174
|
-
|
175
|
-
def _estimate_cost(self, query: str) -> int:
|
176
|
-
"""Estimate query cost."""
|
177
|
-
complexity = self._estimate_complexity(query)
|
178
|
-
if complexity == "HIGH":
|
179
|
-
return 140
|
180
|
-
elif complexity == "MEDIUM":
|
181
|
-
return 70
|
182
|
-
else:
|
183
|
-
return 35
|
184
|
-
|
185
|
-
def _extract_operations(self, query: str) -> List[str]:
|
186
|
-
"""Extract N1QL operations from query."""
|
187
|
-
operations = []
|
188
|
-
|
189
|
-
n1ql_operations = ["SELECT", "INSERT", "UPDATE", "DELETE", "CREATE", "DROP", "ALTER", "USE", "EXPLAIN", "PREPARE", "EXECUTE", "INFER", "BUILD", "REBUILD", "ANALYZE", "UPDATE STATISTICS"]
|
190
|
-
|
191
|
-
for operation in n1ql_operations:
|
192
|
-
if operation in query.upper():
|
193
|
-
operations.append(operation)
|
194
|
-
|
195
|
-
return operations
|
196
|
-
|
197
|
-
def _get_optimization_hints(self, query: str) -> List[str]:
|
198
|
-
"""Get query optimization hints."""
|
199
|
-
hints = []
|
200
|
-
|
201
|
-
if "SELECT *" in query.upper():
|
202
|
-
hints.append("Consider specifying columns instead of using *")
|
203
|
-
|
204
|
-
if "WHERE" not in query.upper() and "SELECT" in query.upper():
|
205
|
-
hints.append("Consider adding WHERE clause to limit results")
|
206
|
-
|
207
|
-
if "JOIN" in query.upper():
|
208
|
-
hints.append("Consider using indexes for JOIN operations")
|
209
|
-
|
210
|
-
return hints
|
@@ -1,70 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python3
|
2
|
-
"""
|
3
|
-
PartiQL Query Strategy
|
4
|
-
|
5
|
-
This module implements the PartiQL query strategy for AWS PartiQL operations.
|
6
|
-
|
7
|
-
Company: eXonware.com
|
8
|
-
Author: Eng. Muhammad AlShehri
|
9
|
-
Email: connect@exonware.com
|
10
|
-
Version: 0.0.1.22
|
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 PartiQLStrategy(AStructuredQueryStrategy):
|
21
|
-
"""PartiQL query strategy for AWS PartiQL operations."""
|
22
|
-
|
23
|
-
def __init__(self, **options):
|
24
|
-
super().__init__(**options)
|
25
|
-
self._mode = QueryMode.PARTIQL
|
26
|
-
self._traits = QueryTrait.STRUCTURED | QueryTrait.ANALYTICAL | QueryTrait.BATCH
|
27
|
-
|
28
|
-
def execute(self, query: str, **kwargs) -> Any:
|
29
|
-
"""Execute PartiQL query."""
|
30
|
-
if not self.validate_query(query):
|
31
|
-
raise XWNodeValueError(f"Invalid PartiQL query: {query}")
|
32
|
-
return {"result": "PartiQL query executed", "query": query}
|
33
|
-
|
34
|
-
def validate_query(self, query: str) -> bool:
|
35
|
-
"""Validate PartiQL query syntax."""
|
36
|
-
if not query or not isinstance(query, str):
|
37
|
-
return False
|
38
|
-
return any(op in query.upper() for op in ["SELECT", "FROM", "WHERE", "INSERT", "UPDATE", "DELETE"])
|
39
|
-
|
40
|
-
def get_query_plan(self, query: str) -> Dict[str, Any]:
|
41
|
-
"""Get PartiQL query execution plan."""
|
42
|
-
return {
|
43
|
-
"query_type": "PartiQL",
|
44
|
-
"complexity": "MEDIUM",
|
45
|
-
"estimated_cost": 85
|
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} VALUE {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"SELECT * 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,215 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python3
|
2
|
-
"""
|
3
|
-
Pig Query Strategy
|
4
|
-
|
5
|
-
This module implements the Pig query strategy for Apache Pig Latin operations.
|
6
|
-
|
7
|
-
Company: eXonware.com
|
8
|
-
Author: Eng. Muhammad AlShehri
|
9
|
-
Email: connect@exonware.com
|
10
|
-
Version: 0.0.1.22
|
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 PigStrategy(AStructuredQueryStrategy):
|
22
|
-
"""
|
23
|
-
Pig query strategy for Apache Pig Latin operations.
|
24
|
-
|
25
|
-
Supports:
|
26
|
-
- Pig Latin language
|
27
|
-
- LOAD, STORE, FILTER, FOREACH operations
|
28
|
-
- GROUP BY and COGROUP operations
|
29
|
-
- JOIN and UNION operations
|
30
|
-
- Built-in functions and UDFs
|
31
|
-
"""
|
32
|
-
|
33
|
-
def __init__(self, **options):
|
34
|
-
super().__init__(**options)
|
35
|
-
self._mode = QueryMode.PIG
|
36
|
-
self._traits = QueryTrait.STRUCTURED | QueryTrait.ANALYTICAL | QueryTrait.BATCH
|
37
|
-
|
38
|
-
def execute(self, query: str, **kwargs) -> Any:
|
39
|
-
"""Execute Pig query."""
|
40
|
-
if not self.validate_query(query):
|
41
|
-
raise XWNodeValueError(f"Invalid Pig query: {query}")
|
42
|
-
|
43
|
-
query_type = self._get_query_type(query)
|
44
|
-
|
45
|
-
if query_type == "LOAD":
|
46
|
-
return self._execute_load(query, **kwargs)
|
47
|
-
elif query_type == "STORE":
|
48
|
-
return self._execute_store(query, **kwargs)
|
49
|
-
elif query_type == "FILTER":
|
50
|
-
return self._execute_filter(query, **kwargs)
|
51
|
-
elif query_type == "FOREACH":
|
52
|
-
return self._execute_foreach(query, **kwargs)
|
53
|
-
else:
|
54
|
-
raise XWNodeValueError(f"Unsupported query type: {query_type}")
|
55
|
-
|
56
|
-
def validate_query(self, query: str) -> bool:
|
57
|
-
"""Validate Pig query syntax."""
|
58
|
-
if not query or not isinstance(query, str):
|
59
|
-
return False
|
60
|
-
|
61
|
-
# Basic Pig validation
|
62
|
-
query = query.strip().upper()
|
63
|
-
valid_operations = ["LOAD", "STORE", "FILTER", "FOREACH", "GROUP", "COGROUP", "JOIN", "UNION", "SPLIT", "CROSS", "DISTINCT", "ORDER", "LIMIT", "SAMPLE", "PARALLEL", "REGISTER", "DEFINE", "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 Pig 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
|
-
"operations": self._extract_operations(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"data = LOAD '{table}' AS ({', '.join(columns)});"
|
87
|
-
if where_clause:
|
88
|
-
query += f" filtered = FILTER data BY {where_clause};"
|
89
|
-
query += f" result = FOREACH filtered GENERATE {', '.join(columns)};"
|
90
|
-
else:
|
91
|
-
query += f" result = FOREACH data GENERATE {', '.join(columns)};"
|
92
|
-
|
93
|
-
return self.execute(query)
|
94
|
-
|
95
|
-
def insert_query(self, table: str, data: Dict[str, Any]) -> Any:
|
96
|
-
"""Execute INSERT query."""
|
97
|
-
# Pig doesn't support INSERT, use LOAD and STORE
|
98
|
-
query = f"data = LOAD '{table}'; new_data = LOAD 'new_data' AS ({', '.join(data.keys())}); combined = UNION data, new_data; STORE combined INTO '{table}';"
|
99
|
-
return self.execute(query)
|
100
|
-
|
101
|
-
def update_query(self, table: str, data: Dict[str, Any], where_clause: str = None) -> Any:
|
102
|
-
"""Execute UPDATE query."""
|
103
|
-
# Pig doesn't support UPDATE, use FILTER and FOREACH
|
104
|
-
query = f"data = LOAD '{table}';"
|
105
|
-
if where_clause:
|
106
|
-
query += f" filtered = FILTER data BY {where_clause};"
|
107
|
-
query += f" updated = FOREACH filtered GENERATE {', '.join([f'{k} AS {k}' for k in data.keys()])};"
|
108
|
-
else:
|
109
|
-
query += f" updated = FOREACH data GENERATE {', '.join([f'{k} AS {k}' for k in data.keys()])};"
|
110
|
-
|
111
|
-
return self.execute(query)
|
112
|
-
|
113
|
-
def delete_query(self, table: str, where_clause: str = None) -> Any:
|
114
|
-
"""Execute DELETE query."""
|
115
|
-
# Pig doesn't support DELETE, use FILTER
|
116
|
-
query = f"data = LOAD '{table}';"
|
117
|
-
if where_clause:
|
118
|
-
query += f" filtered = FILTER data BY NOT ({where_clause});"
|
119
|
-
else:
|
120
|
-
query += f" filtered = FILTER data BY false;"
|
121
|
-
|
122
|
-
return self.execute(query)
|
123
|
-
|
124
|
-
def join_query(self, tables: List[str], join_conditions: List[str]) -> Any:
|
125
|
-
"""Execute JOIN query."""
|
126
|
-
if len(tables) < 2:
|
127
|
-
raise XWNodeValueError("JOIN requires at least 2 tables")
|
128
|
-
|
129
|
-
query = f"table1 = LOAD '{tables[0]}'; table2 = LOAD '{tables[1]}';"
|
130
|
-
query += f" joined = JOIN table1 BY {join_conditions[0]}, table2 BY {join_conditions[0]};"
|
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"data = LOAD '{table}';"
|
137
|
-
if group_by:
|
138
|
-
query += f" grouped = GROUP data BY ({', '.join(group_by)});"
|
139
|
-
query += f" aggregated = FOREACH grouped GENERATE group, {', '.join(functions)};"
|
140
|
-
else:
|
141
|
-
query += f" aggregated = FOREACH data GENERATE {', '.join(functions)};"
|
142
|
-
|
143
|
-
return self.execute(query)
|
144
|
-
|
145
|
-
def _get_query_type(self, query: str) -> str:
|
146
|
-
"""Extract query type from Pig query."""
|
147
|
-
query = query.strip().upper()
|
148
|
-
for operation in ["LOAD", "STORE", "FILTER", "FOREACH", "GROUP", "COGROUP", "JOIN", "UNION", "SPLIT", "CROSS", "DISTINCT", "ORDER", "LIMIT", "SAMPLE", "PARALLEL", "REGISTER", "DEFINE", "IMPORT"]:
|
149
|
-
if query.startswith(operation):
|
150
|
-
return operation
|
151
|
-
return "UNKNOWN"
|
152
|
-
|
153
|
-
def _execute_load(self, query: str, **kwargs) -> Any:
|
154
|
-
"""Execute LOAD query."""
|
155
|
-
return {"result": "Pig LOAD executed", "query": query}
|
156
|
-
|
157
|
-
def _execute_store(self, query: str, **kwargs) -> Any:
|
158
|
-
"""Execute STORE query."""
|
159
|
-
return {"result": "Pig STORE executed", "query": query}
|
160
|
-
|
161
|
-
def _execute_filter(self, query: str, **kwargs) -> Any:
|
162
|
-
"""Execute FILTER query."""
|
163
|
-
return {"result": "Pig FILTER executed", "query": query}
|
164
|
-
|
165
|
-
def _execute_foreach(self, query: str, **kwargs) -> Any:
|
166
|
-
"""Execute FOREACH query."""
|
167
|
-
return {"result": "Pig FOREACH executed", "query": query}
|
168
|
-
|
169
|
-
def _estimate_complexity(self, query: str) -> str:
|
170
|
-
"""Estimate query complexity."""
|
171
|
-
operations = self._extract_operations(query)
|
172
|
-
|
173
|
-
if len(operations) > 8:
|
174
|
-
return "HIGH"
|
175
|
-
elif len(operations) > 4:
|
176
|
-
return "MEDIUM"
|
177
|
-
else:
|
178
|
-
return "LOW"
|
179
|
-
|
180
|
-
def _estimate_cost(self, query: str) -> int:
|
181
|
-
"""Estimate query cost."""
|
182
|
-
complexity = self._estimate_complexity(query)
|
183
|
-
if complexity == "HIGH":
|
184
|
-
return 250 # Higher cost due to MapReduce
|
185
|
-
elif complexity == "MEDIUM":
|
186
|
-
return 125
|
187
|
-
else:
|
188
|
-
return 60
|
189
|
-
|
190
|
-
def _extract_operations(self, query: str) -> List[str]:
|
191
|
-
"""Extract Pig operations from query."""
|
192
|
-
operations = []
|
193
|
-
|
194
|
-
pig_operations = ["LOAD", "STORE", "FILTER", "FOREACH", "GROUP", "COGROUP", "JOIN", "UNION", "SPLIT", "CROSS", "DISTINCT", "ORDER", "LIMIT", "SAMPLE", "PARALLEL", "REGISTER", "DEFINE", "IMPORT"]
|
195
|
-
|
196
|
-
for operation in pig_operations:
|
197
|
-
if operation in query.upper():
|
198
|
-
operations.append(operation)
|
199
|
-
|
200
|
-
return operations
|
201
|
-
|
202
|
-
def _get_optimization_hints(self, query: str) -> List[str]:
|
203
|
-
"""Get query optimization hints."""
|
204
|
-
hints = []
|
205
|
-
|
206
|
-
if "GROUP" in query.upper():
|
207
|
-
hints.append("Consider using COGROUP for multiple group operations")
|
208
|
-
|
209
|
-
if "JOIN" in query.upper():
|
210
|
-
hints.append("Consider using replicated joins for small datasets")
|
211
|
-
|
212
|
-
if "FOREACH" in query.upper():
|
213
|
-
hints.append("Consider using nested FOREACH for complex transformations")
|
214
|
-
|
215
|
-
return hints
|
@@ -1,70 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python3
|
2
|
-
"""
|
3
|
-
PromQL Query Strategy
|
4
|
-
|
5
|
-
This module implements the PromQL query strategy for Prometheus Query Language operations.
|
6
|
-
|
7
|
-
Company: eXonware.com
|
8
|
-
Author: Eng. Muhammad AlShehri
|
9
|
-
Email: connect@exonware.com
|
10
|
-
Version: 0.0.1.22
|
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 PromQLStrategy(AStructuredQueryStrategy):
|
21
|
-
"""PromQL query strategy for Prometheus Query Language operations."""
|
22
|
-
|
23
|
-
def __init__(self, **options):
|
24
|
-
super().__init__(**options)
|
25
|
-
self._mode = QueryMode.PROMQL
|
26
|
-
self._traits = QueryTrait.STRUCTURED | QueryTrait.ANALYTICAL | QueryTrait.TEMPORAL
|
27
|
-
|
28
|
-
def execute(self, query: str, **kwargs) -> Any:
|
29
|
-
"""Execute PromQL query."""
|
30
|
-
if not self.validate_query(query):
|
31
|
-
raise XWNodeValueError(f"Invalid PromQL query: {query}")
|
32
|
-
return {"result": "PromQL query executed", "query": query}
|
33
|
-
|
34
|
-
def validate_query(self, query: str) -> bool:
|
35
|
-
"""Validate PromQL query syntax."""
|
36
|
-
if not query or not isinstance(query, str):
|
37
|
-
return False
|
38
|
-
return any(op in query for op in ["up", "rate", "sum", "avg", "max", "min", "count", "histogram_quantile"])
|
39
|
-
|
40
|
-
def get_query_plan(self, query: str) -> Dict[str, Any]:
|
41
|
-
"""Get PromQL query execution plan."""
|
42
|
-
return {
|
43
|
-
"query_type": "PromQL",
|
44
|
-
"complexity": "MEDIUM",
|
45
|
-
"estimated_cost": 70
|
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"{table}{{{where_clause or ''}}}")
|
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"{tables[0]} * on(instance) {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"{functions[0]}({table})")
|