32
32
from uuid import uuid4
33
33
from django .conf import settings
34
34
35
-
36
35
debug = settings .DEBUG # RO global for this file
37
36
38
37
logger = logging .getLogger ('main_logger' )
@@ -607,76 +606,23 @@ def format_for_display(item):
607
606
608
607
return formatted_item
609
608
610
-
611
- # Builds a BQ API v2 QueryParameter set and WHERE clause string from a set of filters of the form:
612
- # {
613
- # 'field_name': [<value>,...]
614
- # }
615
- # Breaks out '<ATTR> IS NULL'
616
- # 2+ values are converted to IN (<value>,...)
617
- # Filters must already be pre-bucketed or formatted
618
- # TODO: add support for BETWEEN
619
- # TODO: add support for <>=
620
- def build_bq_filter_and_params (filters ):
621
- result = {
622
- 'filter_string' : '' ,
623
- 'parameters' : []
624
- }
625
-
626
- filter_set = []
627
-
628
- for attr , values in filters .items ():
629
- filter_string = ''
630
- query_param = {
631
- 'name' : attr ,
632
- 'parameterType' : {
633
-
634
- },
635
- 'parameterValue' : {
636
-
637
- }
638
- }
639
- if 'None' in values :
640
- values .remove ('None' )
641
- filter_string = "{} IS NULL" .format (attr )
642
-
643
- if len (values ) > 0 :
644
- if len (filter_string ):
645
- filter_string += " OR "
646
- if len (values ) == 1 :
647
- # Scalar param
648
- query_param ['parameterType' ]['type' ] = ('STRING' if re .compile (ur'[^0-9\.]' , re .UNICODE ).search (values [0 ]) else 'INT64' )
649
- query_param ['parameterValue' ]['value' ] = values [0 ]
650
- filter_string += "{} = @{}" .format (attr , attr )
651
- else :
652
- # Array param
653
- query_param ['parameterType' ]['type' ] = "ARRAY"
654
- query_param ['parameterValue' ] = {'arrayValues' : [{'value' : x } for x in values ]}
655
- query_param ['parameterType' ]['arrayType' ] = {'type' : ('STRING' if re .compile (ur'[^0-9\.]' , re .UNICODE ).search (values [0 ]) else 'INT64' )}
656
- filter_string += "{} IN UNNEST(@{})" .format (attr ,attr )
657
-
658
- filter_set .append ('({})' .format (filter_string ))
659
- result ['parameters' ].append (query_param )
660
-
661
- result ['filter_string' ] = " AND " .join (filter_set )
662
-
663
- return result
664
-
665
609
# Construct WHERE clauses for BigQuery and CloudSQL based on a set of filters
666
610
# If the names of the columns differ across the 2 platforms, the alt_key_map can be
667
611
# used to map a filter 'key' to a different column name
668
- def build_where_clause (filters , alt_key_map = False , program = None , for_files = False ):
612
+ def build_where_clause (filters , alt_key_map = False , program = None , for_files = False , comb_with = 'OR' ):
669
613
first = True
670
614
query_str = ''
671
615
big_query_str = '' # todo: make this work for non-string values -- use {}.format
672
616
value_tuple = ()
673
617
key_order = []
674
618
keyType = None
675
- gene = None
676
619
677
620
grouped_filters = None
678
621
679
622
for key , value in filters .items ():
623
+ gene = None
624
+ invert = False
625
+
680
626
if isinstance (value , dict ) and 'values' in value :
681
627
value = value ['values' ]
682
628
@@ -695,6 +641,7 @@ def build_where_clause(filters, alt_key_map=False, program=None, for_files=False
695
641
keyType = key .split (':' )[0 ]
696
642
if keyType == 'MUT' :
697
643
gene = key .split (':' )[2 ]
644
+ invert = bool (key .split (':' )[3 ] == 'NOT' )
698
645
key = key .split (':' )[- 1 ]
699
646
700
647
# Multitable filter lists don't come in as string as they can contain arbitrary text in values
@@ -714,20 +661,20 @@ def build_where_clause(filters, alt_key_map=False, program=None, for_files=False
714
661
if first :
715
662
first = False
716
663
else :
717
- big_query_str += ' AND'
664
+ big_query_str += ' {}' . format ( comb_with )
718
665
719
- big_query_str += " %s = '{hugo_symbol}' AND " % 'Hugo_Symbol'
666
+ big_query_str += " ( %s = '{hugo_symbol}' AND " % 'Hugo_Symbol'
720
667
params ['gene' ] = gene
721
668
722
669
if (key == 'category' ):
723
670
if value == 'any' :
724
- big_query_str += '%s IS NOT NULL' % 'Variant_Classification'
671
+ big_query_str += '%s IS NOT NULL) ' % 'Variant_Classification'
725
672
params ['var_class' ] = ''
726
673
else :
727
- big_query_str += '%s IN ({var_class})' % 'Variant_Classification'
674
+ big_query_str += '%s {} IN ({var_class}))' . format ( 'Variant_Classification' , "NOT " if invert else "" )
728
675
values = MOLECULAR_CATEGORIES [value ]['attrs' ]
729
676
else :
730
- big_query_str += '%s IN ({var_class})' % 'Variant_Classification'
677
+ big_query_str += '%s {} IN ({var_class}))' . format ( 'Variant_Classification' , "NOT " if invert else "" )
731
678
values = value
732
679
733
680
if value != 'any' :
@@ -854,7 +801,7 @@ def build_where_clause(filters, alt_key_map=False, program=None, for_files=False
854
801
855
802
856
803
def sql_simple_number_by_200 (value , field ):
857
- if debug : print >> sys . stderr , ' Called ' + sys ._getframe ().f_code .co_name
804
+ if debug : logger . debug ( '[DEBUG] Called ' + sys ._getframe ().f_code .co_name )
858
805
result = ''
859
806
860
807
if isinstance (value , basestring ):
@@ -1011,7 +958,7 @@ def sql_bmi_by_ranges(value):
1011
958
1012
959
1013
960
def sql_age_by_ranges (value , bin_by_five = False ):
1014
- if debug : print >> sys . stderr , ' Called '+ sys ._getframe ().f_code .co_name
961
+ if debug : logger . debug ( '[DEBUG] Called '+ sys ._getframe ().f_code .co_name )
1015
962
result = ''
1016
963
if isinstance (value , basestring ):
1017
964
value = [value ]
@@ -1064,7 +1011,7 @@ def sql_age_by_ranges(value, bin_by_five=False):
1064
1011
1065
1012
1066
1013
def gql_age_by_ranges (q , key , value ):
1067
- if debug : print >> sys . stderr , ' Called '+ sys ._getframe ().f_code .co_name
1014
+ if debug : logger . debug ( '[DEBUG] Called '+ sys ._getframe ().f_code .co_name )
1068
1015
result = ''
1069
1016
if not isinstance (value , basestring ):
1070
1017
# value is a list of ranges
@@ -1111,7 +1058,7 @@ def submit_bigquery_job(bq_service, project_id, query_body, batch=False):
1111
1058
job_data = {
1112
1059
'jobReference' : {
1113
1060
'projectId' : project_id ,
1114
- 'job_id ' : str (uuid4 ())
1061
+ 'jobId ' : str (uuid4 ())
1115
1062
},
1116
1063
'configuration' : {
1117
1064
'query' : {
0 commit comments