-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathzendb_physical.py
More file actions
88 lines (69 loc) · 2.82 KB
/
zendb_physical.py
File metadata and controls
88 lines (69 loc) · 2.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
from quest.sql.nn import *
from quest.core.node import ast_node as astn
from quest.conf import sqlconst
import copy
from quest.sql.nn.zendb_retrieve_text import ZendbRetrieveText
class ZendbTextPhysicalPlanner(object):
"""
convert the rest logical to physical
"""
def __init__(self, indexer, querier, sampler):
self.root = None
self.global_indexer = indexer# to attach nn with document indexer
self.querier = querier
self.sampler = sampler
def build_retrieve(self, root : LogicalRetrieve):
# default retrieve build as all
node = ZendbRetrieveText(root.columns, root.table, 'Text')
ind, typ = self.global_indexer.get_indexer(root.table)
node.set_indexer(ind)
node.set_retrieveList(node.indexer.get_docs_id())
node.set_sampler(self.sampler)
return node
def build_filter(self, root : LogicalFilter):
node = FilterText(root.columns, root.table, 'Text', root.root)
node.set_querier(self.querier)
return node
def build_extract(self, root : LogicalExtract):
node = ExtractText(root.columns, root.table, 'Text')
node.set_querier(self.querier)
return node
def build_projection(self, root : LogicalProjection):
node = ProjectionText(root.columns, 'Text')
node.set_indexer(self.global_indexer)
return node
def build_join(self, root : LogicalJoin):
node = JoinText(root.join_type, root.join_order, 'Text')
return node
def build_aggregation(self, root : LogicalAggregation):
node = AggregationText(root.functions, root.gp_columns, root.columns, 'Text')
return node
def dfs_build(self, root):
if root.visited or isinstance(root, Physical):
return root
root.visited = True
now_input = []
for x in root.input:
son = self.dfs_build(x)
if isinstance(son, list):
now_input.extend(son)
else:
now_input.append(son)
# build root to Physical
res = None
for name in sqlconst.nnType:
if not name in root.__class__.__name__.lower():
continue
func_name = 'build_' + name
print("now try process build: ", func_name)
method = getattr(self, func_name, None)
if callable(method):
print("now process build: ", func_name)
res = method(root)
else:
raise Exception('No method found for class {root.__class__.__name__}')
res.set_input(now_input)
return res
def build(self, root):
self.root = self.dfs_build(root)
return self.root