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,204 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python3
|
2
|
-
"""
|
3
|
-
#exonware/xwnode/src/exonware/xwnode/queries/executors/capability_checker.py
|
4
|
-
|
5
|
-
Operation Capability Checker
|
6
|
-
|
7
|
-
This module provides capability checking for operations on different node types.
|
8
|
-
|
9
|
-
Company: eXonware.com
|
10
|
-
Author: Eng. Muhammad AlShehri
|
11
|
-
Email: connect@exonware.com
|
12
|
-
Version: 0.0.1.22
|
13
|
-
Generation Date: 08-Oct-2025
|
14
|
-
"""
|
15
|
-
|
16
|
-
from typing import Dict, List, Set
|
17
|
-
|
18
|
-
# Import NodeType from nodes module per DEV_GUIDELINES
|
19
|
-
from ...nodes.strategies.contracts import NodeType
|
20
|
-
|
21
|
-
|
22
|
-
# Operation-to-NodeType Compatibility Matrix
|
23
|
-
OPERATION_COMPATIBILITY = {
|
24
|
-
# Core CRUD Operations (Universal)
|
25
|
-
'SELECT': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
26
|
-
'INSERT': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
27
|
-
'UPDATE': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
28
|
-
'DELETE': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
29
|
-
'CREATE': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
30
|
-
'DROP': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
31
|
-
|
32
|
-
# Filtering Operations (Universal)
|
33
|
-
'WHERE': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
34
|
-
'FILTER': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
35
|
-
'LIKE': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
36
|
-
'IN': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
37
|
-
'HAS': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
38
|
-
|
39
|
-
# Range Operations (Tree/Matrix)
|
40
|
-
'BETWEEN': {NodeType.TREE, NodeType.MATRIX},
|
41
|
-
'RANGE': {NodeType.TREE, NodeType.MATRIX},
|
42
|
-
|
43
|
-
# Aggregation Operations (Universal)
|
44
|
-
'GROUP': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
45
|
-
'BY': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
46
|
-
'HAVING': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
47
|
-
'SUMMARIZE': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
48
|
-
'SUM': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
49
|
-
'COUNT': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
50
|
-
'AVG': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
51
|
-
'MIN': {NodeType.LINEAR, NodeType.TREE, NodeType.MATRIX}, # Optimal on trees
|
52
|
-
'MAX': {NodeType.LINEAR, NodeType.TREE, NodeType.MATRIX}, # Optimal on trees
|
53
|
-
'DISTINCT': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
54
|
-
|
55
|
-
# Ordering Operations (Tree/Linear)
|
56
|
-
'ORDER': {NodeType.TREE, NodeType.LINEAR},
|
57
|
-
|
58
|
-
# Join Operations (Universal conceptually)
|
59
|
-
'JOIN': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
60
|
-
'UNION': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
61
|
-
'WITH': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
62
|
-
'OPTIONAL': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
63
|
-
|
64
|
-
# Graph Operations
|
65
|
-
'MATCH': {NodeType.GRAPH, NodeType.TREE, NodeType.HYBRID},
|
66
|
-
'PATH': {NodeType.GRAPH, NodeType.TREE, NodeType.HYBRID},
|
67
|
-
'OUT': {NodeType.GRAPH, NodeType.TREE, NodeType.HYBRID},
|
68
|
-
'IN_TRAVERSE': {NodeType.GRAPH, NodeType.TREE, NodeType.HYBRID},
|
69
|
-
'RETURN': {NodeType.GRAPH, NodeType.TREE, NodeType.HYBRID},
|
70
|
-
|
71
|
-
# Projection Operations (Universal)
|
72
|
-
'PROJECT': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
73
|
-
'EXTEND': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
74
|
-
|
75
|
-
# Array Operations (Linear/Matrix)
|
76
|
-
'SLICING': {NodeType.LINEAR, NodeType.MATRIX},
|
77
|
-
'INDEXING': {NodeType.LINEAR, NodeType.MATRIX, NodeType.TREE},
|
78
|
-
|
79
|
-
# Search Operations (Universal)
|
80
|
-
'TERM': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
81
|
-
|
82
|
-
# Data Operations (Universal)
|
83
|
-
'LOAD': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
84
|
-
'STORE': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
85
|
-
'MERGE': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
86
|
-
'ALTER': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
87
|
-
|
88
|
-
# Control Flow Operations (Universal)
|
89
|
-
'FOREACH': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
90
|
-
'LET': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
91
|
-
'FOR': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
92
|
-
|
93
|
-
# Window Operations (Time-series, works on linear/tree)
|
94
|
-
'WINDOW': {NodeType.LINEAR, NodeType.TREE},
|
95
|
-
'AGGREGATE': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
96
|
-
|
97
|
-
# Metadata Operations (Universal)
|
98
|
-
'DESCRIBE': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
99
|
-
'CONSTRUCT': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
100
|
-
'ASK': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
101
|
-
|
102
|
-
# Advanced Operations (Universal)
|
103
|
-
'SUBSCRIBE': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
104
|
-
'SUBSCRIPTION': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
105
|
-
'MUTATION': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
106
|
-
'PIPE': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
107
|
-
'OPTIONS': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
108
|
-
'VALUES': {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID},
|
109
|
-
}
|
110
|
-
|
111
|
-
|
112
|
-
def check_operation_compatibility(operation: str, node_type: NodeType) -> bool:
|
113
|
-
"""
|
114
|
-
Check if an operation is compatible with a node type.
|
115
|
-
|
116
|
-
Args:
|
117
|
-
operation: Operation name (e.g., "SELECT")
|
118
|
-
node_type: Node type to check
|
119
|
-
|
120
|
-
Returns:
|
121
|
-
True if operation is compatible with node type
|
122
|
-
"""
|
123
|
-
operation = operation.upper()
|
124
|
-
|
125
|
-
# Check compatibility matrix
|
126
|
-
if operation in OPERATION_COMPATIBILITY:
|
127
|
-
return node_type in OPERATION_COMPATIBILITY[operation]
|
128
|
-
|
129
|
-
# Unknown operation - assume universal (backward compatibility)
|
130
|
-
return True
|
131
|
-
|
132
|
-
|
133
|
-
def get_supported_operations(node_type: NodeType) -> List[str]:
|
134
|
-
"""
|
135
|
-
Get list of operations supported by a node type.
|
136
|
-
|
137
|
-
Args:
|
138
|
-
node_type: Node type to check
|
139
|
-
|
140
|
-
Returns:
|
141
|
-
List of supported operation names
|
142
|
-
"""
|
143
|
-
supported = []
|
144
|
-
|
145
|
-
for operation, compatible_types in OPERATION_COMPATIBILITY.items():
|
146
|
-
if node_type in compatible_types:
|
147
|
-
supported.append(operation)
|
148
|
-
|
149
|
-
return supported
|
150
|
-
|
151
|
-
|
152
|
-
def get_universal_operations() -> List[str]:
|
153
|
-
"""
|
154
|
-
Get list of universal operations (work on all node types).
|
155
|
-
|
156
|
-
Returns:
|
157
|
-
List of universal operation names
|
158
|
-
"""
|
159
|
-
universal = []
|
160
|
-
all_types = {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID}
|
161
|
-
|
162
|
-
for operation, compatible_types in OPERATION_COMPATIBILITY.items():
|
163
|
-
if compatible_types == all_types:
|
164
|
-
universal.append(operation)
|
165
|
-
|
166
|
-
return universal
|
167
|
-
|
168
|
-
|
169
|
-
def get_type_specific_operations(node_type: NodeType) -> List[str]:
|
170
|
-
"""
|
171
|
-
Get operations that are specific to (or optimal for) a node type.
|
172
|
-
|
173
|
-
Args:
|
174
|
-
node_type: Node type to check
|
175
|
-
|
176
|
-
Returns:
|
177
|
-
List of type-specific operation names
|
178
|
-
"""
|
179
|
-
specific = []
|
180
|
-
all_types = {NodeType.LINEAR, NodeType.TREE, NodeType.GRAPH, NodeType.MATRIX, NodeType.HYBRID}
|
181
|
-
|
182
|
-
for operation, compatible_types in OPERATION_COMPATIBILITY.items():
|
183
|
-
# If node type supports it but not all types support it
|
184
|
-
if node_type in compatible_types and compatible_types != all_types:
|
185
|
-
specific.append(operation)
|
186
|
-
|
187
|
-
return specific
|
188
|
-
|
189
|
-
|
190
|
-
# Global registry accessor
|
191
|
-
def get_global_registry() -> OperationRegistry:
|
192
|
-
"""Get the global operation registry instance."""
|
193
|
-
return OperationRegistry()
|
194
|
-
|
195
|
-
|
196
|
-
__all__ = [
|
197
|
-
'OperationRegistry',
|
198
|
-
'get_operation_registry',
|
199
|
-
'check_operation_compatibility',
|
200
|
-
'get_supported_operations',
|
201
|
-
'get_universal_operations',
|
202
|
-
'get_type_specific_operations',
|
203
|
-
'OPERATION_COMPATIBILITY',
|
204
|
-
]
|
@@ -1,166 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python3
|
2
|
-
"""
|
3
|
-
#exonware/xwnode/src/exonware/xwnode/queries/executors/contracts.py
|
4
|
-
|
5
|
-
Operation Executor Contracts
|
6
|
-
|
7
|
-
This module defines the interfaces and data structures for query operation execution.
|
8
|
-
|
9
|
-
Company: eXonware.com
|
10
|
-
Author: Eng. Muhammad AlShehri
|
11
|
-
Email: connect@exonware.com
|
12
|
-
Version: 0.0.1.22
|
13
|
-
Generation Date: 08-Oct-2025
|
14
|
-
"""
|
15
|
-
|
16
|
-
from abc import ABC, abstractmethod
|
17
|
-
from typing import Any, Dict, List, Optional
|
18
|
-
from dataclasses import dataclass, field
|
19
|
-
|
20
|
-
# Import shared types per DEV_GUIDELINES.md
|
21
|
-
from ...nodes.strategies.contracts import NodeType
|
22
|
-
from .defs import OperationCapability
|
23
|
-
|
24
|
-
|
25
|
-
@dataclass
|
26
|
-
class Action:
|
27
|
-
"""
|
28
|
-
Represents a single query action to be executed.
|
29
|
-
|
30
|
-
Actions are parsed from XWQuery Script and contain all information
|
31
|
-
needed to execute a specific operation.
|
32
|
-
"""
|
33
|
-
type: str # e.g., "SELECT", "INSERT", "WHERE"
|
34
|
-
params: Dict[str, Any] # Operation parameters
|
35
|
-
id: str = "" # Unique action ID
|
36
|
-
line_number: int = 0 # Source line number
|
37
|
-
children: List['Action'] = field(default_factory=list) # Nested actions
|
38
|
-
metadata: Dict[str, Any] = field(default_factory=dict) # Additional metadata
|
39
|
-
|
40
|
-
|
41
|
-
@dataclass
|
42
|
-
class ExecutionContext:
|
43
|
-
"""
|
44
|
-
Execution context for operation execution.
|
45
|
-
|
46
|
-
Contains all state needed during execution including the target node,
|
47
|
-
variables, transaction state, and configuration.
|
48
|
-
"""
|
49
|
-
node: Any # Target XWNode to execute on
|
50
|
-
variables: Dict[str, Any] = field(default_factory=dict) # Query variables
|
51
|
-
transaction: Optional[Any] = None # Transaction object (if in transaction)
|
52
|
-
cache: Optional[Dict[str, Any]] = None # Result cache
|
53
|
-
parent_results: Dict[str, Any] = field(default_factory=dict) # Results from parent actions
|
54
|
-
options: Dict[str, Any] = field(default_factory=dict) # Execution options
|
55
|
-
|
56
|
-
def set_result(self, action_id: str, result: Any) -> None:
|
57
|
-
"""Store result for later use by other actions."""
|
58
|
-
self.parent_results[action_id] = result
|
59
|
-
|
60
|
-
def get_result(self, action_id: str) -> Optional[Any]:
|
61
|
-
"""Get result from previous action."""
|
62
|
-
return self.parent_results.get(action_id)
|
63
|
-
|
64
|
-
|
65
|
-
@dataclass
|
66
|
-
class ExecutionResult:
|
67
|
-
"""
|
68
|
-
Result of operation execution.
|
69
|
-
|
70
|
-
Contains the data returned by the operation along with metadata
|
71
|
-
about the execution.
|
72
|
-
"""
|
73
|
-
data: Any # Result data
|
74
|
-
affected_count: int = 0 # Number of items affected
|
75
|
-
execution_time: float = 0.0 # Execution time in seconds
|
76
|
-
metadata: Dict[str, Any] = field(default_factory=dict) # Additional metadata
|
77
|
-
success: bool = True # Whether execution succeeded
|
78
|
-
error: Optional[str] = None # Error message if failed
|
79
|
-
|
80
|
-
|
81
|
-
class IOperationExecutor(ABC):
|
82
|
-
"""
|
83
|
-
Interface for operation executors.
|
84
|
-
|
85
|
-
All operation executors must implement this interface to be compatible
|
86
|
-
with the execution engine.
|
87
|
-
"""
|
88
|
-
|
89
|
-
# Operation name (e.g., "SELECT", "INSERT")
|
90
|
-
OPERATION_NAME: str = ""
|
91
|
-
|
92
|
-
# Supported node types (empty = all types)
|
93
|
-
SUPPORTED_NODE_TYPES: List[NodeType] = []
|
94
|
-
|
95
|
-
# Required capabilities
|
96
|
-
REQUIRED_CAPABILITIES: OperationCapability = OperationCapability.NONE
|
97
|
-
|
98
|
-
@abstractmethod
|
99
|
-
def execute(self, action: Action, context: ExecutionContext) -> ExecutionResult:
|
100
|
-
"""
|
101
|
-
Execute the operation.
|
102
|
-
|
103
|
-
Args:
|
104
|
-
action: The action to execute
|
105
|
-
context: Execution context with node and state
|
106
|
-
|
107
|
-
Returns:
|
108
|
-
ExecutionResult with data and metadata
|
109
|
-
|
110
|
-
Raises:
|
111
|
-
UnsupportedOperationError: If operation cannot execute on node type
|
112
|
-
ExecutionError: If execution fails
|
113
|
-
"""
|
114
|
-
pass
|
115
|
-
|
116
|
-
@abstractmethod
|
117
|
-
def validate(self, action: Action, context: ExecutionContext) -> bool:
|
118
|
-
"""
|
119
|
-
Validate that the action can be executed.
|
120
|
-
|
121
|
-
Args:
|
122
|
-
action: The action to validate
|
123
|
-
context: Execution context
|
124
|
-
|
125
|
-
Returns:
|
126
|
-
True if action is valid and can be executed
|
127
|
-
"""
|
128
|
-
pass
|
129
|
-
|
130
|
-
def can_execute_on(self, node_type: NodeType) -> bool:
|
131
|
-
"""
|
132
|
-
Check if this executor can operate on the given node type.
|
133
|
-
|
134
|
-
Args:
|
135
|
-
node_type: The node type to check
|
136
|
-
|
137
|
-
Returns:
|
138
|
-
True if this executor supports the node type
|
139
|
-
"""
|
140
|
-
# Empty list means supports all types
|
141
|
-
if not self.SUPPORTED_NODE_TYPES:
|
142
|
-
return True
|
143
|
-
return node_type in self.SUPPORTED_NODE_TYPES
|
144
|
-
|
145
|
-
def estimate_cost(self, action: Action, context: ExecutionContext) -> int:
|
146
|
-
"""
|
147
|
-
Estimate execution cost (optional).
|
148
|
-
|
149
|
-
Args:
|
150
|
-
action: The action to estimate
|
151
|
-
context: Execution context
|
152
|
-
|
153
|
-
Returns:
|
154
|
-
Estimated cost (arbitrary units)
|
155
|
-
"""
|
156
|
-
return 100 # Default cost
|
157
|
-
|
158
|
-
|
159
|
-
__all__ = [
|
160
|
-
'IOperationExecutor',
|
161
|
-
'Action',
|
162
|
-
'ExecutionContext',
|
163
|
-
'ExecutionResult',
|
164
|
-
'OperationCapability',
|
165
|
-
'NodeType',
|
166
|
-
]
|
@@ -1,17 +0,0 @@
|
|
1
|
-
"""Core CRUD operation executors."""
|
2
|
-
|
3
|
-
from .select_executor import SelectExecutor
|
4
|
-
from .insert_executor import InsertExecutor
|
5
|
-
from .update_executor import UpdateExecutor
|
6
|
-
from .delete_executor import DeleteExecutor
|
7
|
-
from .create_executor import CreateExecutor
|
8
|
-
from .drop_executor import DropExecutor
|
9
|
-
|
10
|
-
__all__ = [
|
11
|
-
'SelectExecutor',
|
12
|
-
'InsertExecutor',
|
13
|
-
'UpdateExecutor',
|
14
|
-
'DeleteExecutor',
|
15
|
-
'CreateExecutor',
|
16
|
-
'DropExecutor',
|
17
|
-
]
|
@@ -1,96 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python3
|
2
|
-
"""
|
3
|
-
#exonware/xwnode/src/exonware/xwnode/queries/executors/core/create_executor.py
|
4
|
-
|
5
|
-
CREATE Executor
|
6
|
-
|
7
|
-
Company: eXonware.com
|
8
|
-
Author: Eng. Muhammad AlShehri
|
9
|
-
Email: connect@exonware.com
|
10
|
-
Version: 0.0.1.22
|
11
|
-
Generation Date: 08-Oct-2025
|
12
|
-
"""
|
13
|
-
|
14
|
-
from typing import Any, Dict, List
|
15
|
-
from ..base import AUniversalOperationExecutor
|
16
|
-
from ..contracts import Action, ExecutionContext, ExecutionResult
|
17
|
-
from ..defs import OperationType
|
18
|
-
from ...nodes.strategies.contracts import NodeType
|
19
|
-
|
20
|
-
|
21
|
-
class CreateExecutor(AUniversalOperationExecutor):
|
22
|
-
"""
|
23
|
-
CREATE operation executor - Universal operation.
|
24
|
-
|
25
|
-
Creates new structures (collections, indices, schemas) in nodes.
|
26
|
-
Works on all node types (LINEAR, TREE, GRAPH, MATRIX, HYBRID).
|
27
|
-
|
28
|
-
Capability: Universal
|
29
|
-
Operation Type: CORE
|
30
|
-
"""
|
31
|
-
|
32
|
-
OPERATION_NAME = "CREATE"
|
33
|
-
OPERATION_TYPE = OperationType.CORE
|
34
|
-
SUPPORTED_NODE_TYPES = [] # Empty = Universal (all types)
|
35
|
-
|
36
|
-
def _do_execute(self, action: Action, context: ExecutionContext) -> ExecutionResult:
|
37
|
-
"""Execute CREATE operation."""
|
38
|
-
# 1. Extract parameters
|
39
|
-
params = action.params
|
40
|
-
structure_type = params.get('type', 'collection') # collection, index, schema
|
41
|
-
name = params.get('name', 'new_structure')
|
42
|
-
schema = params.get('schema', {})
|
43
|
-
options = params.get('options', {})
|
44
|
-
|
45
|
-
# 2. Get node strategy
|
46
|
-
node = context.node
|
47
|
-
|
48
|
-
# 3. Execute create
|
49
|
-
result_data = self._execute_create(node, structure_type, name, schema, options, context)
|
50
|
-
|
51
|
-
# 4. Return result
|
52
|
-
return ExecutionResult(
|
53
|
-
success=True,
|
54
|
-
data=result_data,
|
55
|
-
operation=self.OPERATION_NAME,
|
56
|
-
metadata={
|
57
|
-
'structure_type': structure_type,
|
58
|
-
'name': name,
|
59
|
-
'created': result_data.get('created', False)
|
60
|
-
}
|
61
|
-
)
|
62
|
-
|
63
|
-
def _execute_create(self, node: Any, structure_type: str, name: str,
|
64
|
-
schema: Dict, options: Dict, context: ExecutionContext) -> Dict:
|
65
|
-
"""Actual CREATE logic."""
|
66
|
-
try:
|
67
|
-
# Create structure based on type
|
68
|
-
if structure_type == 'collection':
|
69
|
-
# Create a new collection/path
|
70
|
-
node.set(name, {})
|
71
|
-
created = True
|
72
|
-
elif structure_type == 'index':
|
73
|
-
# Create an index (simplified)
|
74
|
-
index_path = f"_indices.{name}"
|
75
|
-
node.set(index_path, {'type': 'index', 'fields': schema})
|
76
|
-
created = True
|
77
|
-
elif structure_type == 'schema':
|
78
|
-
# Create a schema definition
|
79
|
-
schema_path = f"_schemas.{name}"
|
80
|
-
node.set(schema_path, schema)
|
81
|
-
created = True
|
82
|
-
else:
|
83
|
-
created = False
|
84
|
-
|
85
|
-
return {
|
86
|
-
'created': created,
|
87
|
-
'type': structure_type,
|
88
|
-
'name': name,
|
89
|
-
'path': name
|
90
|
-
}
|
91
|
-
except Exception as e:
|
92
|
-
return {
|
93
|
-
'created': False,
|
94
|
-
'error': str(e)
|
95
|
-
}
|
96
|
-
|
@@ -1,99 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python3
|
2
|
-
"""
|
3
|
-
#exonware/xwnode/src/exonware/xwnode/queries/executors/core/delete_executor.py
|
4
|
-
|
5
|
-
DELETE Executor
|
6
|
-
|
7
|
-
Company: eXonware.com
|
8
|
-
Author: Eng. Muhammad AlShehri
|
9
|
-
Email: connect@exonware.com
|
10
|
-
Version: 0.0.1.22
|
11
|
-
Generation Date: 08-Oct-2025
|
12
|
-
"""
|
13
|
-
|
14
|
-
from typing import Any, Dict, List
|
15
|
-
from ..base import AUniversalOperationExecutor
|
16
|
-
from ..contracts import Action, ExecutionContext, ExecutionResult
|
17
|
-
from ..defs import OperationType
|
18
|
-
from ...nodes.strategies.contracts import NodeType
|
19
|
-
|
20
|
-
|
21
|
-
class DeleteExecutor(AUniversalOperationExecutor):
|
22
|
-
"""
|
23
|
-
DELETE operation executor - Universal operation.
|
24
|
-
|
25
|
-
Deletes data from nodes based on specified conditions.
|
26
|
-
Works on all node types (LINEAR, TREE, GRAPH, MATRIX, HYBRID).
|
27
|
-
|
28
|
-
Capability: Universal
|
29
|
-
Operation Type: CORE
|
30
|
-
"""
|
31
|
-
|
32
|
-
OPERATION_NAME = "DELETE"
|
33
|
-
OPERATION_TYPE = OperationType.CORE
|
34
|
-
SUPPORTED_NODE_TYPES = [] # Empty = Universal (all types)
|
35
|
-
|
36
|
-
def _do_execute(self, action: Action, context: ExecutionContext) -> ExecutionResult:
|
37
|
-
"""Execute DELETE operation."""
|
38
|
-
# 1. Extract parameters
|
39
|
-
params = action.params
|
40
|
-
target = params.get('target', None) # What to delete (path/key)
|
41
|
-
condition = params.get('where', None) # Delete condition
|
42
|
-
|
43
|
-
# 2. Get node strategy
|
44
|
-
node = context.node
|
45
|
-
|
46
|
-
# 3. Execute delete
|
47
|
-
result_data = self._execute_delete(node, target, condition, context)
|
48
|
-
|
49
|
-
# 4. Return result
|
50
|
-
return ExecutionResult(
|
51
|
-
success=True,
|
52
|
-
data=result_data,
|
53
|
-
operation=self.OPERATION_NAME,
|
54
|
-
metadata={
|
55
|
-
'deleted_count': result_data.get('count', 0),
|
56
|
-
'target': target,
|
57
|
-
'condition': condition
|
58
|
-
}
|
59
|
-
)
|
60
|
-
|
61
|
-
def _execute_delete(self, node: Any, target: str, condition: Any,
|
62
|
-
context: ExecutionContext) -> Dict:
|
63
|
-
"""Actual DELETE logic."""
|
64
|
-
deleted_count = 0
|
65
|
-
deleted_items = []
|
66
|
-
|
67
|
-
if target:
|
68
|
-
# Delete specific target
|
69
|
-
try:
|
70
|
-
current = node.get(target, default=None)
|
71
|
-
if current is not None and self._matches_condition(current, condition):
|
72
|
-
node.delete(target)
|
73
|
-
deleted_count = 1
|
74
|
-
deleted_items.append(target)
|
75
|
-
except Exception as e:
|
76
|
-
return {
|
77
|
-
'count': 0,
|
78
|
-
'items': [],
|
79
|
-
'error': str(e)
|
80
|
-
}
|
81
|
-
else:
|
82
|
-
# Delete all matching items
|
83
|
-
# This is a simplified implementation
|
84
|
-
deleted_count = 0
|
85
|
-
deleted_items = []
|
86
|
-
|
87
|
-
return {
|
88
|
-
'count': deleted_count,
|
89
|
-
'items': deleted_items
|
90
|
-
}
|
91
|
-
|
92
|
-
def _matches_condition(self, item: Any, condition: Any) -> bool:
|
93
|
-
"""Check if item matches condition."""
|
94
|
-
if condition is None:
|
95
|
-
return True
|
96
|
-
|
97
|
-
# Simplified condition checking
|
98
|
-
return True
|
99
|
-
|
@@ -1,100 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python3
|
2
|
-
"""
|
3
|
-
#exonware/xwnode/src/exonware/xwnode/queries/executors/core/drop_executor.py
|
4
|
-
|
5
|
-
DROP Executor
|
6
|
-
|
7
|
-
Company: eXonware.com
|
8
|
-
Author: Eng. Muhammad AlShehri
|
9
|
-
Email: connect@exonware.com
|
10
|
-
Version: 0.0.1.22
|
11
|
-
Generation Date: 08-Oct-2025
|
12
|
-
"""
|
13
|
-
|
14
|
-
from typing import Any, Dict, List
|
15
|
-
from ..base import AUniversalOperationExecutor
|
16
|
-
from ..contracts import Action, ExecutionContext, ExecutionResult
|
17
|
-
from ..defs import OperationType
|
18
|
-
from ...nodes.strategies.contracts import NodeType
|
19
|
-
|
20
|
-
|
21
|
-
class DropExecutor(AUniversalOperationExecutor):
|
22
|
-
"""
|
23
|
-
DROP operation executor - Universal operation.
|
24
|
-
|
25
|
-
Drops/removes structures (collections, indices, schemas) from nodes.
|
26
|
-
Works on all node types (LINEAR, TREE, GRAPH, MATRIX, HYBRID).
|
27
|
-
|
28
|
-
Capability: Universal
|
29
|
-
Operation Type: CORE
|
30
|
-
"""
|
31
|
-
|
32
|
-
OPERATION_NAME = "DROP"
|
33
|
-
OPERATION_TYPE = OperationType.CORE
|
34
|
-
SUPPORTED_NODE_TYPES = [] # Empty = Universal (all types)
|
35
|
-
|
36
|
-
def _do_execute(self, action: Action, context: ExecutionContext) -> ExecutionResult:
|
37
|
-
"""Execute DROP operation."""
|
38
|
-
# 1. Extract parameters
|
39
|
-
params = action.params
|
40
|
-
structure_type = params.get('type', 'collection')
|
41
|
-
name = params.get('name')
|
42
|
-
if_exists = params.get('if_exists', False)
|
43
|
-
|
44
|
-
# 2. Get node strategy
|
45
|
-
node = context.node
|
46
|
-
|
47
|
-
# 3. Execute drop
|
48
|
-
result_data = self._execute_drop(node, structure_type, name, if_exists, context)
|
49
|
-
|
50
|
-
# 4. Return result
|
51
|
-
return ExecutionResult(
|
52
|
-
success=True,
|
53
|
-
data=result_data,
|
54
|
-
operation=self.OPERATION_NAME,
|
55
|
-
metadata={
|
56
|
-
'structure_type': structure_type,
|
57
|
-
'name': name,
|
58
|
-
'dropped': result_data.get('dropped', False)
|
59
|
-
}
|
60
|
-
)
|
61
|
-
|
62
|
-
def _execute_drop(self, node: Any, structure_type: str, name: str,
|
63
|
-
if_exists: bool, context: ExecutionContext) -> Dict:
|
64
|
-
"""Actual DROP logic."""
|
65
|
-
try:
|
66
|
-
# Determine path based on structure type
|
67
|
-
if structure_type == 'index':
|
68
|
-
path = f"_indices.{name}"
|
69
|
-
elif structure_type == 'schema':
|
70
|
-
path = f"_schemas.{name}"
|
71
|
-
else:
|
72
|
-
path = name
|
73
|
-
|
74
|
-
# Check if exists
|
75
|
-
exists = node.get(path, default=None) is not None
|
76
|
-
|
77
|
-
if not exists and not if_exists:
|
78
|
-
return {
|
79
|
-
'dropped': False,
|
80
|
-
'error': f"Structure '{name}' does not exist"
|
81
|
-
}
|
82
|
-
|
83
|
-
if exists:
|
84
|
-
node.delete(path)
|
85
|
-
dropped = True
|
86
|
-
else:
|
87
|
-
dropped = False
|
88
|
-
|
89
|
-
return {
|
90
|
-
'dropped': dropped,
|
91
|
-
'type': structure_type,
|
92
|
-
'name': name,
|
93
|
-
'path': path
|
94
|
-
}
|
95
|
-
except Exception as e:
|
96
|
-
return {
|
97
|
-
'dropped': False,
|
98
|
-
'error': str(e)
|
99
|
-
}
|
100
|
-
|