Skip to content

Commit 7ba09dc

Browse files
committed
Work on WHERE parsing
- add get_column_name_with_alias_table() method - work on WHERE parsing
1 parent f88352c commit 7ba09dc

3 files changed

Lines changed: 119 additions & 70 deletions

File tree

Parser.py

Lines changed: 109 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -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

222225
class 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

Query.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,10 @@ def get_column(self):
197197
return self.column
198198

199199
def get_just_column_name(self, column):
200-
return column.rsplit('.', 1)[1]
200+
if column != str(None):
201+
return column.rsplit('.', 1)[1]
202+
else:
203+
return column
201204

202205
def get_operator(self):
203206
return self.operator
@@ -238,7 +241,7 @@ def print_json(self, output):
238241
if len(self.conditions) == 1:
239242
output.write('\t"where": {\n')
240243
output.write('\t\t"condition": [\n')
241-
self.conditions[0][1].print_me(output)
244+
self.conditions[0][1].print_json(output)
242245
output.write('\n')
243246
output.write('\t\t]\n')
244247
output.write('\t},\n')
@@ -248,7 +251,7 @@ def print_json(self, output):
248251
for i in range(0, len(self.conditions)):
249252
if self.conditions[i][0] is not None:
250253
output.write('\t\t\t{ "operator": "' + str(self.conditions[i][0]) + '" },\n')
251-
self.conditions[i][1].print_me(output)
254+
self.conditions[i][1].print_json(output)
252255
if i != (len(self.conditions)-1):
253256
output.write(',')
254257
output.write('\n')

ln2sql.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,10 @@ def main(argv):
101101
if json_output_path is not None:
102102
json_output_path = str(json_output_path)
103103

104-
try:
105-
ln2sql(str(database_path), str(input_sentence), str(language_path), thesaurus_path, json_output_path)
106-
except Exception, e:
107-
print color.BOLD + color.RED + str(e) + color.END
104+
#try:
105+
ln2sql(str(database_path), str(input_sentence), str(language_path), thesaurus_path, json_output_path)
106+
#except Exception, e:
107+
# print color.BOLD + color.RED + str(e) + color.END
108108

109109
except getopt.GetoptError:
110110
print_help_message()

0 commit comments

Comments
 (0)