in 5-app-infra/3-artifact-publish/docker/cdmc/tag_engine_api/DataCatalogController.py [0:0]
def parse_query_expression(self, uri, query_expression, column=None):
query_str = None
# analyze query expression
from_index = query_expression.rfind(" from ", 0)
where_index = query_expression.rfind(" where ", 0)
project_index = query_expression.rfind("$project", 0)
dataset_index = query_expression.rfind("$dataset", 0)
table_index = query_expression.rfind("$table", 0)
from_clause_table_index = query_expression.rfind(" from $table", 0)
from_clause_backticks_table_index = query_expression.rfind(" from `$table`", 0)
column_index = query_expression.rfind("$column", 0)
#print('table_index: ', table_index)
#print('column_index: ', column_index)
if project_index != -1:
project_end = uri.find('/')
project = uri[0:project_end]
#print('project: ' + project)
#print('project_index: ', project_index)
if dataset_index != -1:
dataset_start = uri.find('/datasets/') + 10
dataset_string = uri[dataset_start:]
dataset_end = dataset_string.find('/')
if dataset_end == -1:
dataset = dataset_string[0:]
else:
dataset = dataset_string[0:dataset_end]
print('dataset:', dataset)
print('dataset_end:', dataset_end)
print('dataset_index:', dataset_index)
# $table referenced in from clause, use fully qualified table
if from_clause_table_index > 0 or from_clause_backticks_table_index > 0:
print('$table referenced in from clause')
qualified_table = uri.replace('/project/', '.').replace('/datasets/', '.').replace('/tables/', '.')
print('qualified_table:', qualified_table)
print('query_expression:', query_expression)
query_str = query_expression.replace('$table', qualified_table)
print('query_str:', query_str)
# $table is referenced somewhere in the expression, replace $table with actual table name
else:
if table_index != -1:
#print('$table referenced somewhere, but not in the from clause')
table_index = uri.rfind('/') + 1
table_name = uri[table_index:]
#print('table_name: ' + table_name)
query_str = query_expression.replace('$table', table_name)
# $project referenced in where clause too
if project_index > -1:
if query_str == None:
query_str = query_expression.replace('$project', project)
else:
query_str = query_str.replace('$project', project)
#print('query_str: ', query_str)
# $dataset referenced in where clause too
if dataset_index > -1:
if query_str == None:
query_str = query_expression.replace('$dataset', dataset)
else:
query_str = query_str.replace('$dataset', dataset)
print('query_str: ', query_str)
# table not in query expression (e.g. select 'string')
if table_index == -1 and query_str == None:
query_str = query_expression
if column_index != -1:
if query_str == None:
query_str = query_expression.replace('$column', column)
else:
query_str = query_str.replace('$column', column)
#print('returning query_str:', query_str)
return query_str