138 |
138 |
139 #self.inputmap = inputmap |
139 #self.inputmap = inputmap |
140 |
140 |
141 def mytest_repr(self): |
141 def mytest_repr(self): |
142 """return a representation of this step suitable for test""" |
142 """return a representation of this step suitable for test""" |
143 sel = self.select.selection |
|
144 restr = self.select.where |
|
145 self.select.selection = self.selection |
|
146 self.select.where = None |
|
147 rql = self.select.as_string(kwargs=self.plan.args) |
|
148 self.select.selection = sel |
|
149 self.select.where = restr |
|
150 try: |
143 try: |
151 # rely on a monkey patch (cf unittest_querier) |
144 # rely on a monkey patch (cf unittest_querier) |
152 table = self.plan.tablesinorder[self.table] |
145 table = self.plan.tablesinorder[self.table] |
153 outputtable = self.outputtable and self.plan.tablesinorder[self.outputtable] |
146 outputtable = self.outputtable and self.plan.tablesinorder[self.outputtable] |
154 except AttributeError: |
147 except AttributeError: |
155 # not monkey patched |
148 # not monkey patched |
156 table = self.table |
149 table = self.table |
157 outputtable = self.outputtable |
150 outputtable = self.outputtable |
158 return (self.__class__.__name__, rql, self.limit, self.offset, table, |
151 sql = self.get_sql().replace(self.table, table) |
159 outputtable) |
152 return (self.__class__.__name__, sql, outputtable) |
160 |
153 |
161 def execute(self): |
154 def execute(self): |
162 """execute this step""" |
155 """execute this step""" |
163 self.execute_children() |
156 self.execute_children() |
|
157 sql = self.get_sql() |
|
158 if self.outputtable: |
|
159 self.plan.create_temp_table(self.outputtable) |
|
160 sql = 'INSERT INTO %s %s' % (self.outputtable, sql) |
|
161 return self.plan.sqlexec(sql, self.plan.args) |
|
162 |
|
163 def get_sql(self): |
164 self.inputmap = inputmap = self.children[-1].outputmap |
164 self.inputmap = inputmap = self.children[-1].outputmap |
165 # get the select clause |
165 # get the select clause |
166 clause = [] |
166 clause = [] |
167 for i, term in enumerate(self.selection): |
167 for i, term in enumerate(self.selection): |
168 try: |
168 try: |
221 sql.append('ORDER BY %s' % ', '.join(clause)) |
221 sql.append('ORDER BY %s' % ', '.join(clause)) |
222 if self.limit: |
222 if self.limit: |
223 sql.append('LIMIT %s' % self.limit) |
223 sql.append('LIMIT %s' % self.limit) |
224 if self.offset: |
224 if self.offset: |
225 sql.append('OFFSET %s' % self.offset) |
225 sql.append('OFFSET %s' % self.offset) |
226 #print 'DATA', plan.sqlexec('SELECT * FROM %s' % self.table, None) |
226 return ' '.join(sql) |
227 sql = ' '.join(sql) |
|
228 if self.outputtable: |
|
229 self.plan.create_temp_table(self.outputtable) |
|
230 sql = 'INSERT INTO %s %s' % (self.outputtable, sql) |
|
231 return self.plan.sqlexec(sql, self.plan.args) |
|
232 |
227 |
233 def visit_function(self, function): |
228 def visit_function(self, function): |
234 """generate SQL name for a function""" |
229 """generate SQL name for a function""" |
235 return '%s(%s)' % (function.name, |
230 try: |
236 ','.join(c.accept(self) for c in function.children)) |
231 return self.children[0].outputmap[str(function)] |
|
232 except KeyError: |
|
233 return '%s(%s)' % (function.name, |
|
234 ','.join(c.accept(self) for c in function.children)) |
237 |
235 |
238 def visit_variableref(self, variableref): |
236 def visit_variableref(self, variableref): |
239 """get the sql name for a variable reference""" |
237 """get the sql name for a variable reference""" |
240 try: |
238 try: |
241 return self.inputmap[variableref.name] |
239 return self.inputmap[variableref.name] |