exonware-xwnode 0.0.1.22__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 +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.22.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.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.23.dist-info}/WHEEL +0 -0
- {exonware_xwnode-0.0.1.22.dist-info → exonware_xwnode-0.0.1.23.dist-info}/licenses/LICENSE +0 -0
@@ -1,50 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python3
|
2
|
-
"""
|
3
|
-
#exonware/xwnode/src/exonware/xwnode/queries/executors/aggregation/max_executor.py
|
4
|
-
|
5
|
-
MAX 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: 09-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
|
-
|
19
|
-
class MaxExecutor(AUniversalOperationExecutor):
|
20
|
-
"""
|
21
|
-
MAX operation executor.
|
22
|
-
|
23
|
-
Finds maximum value
|
24
|
-
|
25
|
-
Capability: Universal
|
26
|
-
Operation Type: AGGREGATION
|
27
|
-
"""
|
28
|
-
|
29
|
-
OPERATION_NAME = "MAX"
|
30
|
-
OPERATION_TYPE = OperationType.AGGREGATION
|
31
|
-
SUPPORTED_NODE_TYPES = [] # Universal
|
32
|
-
|
33
|
-
def _do_execute(self, action: Action, context: ExecutionContext) -> ExecutionResult:
|
34
|
-
"""Execute MAX operation."""
|
35
|
-
params = action.params
|
36
|
-
node = context.node
|
37
|
-
|
38
|
-
result_data = self._execute_max(node, params, context)
|
39
|
-
|
40
|
-
return ExecutionResult(
|
41
|
-
success=True,
|
42
|
-
data=result_data,
|
43
|
-
operation=self.OPERATION_NAME,
|
44
|
-
metadata={'operation': self.OPERATION_NAME}
|
45
|
-
)
|
46
|
-
|
47
|
-
def _execute_max(self, node: Any, params: Dict, context: ExecutionContext) -> Dict:
|
48
|
-
"""Execute max logic."""
|
49
|
-
# Implementation here
|
50
|
-
return {'result': 'MAX executed', 'params': params}
|
@@ -1,50 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python3
|
2
|
-
"""
|
3
|
-
#exonware/xwnode/src/exonware/xwnode/queries/executors/aggregation/min_executor.py
|
4
|
-
|
5
|
-
MIN 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: 09-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
|
-
|
19
|
-
class MinExecutor(AUniversalOperationExecutor):
|
20
|
-
"""
|
21
|
-
MIN operation executor.
|
22
|
-
|
23
|
-
Finds minimum value
|
24
|
-
|
25
|
-
Capability: Universal
|
26
|
-
Operation Type: AGGREGATION
|
27
|
-
"""
|
28
|
-
|
29
|
-
OPERATION_NAME = "MIN"
|
30
|
-
OPERATION_TYPE = OperationType.AGGREGATION
|
31
|
-
SUPPORTED_NODE_TYPES = [] # Universal
|
32
|
-
|
33
|
-
def _do_execute(self, action: Action, context: ExecutionContext) -> ExecutionResult:
|
34
|
-
"""Execute MIN operation."""
|
35
|
-
params = action.params
|
36
|
-
node = context.node
|
37
|
-
|
38
|
-
result_data = self._execute_min(node, params, context)
|
39
|
-
|
40
|
-
return ExecutionResult(
|
41
|
-
success=True,
|
42
|
-
data=result_data,
|
43
|
-
operation=self.OPERATION_NAME,
|
44
|
-
metadata={'operation': self.OPERATION_NAME}
|
45
|
-
)
|
46
|
-
|
47
|
-
def _execute_min(self, node: Any, params: Dict, context: ExecutionContext) -> Dict:
|
48
|
-
"""Execute min logic."""
|
49
|
-
# Implementation here
|
50
|
-
return {'result': 'MIN executed', 'params': params}
|
@@ -1,50 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python3
|
2
|
-
"""
|
3
|
-
#exonware/xwnode/src/exonware/xwnode/queries/executors/aggregation/sum_executor.py
|
4
|
-
|
5
|
-
SUM 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: 09-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
|
-
|
19
|
-
class SumExecutor(AUniversalOperationExecutor):
|
20
|
-
"""
|
21
|
-
SUM operation executor.
|
22
|
-
|
23
|
-
Computes sum of numeric values
|
24
|
-
|
25
|
-
Capability: Universal
|
26
|
-
Operation Type: AGGREGATION
|
27
|
-
"""
|
28
|
-
|
29
|
-
OPERATION_NAME = "SUM"
|
30
|
-
OPERATION_TYPE = OperationType.AGGREGATION
|
31
|
-
SUPPORTED_NODE_TYPES = [] # Universal
|
32
|
-
|
33
|
-
def _do_execute(self, action: Action, context: ExecutionContext) -> ExecutionResult:
|
34
|
-
"""Execute SUM operation."""
|
35
|
-
params = action.params
|
36
|
-
node = context.node
|
37
|
-
|
38
|
-
result_data = self._execute_sum(node, params, context)
|
39
|
-
|
40
|
-
return ExecutionResult(
|
41
|
-
success=True,
|
42
|
-
data=result_data,
|
43
|
-
operation=self.OPERATION_NAME,
|
44
|
-
metadata={'operation': self.OPERATION_NAME}
|
45
|
-
)
|
46
|
-
|
47
|
-
def _execute_sum(self, node: Any, params: Dict, context: ExecutionContext) -> Dict:
|
48
|
-
"""Execute sum logic."""
|
49
|
-
# Implementation here
|
50
|
-
return {'result': 'SUM executed', 'params': params}
|
@@ -1,50 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python3
|
2
|
-
"""
|
3
|
-
#exonware/xwnode/src/exonware/xwnode/queries/executors/aggregation/summarize_executor.py
|
4
|
-
|
5
|
-
SUMMARIZE 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: 09-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
|
-
|
19
|
-
class SummarizeExecutor(AUniversalOperationExecutor):
|
20
|
-
"""
|
21
|
-
SUMMARIZE operation executor.
|
22
|
-
|
23
|
-
Summarizes data with aggregations
|
24
|
-
|
25
|
-
Capability: Universal
|
26
|
-
Operation Type: AGGREGATION
|
27
|
-
"""
|
28
|
-
|
29
|
-
OPERATION_NAME = "SUMMARIZE"
|
30
|
-
OPERATION_TYPE = OperationType.AGGREGATION
|
31
|
-
SUPPORTED_NODE_TYPES = [] # Universal
|
32
|
-
|
33
|
-
def _do_execute(self, action: Action, context: ExecutionContext) -> ExecutionResult:
|
34
|
-
"""Execute SUMMARIZE operation."""
|
35
|
-
params = action.params
|
36
|
-
node = context.node
|
37
|
-
|
38
|
-
result_data = self._execute_summarize(node, params, context)
|
39
|
-
|
40
|
-
return ExecutionResult(
|
41
|
-
success=True,
|
42
|
-
data=result_data,
|
43
|
-
operation=self.OPERATION_NAME,
|
44
|
-
metadata={'operation': self.OPERATION_NAME}
|
45
|
-
)
|
46
|
-
|
47
|
-
def _execute_summarize(self, node: Any, params: Dict, context: ExecutionContext) -> Dict:
|
48
|
-
"""Execute summarize logic."""
|
49
|
-
# Implementation here
|
50
|
-
return {'result': 'SUMMARIZE executed', 'params': params}
|
@@ -1,51 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python3
|
2
|
-
"""
|
3
|
-
#exonware/xwnode/src/exonware/xwnode/queries/executors/array/indexing_executor.py
|
4
|
-
|
5
|
-
INDEXING 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: 09-Oct-2025
|
12
|
-
"""
|
13
|
-
|
14
|
-
from typing import Any, Dict, List
|
15
|
-
from ..base import AOperationExecutor
|
16
|
-
from ..contracts import Action, ExecutionContext, ExecutionResult
|
17
|
-
from ..defs import OperationType
|
18
|
-
from ...nodes.strategies.contracts import NodeType
|
19
|
-
|
20
|
-
class IndexingExecutor(AOperationExecutor):
|
21
|
-
"""
|
22
|
-
INDEXING operation executor.
|
23
|
-
|
24
|
-
Array indexing operations
|
25
|
-
|
26
|
-
Capability: LINEAR, MATRIX, TREE only
|
27
|
-
Operation Type: ARRAY
|
28
|
-
"""
|
29
|
-
|
30
|
-
OPERATION_NAME = "INDEXING"
|
31
|
-
OPERATION_TYPE = OperationType.ARRAY
|
32
|
-
SUPPORTED_NODE_TYPES = [NodeType.LINEAR, NodeType.MATRIX, NodeType.TREE]
|
33
|
-
|
34
|
-
def _do_execute(self, action: Action, context: ExecutionContext) -> ExecutionResult:
|
35
|
-
"""Execute INDEXING operation."""
|
36
|
-
params = action.params
|
37
|
-
node = context.node
|
38
|
-
|
39
|
-
result_data = self._execute_indexing(node, params, context)
|
40
|
-
|
41
|
-
return ExecutionResult(
|
42
|
-
success=True,
|
43
|
-
data=result_data,
|
44
|
-
operation=self.OPERATION_NAME,
|
45
|
-
metadata={'operation': self.OPERATION_NAME}
|
46
|
-
)
|
47
|
-
|
48
|
-
def _execute_indexing(self, node: Any, params: Dict, context: ExecutionContext) -> Dict:
|
49
|
-
"""Execute indexing logic."""
|
50
|
-
# Implementation here
|
51
|
-
return {'result': 'INDEXING executed', 'params': params}
|
@@ -1,51 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python3
|
2
|
-
"""
|
3
|
-
#exonware/xwnode/src/exonware/xwnode/queries/executors/array/slicing_executor.py
|
4
|
-
|
5
|
-
SLICING 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: 09-Oct-2025
|
12
|
-
"""
|
13
|
-
|
14
|
-
from typing import Any, Dict, List
|
15
|
-
from ..base import AOperationExecutor
|
16
|
-
from ..contracts import Action, ExecutionContext, ExecutionResult
|
17
|
-
from ..defs import OperationType
|
18
|
-
from ...nodes.strategies.contracts import NodeType
|
19
|
-
|
20
|
-
class SlicingExecutor(AOperationExecutor):
|
21
|
-
"""
|
22
|
-
SLICING operation executor.
|
23
|
-
|
24
|
-
Array slicing operations
|
25
|
-
|
26
|
-
Capability: LINEAR, MATRIX only
|
27
|
-
Operation Type: ARRAY
|
28
|
-
"""
|
29
|
-
|
30
|
-
OPERATION_NAME = "SLICING"
|
31
|
-
OPERATION_TYPE = OperationType.ARRAY
|
32
|
-
SUPPORTED_NODE_TYPES = [NodeType.LINEAR, NodeType.MATRIX]
|
33
|
-
|
34
|
-
def _do_execute(self, action: Action, context: ExecutionContext) -> ExecutionResult:
|
35
|
-
"""Execute SLICING operation."""
|
36
|
-
params = action.params
|
37
|
-
node = context.node
|
38
|
-
|
39
|
-
result_data = self._execute_slicing(node, params, context)
|
40
|
-
|
41
|
-
return ExecutionResult(
|
42
|
-
success=True,
|
43
|
-
data=result_data,
|
44
|
-
operation=self.OPERATION_NAME,
|
45
|
-
metadata={'operation': self.OPERATION_NAME}
|
46
|
-
)
|
47
|
-
|
48
|
-
def _execute_slicing(self, node: Any, params: Dict, context: ExecutionContext) -> Dict:
|
49
|
-
"""Execute slicing logic."""
|
50
|
-
# Implementation here
|
51
|
-
return {'result': 'SLICING executed', 'params': params}
|
@@ -1,257 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python3
|
2
|
-
"""
|
3
|
-
#exonware/xwnode/src/exonware/xwnode/queries/executors/base.py
|
4
|
-
|
5
|
-
Operation Executor Base Classes
|
6
|
-
|
7
|
-
This module provides base classes for operation executors with capability checking.
|
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
|
-
import time
|
17
|
-
from abc import ABC, abstractmethod
|
18
|
-
from typing import Any, Dict, List, Optional
|
19
|
-
|
20
|
-
from .contracts import (
|
21
|
-
IOperationExecutor,
|
22
|
-
Action,
|
23
|
-
ExecutionContext,
|
24
|
-
ExecutionResult,
|
25
|
-
NodeType
|
26
|
-
)
|
27
|
-
from .defs import OperationCapability
|
28
|
-
from .errors import UnsupportedOperationError # Reuse from root via errors.py
|
29
|
-
from ...errors import XWNodeValueError
|
30
|
-
|
31
|
-
|
32
|
-
class AOperationExecutor(IOperationExecutor):
|
33
|
-
"""
|
34
|
-
Abstract base class for operation executors.
|
35
|
-
|
36
|
-
Provides common functionality including:
|
37
|
-
- Capability checking
|
38
|
-
- Performance monitoring
|
39
|
-
- Error handling
|
40
|
-
- Validation
|
41
|
-
"""
|
42
|
-
|
43
|
-
# Operation name (must be set by subclasses)
|
44
|
-
OPERATION_NAME: str = "UNKNOWN"
|
45
|
-
|
46
|
-
# Supported node types (empty = all types)
|
47
|
-
SUPPORTED_NODE_TYPES: List[NodeType] = []
|
48
|
-
|
49
|
-
# Required capabilities
|
50
|
-
REQUIRED_CAPABILITIES: OperationCapability = OperationCapability.NONE
|
51
|
-
|
52
|
-
def __init__(self):
|
53
|
-
"""Initialize operation executor."""
|
54
|
-
self._execution_count = 0
|
55
|
-
self._total_time = 0.0
|
56
|
-
self._error_count = 0
|
57
|
-
|
58
|
-
def execute(self, action: Action, context: ExecutionContext) -> ExecutionResult:
|
59
|
-
"""
|
60
|
-
Execute operation with monitoring and error handling.
|
61
|
-
|
62
|
-
This method implements the Template Method pattern:
|
63
|
-
1. Validate
|
64
|
-
2. Check capability
|
65
|
-
3. Execute (delegated to subclass)
|
66
|
-
4. Monitor performance
|
67
|
-
"""
|
68
|
-
start_time = time.time()
|
69
|
-
|
70
|
-
try:
|
71
|
-
# Validate action
|
72
|
-
if not self.validate(action, context):
|
73
|
-
raise XWNodeValueError(f"Invalid action: {action.type}")
|
74
|
-
|
75
|
-
# Check capability
|
76
|
-
self.validate_capability_or_raise(context)
|
77
|
-
|
78
|
-
# Execute (delegated to subclass)
|
79
|
-
result = self._do_execute(action, context)
|
80
|
-
|
81
|
-
# Update metrics
|
82
|
-
execution_time = time.time() - start_time
|
83
|
-
self._execution_count += 1
|
84
|
-
self._total_time += execution_time
|
85
|
-
result.execution_time = execution_time
|
86
|
-
|
87
|
-
return result
|
88
|
-
|
89
|
-
except Exception as e:
|
90
|
-
self._error_count += 1
|
91
|
-
execution_time = time.time() - start_time
|
92
|
-
|
93
|
-
return ExecutionResult(
|
94
|
-
data=None,
|
95
|
-
success=False,
|
96
|
-
error=str(e),
|
97
|
-
execution_time=execution_time
|
98
|
-
)
|
99
|
-
|
100
|
-
@abstractmethod
|
101
|
-
def _do_execute(self, action: Action, context: ExecutionContext) -> ExecutionResult:
|
102
|
-
"""
|
103
|
-
Execute the actual operation (implemented by subclasses).
|
104
|
-
|
105
|
-
Args:
|
106
|
-
action: The action to execute
|
107
|
-
context: Execution context
|
108
|
-
|
109
|
-
Returns:
|
110
|
-
ExecutionResult with data
|
111
|
-
"""
|
112
|
-
pass
|
113
|
-
|
114
|
-
def validate(self, action: Action, context: ExecutionContext) -> bool:
|
115
|
-
"""
|
116
|
-
Validate action before execution.
|
117
|
-
|
118
|
-
Default implementation checks basic requirements.
|
119
|
-
Subclasses can override for specific validation.
|
120
|
-
"""
|
121
|
-
if not action or not action.type:
|
122
|
-
return False
|
123
|
-
if not context or not context.node:
|
124
|
-
return False
|
125
|
-
return True
|
126
|
-
|
127
|
-
def can_execute_on(self, node_type: NodeType) -> bool:
|
128
|
-
"""
|
129
|
-
Check if this executor can operate on the given node type.
|
130
|
-
|
131
|
-
Args:
|
132
|
-
node_type: The node type to check
|
133
|
-
|
134
|
-
Returns:
|
135
|
-
True if this executor supports the node type
|
136
|
-
"""
|
137
|
-
# Empty list means supports all types (universal operation)
|
138
|
-
if not self.SUPPORTED_NODE_TYPES:
|
139
|
-
return True
|
140
|
-
return node_type in self.SUPPORTED_NODE_TYPES
|
141
|
-
|
142
|
-
def validate_capability_or_raise(self, context: ExecutionContext) -> None:
|
143
|
-
"""
|
144
|
-
Validate operation can execute on node, raise if not.
|
145
|
-
|
146
|
-
Args:
|
147
|
-
context: Execution context
|
148
|
-
|
149
|
-
Raises:
|
150
|
-
UnsupportedOperationError: If operation cannot execute on node type
|
151
|
-
"""
|
152
|
-
# Get node's strategy type
|
153
|
-
if hasattr(context.node, '_strategy') and hasattr(context.node._strategy, 'STRATEGY_TYPE'):
|
154
|
-
node_type = context.node._strategy.STRATEGY_TYPE
|
155
|
-
elif hasattr(context.node, 'STRATEGY_TYPE'):
|
156
|
-
node_type = context.node.STRATEGY_TYPE
|
157
|
-
else:
|
158
|
-
# Default to TREE for backward compatibility
|
159
|
-
node_type = NodeType.TREE
|
160
|
-
|
161
|
-
# Check if operation can execute on this node type
|
162
|
-
if not self.can_execute_on(node_type):
|
163
|
-
supported = [nt.name for nt in self.SUPPORTED_NODE_TYPES]
|
164
|
-
raise UnsupportedOperationError(
|
165
|
-
self.OPERATION_NAME,
|
166
|
-
node_type,
|
167
|
-
f"Requires one of: {supported}"
|
168
|
-
)
|
169
|
-
|
170
|
-
def estimate_cost(self, action: Action, context: ExecutionContext) -> int:
|
171
|
-
"""
|
172
|
-
Estimate execution cost.
|
173
|
-
|
174
|
-
Default implementation returns fixed cost.
|
175
|
-
Subclasses can override for more accurate estimates.
|
176
|
-
"""
|
177
|
-
return 100
|
178
|
-
|
179
|
-
def get_stats(self) -> Dict[str, Any]:
|
180
|
-
"""Get execution statistics for this executor."""
|
181
|
-
avg_time = self._total_time / self._execution_count if self._execution_count > 0 else 0
|
182
|
-
|
183
|
-
return {
|
184
|
-
'operation': self.OPERATION_NAME,
|
185
|
-
'execution_count': self._execution_count,
|
186
|
-
'total_time': self._total_time,
|
187
|
-
'average_time': avg_time,
|
188
|
-
'error_count': self._error_count,
|
189
|
-
'success_rate': (self._execution_count - self._error_count) / self._execution_count if self._execution_count > 0 else 1.0
|
190
|
-
}
|
191
|
-
|
192
|
-
|
193
|
-
class AUniversalOperationExecutor(AOperationExecutor):
|
194
|
-
"""
|
195
|
-
Base class for universal operations that work on all node types.
|
196
|
-
|
197
|
-
Universal operations:
|
198
|
-
- SELECT, INSERT, UPDATE, DELETE
|
199
|
-
- WHERE, FILTER
|
200
|
-
- GROUP BY, COUNT, SUM, AVG
|
201
|
-
- PROJECT, EXTEND
|
202
|
-
"""
|
203
|
-
|
204
|
-
# Universal operations support all node types (empty list)
|
205
|
-
SUPPORTED_NODE_TYPES: List[NodeType] = []
|
206
|
-
|
207
|
-
|
208
|
-
class ATreeOperationExecutor(AOperationExecutor):
|
209
|
-
"""
|
210
|
-
Base class for tree-specific operations.
|
211
|
-
|
212
|
-
Tree operations:
|
213
|
-
- BETWEEN, RANGE
|
214
|
-
- ORDER BY
|
215
|
-
- MIN, MAX (optimal on trees)
|
216
|
-
"""
|
217
|
-
|
218
|
-
# Only works on tree nodes
|
219
|
-
SUPPORTED_NODE_TYPES: List[NodeType] = [NodeType.TREE]
|
220
|
-
REQUIRED_CAPABILITIES: OperationCapability = OperationCapability.REQUIRES_ORDERED
|
221
|
-
|
222
|
-
|
223
|
-
class AGraphOperationExecutor(AOperationExecutor):
|
224
|
-
"""
|
225
|
-
Base class for graph-specific operations.
|
226
|
-
|
227
|
-
Graph operations:
|
228
|
-
- MATCH, PATH
|
229
|
-
- OUT, IN_TRAVERSE
|
230
|
-
- Graph traversal
|
231
|
-
"""
|
232
|
-
|
233
|
-
# Only works on graph nodes
|
234
|
-
SUPPORTED_NODE_TYPES: List[NodeType] = [NodeType.GRAPH, NodeType.TREE] # Trees can act as graphs
|
235
|
-
|
236
|
-
|
237
|
-
class ALinearOperationExecutor(AOperationExecutor):
|
238
|
-
"""
|
239
|
-
Base class for linear-specific operations.
|
240
|
-
|
241
|
-
Linear operations:
|
242
|
-
- SLICING, INDEXING
|
243
|
-
- Sequential operations
|
244
|
-
"""
|
245
|
-
|
246
|
-
# Only works on linear and matrix nodes
|
247
|
-
SUPPORTED_NODE_TYPES: List[NodeType] = [NodeType.LINEAR, NodeType.MATRIX]
|
248
|
-
|
249
|
-
|
250
|
-
__all__ = [
|
251
|
-
'AOperationExecutor',
|
252
|
-
'AUniversalOperationExecutor',
|
253
|
-
'ATreeOperationExecutor',
|
254
|
-
'AGraphOperationExecutor',
|
255
|
-
'ALinearOperationExecutor',
|
256
|
-
'UnsupportedOperationError',
|
257
|
-
]
|