def __init__(self, customColumnTag): self.type = "customColumn" self.taskOrder = 1 self.outputColumn = cs.grabAttribute(customColumnTag,"outputColumn") self.field = chimpspec.SpecificationRecordField(customColumnTag, None) assembler = customColumnTag.getElementsByTagName("contentAssembler") if len(assembler)>0: self.contentAssembler = ContentAssembler(assembler[0]) else: self.contentAssembler = None self.triggeringColumns=[] triggeringColumnsTag = customColumnTag.getElementsByTagName("triggeringColumns") if len(triggeringColumnsTag)>0: for column in triggeringColumnsTag[0].getElementsByTagName("column"): columnName = cs.grabAttribute(column, "name") self.triggeringColumns.append(columnName) templateAssemblerTag = customColumnTag.getElementsByTagName("templateAssembler") self.templateAssembler = ContentAssembler(templateAssemblerTag)
class CustomColumn: class ContentElement: def __init__(self, contentElementTag): self.prefix = cs.grabAttribute(contentElementTag,"prefix") self.column = cs.grabAttribute(contentElementTag,"column") self.suffix = cs.grabAttribute(contentElementTag,"suffix") def debug(self, appLogger): appLogger.debug(" * {0}|{1}|{2}".format(self.prefix, self.column, self.suffix)) def __init__(self, customColumnTag): self.type = "customColumn" self.taskOrder = 1 self.outputColumn = cs.grabAttribute(customColumnTag,"outputColumn") self.field = chimpspec.SpecificationRecordField(customColumnTag, None) assembler = customColumnTag.getElementsByTagName("contentAssembler") if len(assembler)>0: self.contentAssembler = ContentAssembler(assembler[0]) else: self.contentAssembler = None self.triggeringColumns=[] triggeringColumnsTag = customColumnTag.getElementsByTagName("triggeringColumns") if len(triggeringColumnsTag)>0: for column in triggeringColumnsTag[0].getElementsByTagName("column"): columnName = cs.grabAttribute(column, "name") self.triggeringColumns.append(columnName) templateAssemblerTag = customColumnTag.getElementsByTagName("templateAssembler") self.templateAssembler = ContentAssembler(templateAssemblerTag) def getTriggeringColumns(self): return(map(lambda field:"{0}".format(field.column), self.templateAssembler.contentElements)) def debug(self, appLogger): appLogger.debug(" customColumn") appLogger.debug(" outputColumn : {0}".format(self.outputColumn)) appLogger.debug(" label : {0}".format(self.field.label)) appLogger.debug(" type : {0}".format(self.field.type)) appLogger.debug(" size : {0}".format(self.field.size)) appLogger.debug(" array : {0}".format(self.field.array)) appLogger.debug(" decimalPlaces: {0}".format(self.field.decimalPlaces)) self.templateAssembler.debug(appLogger) def getExtraSystemFields(self): extraSystemFields = [] extraSystemFields.append(self.field) return(extraSystemFields) def requiresFile(self): return(True) def getCustomRegistrationDML(self, specificationName, schemaName, sourceName, seq, repositoryPath): # 1: specification_name, # 2: source_schema, # 3: source_name, # 4: output_column_list, # 5: seq, # 6: input_id_column, # 7: input_column_list, # 8: processing_script_location inputColumnList = "1???" return chimpsql.DML(("SELECT {0}.register_custom('{1}', '{2}', '{3}', '{4}', " "{5}, '{6}');\n\n").format(CALC_SCHEMA, specificationName, schemaName, sourceName, self.outputColumn, seq, inputColumnList), dropDdl="SELECT {0}.unregister_custom('{1}','{2}','{3}','{4}');\n".format(CALC_SCHEMA, specificationName, schemaName,sourceName,self.outputColumn)) def getCustomQueueTable(self,sourceName): tableName = "{0}_custom_queue".format(sourceName) ddl = ( "CREATE TABLE {0}.{1} (\n" " source_id bigint NOT NULL PRIMARY KEY);\n\n".format(CALC_SCHEMA, tableName)) return chimpsql.Table(tableName, CALC_SCHEMA, ddl) def getCustomQueueFunction(self, sourceName): functionName = "add_to_{0}_custom_queue".format(sourceName) return chimpsql.Function(functionName, CALC_SCHEMA, [], ("CREATE OR REPLACE FUNCTION {0}.{1}()\n" " RETURNS trigger AS\n" "$BODY$\n" "DECLARE\n" " v_exists BOOLEAN;\n" "BEGIN\n" " SELECT exists(SELECT 1 FROM {0}.{2}_custom_queue WHERE source_id = new.id)\n" " INTO v_exists;\n" " IF NOT v_exists THEN\n" " INSERT INTO {0}.{2}_custom_queue(\n" " source_id)\n" " VALUES (\n" " new.id);\n" " END IF;\n" " RETURN new;\n" "END;\n" "$BODY$\n" "LANGUAGE plpgsql;\n\n").format(CALC_SCHEMA, functionName, sourceName)) def getCustomQueueInsertTrigger(self, sourceSchema, sourceName, triggerFunction): triggerName = "j_add_{0}_insert_to_custom_queue".format(sourceName) return chimpsql.Trigger(triggerName, sourceName, triggerFunction.name, sourceSchema, ("CREATE TRIGGER {0}\n" "AFTER INSERT\n" "ON {1}.{2}\n" "FOR EACH ROW\n" "EXECUTE PROCEDURE {3}.{4}();\n\n").format(triggerName, sourceSchema, sourceName, CALC_SCHEMA, triggerFunction.name)) def getCustomQueueUpdateTrigger(self, sourceSchema, sourceName, triggerFunction, allTriggeringColumns): triggerName = "j_add_{0}_update_to_custom_queue".format(sourceName) ofClause = ", ".join(allTriggeringColumns) whenClause=" OR ".join(map(lambda field: "old.{0} IS DISTINCT FROM new.{0}".format(field), allTriggeringColumns)) return chimpsql.Trigger(triggerName, sourceName, triggerFunction.name, sourceSchema, ("CREATE TRIGGER {0}\n" "AFTER UPDATE\n" "OF {1}\n" "ON {2}.{3}\n" "FOR EACH ROW\n" "WHEN ({4})\n" "EXECUTE PROCEDURE {5}.{6}();\n\n").format(triggerName, ofClause, sourceSchema, sourceName, whenClause, CALC_SCHEMA, triggerFunction.name)) def getFunctionScript(self, source): body= ("\t# Function to derive contents of:\n" "\t# {0}\n" "\tdef custom_{1}_calculator(self, dbCursor, data):\n".format(self.field.columnClause(False), self.outputColumn)) body += self.templateAssembler.getScript(source) return(body) def getPinScript(self): body = self.templateAssembler.getPinScript(self.outputColumn) return(body)