From 524a87a592b08ede0c8615c070b3728958e8d520 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Victor=20Frans=20Pondaco=20Winandy?=
 <jvfpw18@inf.ufpr.br>
Date: Tue, 18 Aug 2020 17:23:40 -0300
Subject: [PATCH] Fix derivatives not being executed

---
 database/database_table.py | 33 ++++++++++++++++++++++-----------
 1 file changed, 22 insertions(+), 11 deletions(-)

diff --git a/database/database_table.py b/database/database_table.py
index e367277..8483a85 100644
--- a/database/database_table.py
+++ b/database/database_table.py
@@ -203,11 +203,13 @@ class DatabaseTable(Table):
             bind = self.metadata.bind
 
         pks = get_primary_keys(self)
-        primary_keys = (ttable.columns.get(pk.name) for pk in pks)
 
-        new_pk = PrimaryKeyConstraint(*primary_keys)
-        query = AddConstraint(new_pk)
-        bind.execute(query)
+        if len(pks) > 0:
+            primary_keys = (ttable.columns.get(pk.name) for pk in pks)
+
+            new_pk = PrimaryKeyConstraint(*primary_keys)
+            query = AddConstraint(new_pk)
+            bind.execute(query)
 
     def populate_temporary(self, ttable, in_file, header, year, delimiters=[';', '\\n', '"'],
                            null='', offset=2, bind=None):
@@ -790,7 +792,7 @@ class DatabaseTable(Table):
 
         if target is not None and str(self) + '.' + target in recursion_list:
             # This is a circular reference. Don't be like that.
-            print(target)
+            print(target, self)
             raise CircularReferenceError(target)
 
         # Query for the column, header of csv or var name if empty
@@ -815,7 +817,10 @@ class DatabaseTable(Table):
         referred_tables = []
 
         case = case.strip("~")      # doesn't need "~" anymore
-        for substr in case.split():
+        str_list = re.findall(r'("[\w]"|[\w.]+)', case)
+        # str_list = case.split()
+        for substr in str_list:
+            # print('ss', substr)
             if '.' in substr:        # We have a var from another table
                 table = substr.split('.')[0]
                 table = gen_data_table(table, self.metadata)
@@ -825,12 +830,17 @@ class DatabaseTable(Table):
                 var_name = substr
 
             # If it is a var, will need to be evaluated as it's a dependency.
-            if table._protocol.target_from_dbcolumn(var_name) is not None:
+            if table._protocol and table._protocol.target_from_dbcolumn(var_name) is not None:
                 # Prevents lowering level if var is an aggregation.
-                print("VAR", var_name)
                 level = max(level + table._derivative_recursion(var_name, year, recursion_list)['level'], level)
-                if table is not self and table not in referred_tables:
-                    referred_tables.append(table)
+            else:
+                var_target = self._get_variable_target(var_name.strip('"'), year)
+                if var_target is not None:
+                    var_db = self._protocol.dbcolumn_from_target(var_target)[0]
+                    case = case.replace(var_name, var_db)
+
+            if table is not self and table not in referred_tables:
+                referred_tables.append(table)
 
         self._derivatives[target] = {'query': case, 'dbcolumn': dbcolumn, 'level': level, 'tables': referred_tables}
         return self._derivatives[target]
@@ -880,11 +890,12 @@ class DatabaseTable(Table):
 
     def _apply_denormalization(self, ttable, year, column, denorm_query, referred_tables, bind):
         query = update(ttable)
+        print(ttable.name)
 
         query = query.values(**{column: text(denorm_query)})
+        print('qc', query, column)
 
         for ref_table in referred_tables:
-            ref_table = gen_data_table(ref_table, self.metadata)
             ref_table.map_from_database(bind)
             try:
                 fk_tuples = [(ttable.columns.get(fk_column.name), fkey)
-- 
GitLab