@@ -31,6 +31,14 @@ def get_tables_of_column(self, column):
3131 tmp_table .append (table )
3232 return tmp_table
3333
34+ def get_column_name_with_alias_table (self , column , table_of_from ):
35+ one_table_of_column = self .get_tables_of_column (column )[0 ]
36+ tables_of_column = self .get_tables_of_column (column )
37+ if table_of_from in tables_of_column :
38+ return str (table_of_from ) + '.' + str (column )
39+ else :
40+ return str (one_table_of_column ) + '.' + str (column )
41+
3442 def run (self ):
3543 for table_of_from in self .tables_of_from :
3644 self .select_object = Select ()
@@ -80,12 +88,7 @@ def run(self):
8088 if i >= len (self .columns_of_select ):
8189 column = None
8290 else :
83- one_table_of_column = self .get_tables_of_column (self .columns_of_select [i ])[0 ]
84- tables_of_column = self .get_tables_of_column (self .columns_of_select [i ])
85- if table_of_from in tables_of_column :
86- column = str (table_of_from ) + '.' + str (self .columns_of_select [i ])
87- else :
88- column = str (one_table_of_column ) + '.' + str (self .columns_of_select [i ])
91+ column = self .get_column_name_with_alias_table (self .columns_of_select [i ], table_of_from )
8992 self .select_object .add_column (column , select_type )
9093
9194 self .select_objects .append (self .select_object )
@@ -220,10 +223,10 @@ def join(self):
220223 return self .queries
221224
222225class WhereParser (Thread ):
223- def __init__ (self , phrase , tables_of_from , count_keywords , sum_keywords , average_keywords , max_keywords , min_keywords , greater_keywords , less_keywords , between_keywords , negation_keywords , database_dico ):
226+ def __init__ (self , phrases , tables_of_from , count_keywords , sum_keywords , average_keywords , max_keywords , min_keywords , greater_keywords , less_keywords , between_keywords , negation_keywords , junction_keywords , disjunction_keywords , database_dico ):
224227 Thread .__init__ (self )
225228 self .where_objects = []
226- self .phrase = phrase
229+ self .phrases = phrases
227230 self .tables_of_from = tables_of_from
228231 self .count_keywords = count_keywords
229232 self .sum_keywords = sum_keywords
@@ -234,55 +237,92 @@ def __init__(self, phrase, tables_of_from, count_keywords, sum_keywords, average
234237 self .less_keywords = less_keywords
235238 self .between_keywords = between_keywords
236239 self .negation_keywords = negation_keywords
240+ self .junction_keywords = junction_keywords
241+ self .disjunction_keywords = disjunction_keywords
237242 self .database_dico = database_dico
238243
244+ def get_tables_of_column (self , column ):
245+ tmp_table = []
246+ for table in self .database_dico :
247+ if column in self .database_dico [table ]:
248+ tmp_table .append (table )
249+ return tmp_table
250+
251+ def get_column_name_with_alias_table (self ,column , table_of_from ):
252+ one_table_of_column = self .get_tables_of_column (column )[0 ]
253+ tables_of_column = self .get_tables_of_column (column )
254+ if table_of_from in tables_of_column :
255+ return str (table_of_from ) + '.' + str (column )
256+ else :
257+ return str (one_table_of_column ) + '.' + str (column )
258+
239259 def run (self ):
240260 number_of_where_columns = 0
241261 columns_of_where = []
242- offset = {}
243-
244- for i in range (0 , len (self .phrase )):
245- for table in self .database_dico :
246- if self .phrase [i ] in self .database_dico [table ]:
247- number_of_where_columns += 1
248- columns_of_where .append (self .phrase [i ])
249- offset [self .phrase [i ]] = i
250- break
251- if self .phrase [i ] in self .count_keywords :
252- #do something
253- return
254- if self .phrase [i ] in self .sum_keywords :
255- #do something
256- return
257- if self .phrase [i ] in self .average_keywords :
258- #do something
259- return
260- if self .phrase [i ] in self .max_keywords :
261- #do something
262- return
263- if self .phrase [i ] in self .min_keywords :
264- #do something
265- return
266- if self .phrase [i ] in self .greater_keywords :
267- #do something
268- return
269- if self .phrase [i ] in self .less_keywords :
270- #do something
271- return
272- if self .phrase [i ] in self .between_keywords :
273- #do something
274- return
275- if self .phrase [i ] in self .negation_keywords :
276- #do something
277- return
278-
279- #print number_of_where_columns
280- #print columns_of_where
281- #print offset
262+ offset_of = {}
263+ column_offset = []
264+ count_keyword_offset = []
265+ sum_keyword_offset = []
266+ average_keyword_offset = []
267+ max_keyword_offset = []
268+ min_keyword_offset = []
269+ greater_keyword_offset = []
270+ less_keyword_offset = []
271+ between_keyword_offset = []
272+ junction_keyword_offset = []
273+ disjunction_keyword_offset = []
274+ negation_keyword_offset = []
275+
276+ for phrase in self .phrases :
277+ for i in range (0 , len (phrase )):
278+ for table in self .database_dico :
279+ if phrase [i ] in self .database_dico [table ]:
280+ number_of_where_columns += 1
281+ columns_of_where .append (phrase [i ])
282+ offset_of [phrase [i ]] = i
283+ column_offset .append (i )
284+ break
285+ if phrase [i ] in self .count_keywords : # before the column
286+ count_keyword_offset .append (i )
287+ if phrase [i ] in self .sum_keywords : # before the column
288+ sum_keyword_offset .append (i )
289+ if phrase [i ] in self .average_keywords : # before the column
290+ average_keyword_offset .append (i )
291+ if phrase [i ] in self .max_keywords : # before the column
292+ max_keyword_offset .append (i )
293+ if phrase [i ] in self .min_keywords : # before the column
294+ min_keyword_offset .append (i )
295+ if phrase [i ] in self .greater_keywords : # after the column
296+ greater_keyword_offset .append (i )
297+ if phrase [i ] in self .less_keywords : # after the column
298+ less_keyword_offset .append (i )
299+ if phrase [i ] in self .between_keywords : # after the column
300+ between_keyword_offset .append (i )
301+ if phrase [i ] in self .junction_keywords : # between the column and the equal, greater or less keyword
302+ junction_keyword_offset .append (i )
303+ if phrase [i ] in self .disjunction_keywords : # after the column
304+ disjunction_keyword_offset .append (i )
305+ if phrase [i ] in self .negation_keywords : # between the column and the equal, greater or less keyword
306+ negation_keyword_offset .append (i )
282307
283308 for table_of_from in self .tables_of_from :
284- where_object = Where ()
285- self .where_objects .append (where_object )
309+ where_object = Where ()
310+ for i in range (0 , len (column_offset )):
311+ if i == 0 :
312+ previous = 0
313+ else :
314+ previous = column_offset [i - 1 ]
315+
316+ if i == (len (column_offset ) - 1 ):
317+ _next = - 1
318+ else :
319+ _next = column_offset [i + 1 ]
320+
321+ junction = None
322+ operator = None
323+ value = None
324+ where_object .add_condition (junction , Condition (None , operator , value ))
325+ self .where_objects .append (where_object )
286326
287327 def join (self ):
288328 Thread .join (self )
@@ -303,19 +343,22 @@ def get_tables_of_column(self, column):
303343 tmp_table .append (table )
304344 return tmp_table
305345
346+ def get_column_name_with_alias_table (self , column , table_of_from ):
347+ one_table_of_column = self .get_tables_of_column (column )[0 ]
348+ tables_of_column = self .get_tables_of_column (column )
349+ if table_of_from in tables_of_column :
350+ return str (table_of_from ) + '.' + str (column )
351+ else :
352+ return str (one_table_of_column ) + '.' + str (column )
353+
306354 def run (self ):
307355 for table_of_from in self .tables_of_from :
308356 group_by_object = GroupBy ()
309357 for phrase in self .phrases :
310358 for i in range (0 , len (phrase )):
311359 for table in self .database_dico :
312360 if phrase [i ] in self .database_dico [table ]:
313- one_table_of_column = self .get_tables_of_column (phrase [i ])[0 ]
314- tables_of_column = self .get_tables_of_column (phrase [i ])
315- if table_of_from in tables_of_column :
316- column = str (table_of_from ) + '.' + str (phrase [i ])
317- else :
318- column = str (one_table_of_column ) + '.' + str (phrase [i ])
361+ column = self .get_column_name_with_alias_table (phrase [i ], table_of_from )
319362 group_by_object .set_column (column )
320363 self .group_by_objects .append (group_by_object )
321364
@@ -338,19 +381,22 @@ def get_tables_of_column(self, column):
338381 tmp_table .append (table )
339382 return tmp_table
340383
384+ def get_column_name_with_alias_table (self , column , table_of_from ):
385+ one_table_of_column = self .get_tables_of_column (column )[0 ]
386+ tables_of_column = self .get_tables_of_column (column )
387+ if table_of_from in tables_of_column :
388+ return str (table_of_from ) + '.' + str (column )
389+ else :
390+ return str (one_table_of_column ) + '.' + str (column )
391+
341392 def run (self ):
342393 for table_of_from in self .tables_of_from :
343394 order_by_object = OrderBy ()
344395 for phrase in self .phrases :
345396 for i in range (0 , len (phrase )):
346397 for table in self .database_dico :
347398 if phrase [i ] in self .database_dico [table ]:
348- one_table_of_column = self .get_tables_of_column (phrase [i ])[0 ]
349- tables_of_column = self .get_tables_of_column (phrase [i ])
350- if table_of_from in tables_of_column :
351- column = str (table_of_from ) + '.' + str (phrase [i ])
352- else :
353- column = str (one_table_of_column ) + '.' + str (phrase [i ])
399+ column = self .get_column_name_with_alias_table (phrase [i ], table_of_from )
354400 order_by_object .add_column (column )
355401 order_by_object .set_order (0 )
356402 self .order_by_objects .append (order_by_object )
@@ -523,7 +569,7 @@ def parse_sentence(self, sentence):
523569
524570 select_parser = SelectParser (columns_of_select , tables_of_from , select_phrase , self .count_keywords , self .sum_keywords , self .average_keywords , self .max_keywords , self .min_keywords , self .database_dico )
525571 from_parser = FromParser (tables_of_from , columns_of_select , columns_of_where , self .database_object )
526- where_parser = WhereParser (new_where_phrase , tables_of_from , self .count_keywords , self .sum_keywords , self .average_keywords , self .max_keywords , self .min_keywords , self .greater_keywords , self .less_keywords , self .between_keywords , self .negation_keywords , self .database_dico )
572+ where_parser = WhereParser (new_where_phrase , tables_of_from , self .count_keywords , self .sum_keywords , self .average_keywords , self .max_keywords , self .min_keywords , self .greater_keywords , self .less_keywords , self .between_keywords , self .negation_keywords , self .junction_keywords , self . disjunction_keywords , self . database_dico )
527573 group_by_parser = GroupByParser (group_by_phrase , tables_of_from , self .database_dico )
528574 order_by_parser = OrderByParser (order_by_phrase , tables_of_from , self .database_dico )
529575
0 commit comments