From 4c3d338d55487b70c34cd0da6bf3febd4008319a Mon Sep 17 00:00:00 2001 From: Kevin Hashimoto Date: Wed, 15 Jan 2025 15:20:32 -0800 Subject: [PATCH 1/4] feat: parse location and assign to appropriate lcfs fields --- .../versions/2025-01-15-22-48_5bc0ef48739a.py | 44 ++++++ etl/database/nifi-registry-primary.mv.db | Bin 94208 -> 106496 bytes etl/nifi/conf/flow.json.gz | Bin 9966 -> 9976 bytes etl/nifi/conf/flow.xml.gz | Bin 15496 -> 15510 bytes etl/nifi_scripts/fuel_code.groovy | 128 +++++++++++++++++- 5 files changed, 165 insertions(+), 7 deletions(-) create mode 100644 backend/lcfs/db/migrations/versions/2025-01-15-22-48_5bc0ef48739a.py diff --git a/backend/lcfs/db/migrations/versions/2025-01-15-22-48_5bc0ef48739a.py b/backend/lcfs/db/migrations/versions/2025-01-15-22-48_5bc0ef48739a.py new file mode 100644 index 000000000..eb19ef8c9 --- /dev/null +++ b/backend/lcfs/db/migrations/versions/2025-01-15-22-48_5bc0ef48739a.py @@ -0,0 +1,44 @@ +"""add truck and marine transport mode + +Revision ID: 5bc0ef48739a +Revises: f78e53370ed2 +Create Date: 2025-01-15 22:48:43.582069 + +""" + +import sqlalchemy as sa +from alembic import op +from datetime import datetime + +# revision identifiers, used by Alembic. +revision = "5bc0ef48739a" +down_revision = "f78e53370ed2" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + current_time = datetime.now() + + # Insert Truck and Marine transport modes + op.execute( + """ + INSERT INTO transport_mode (transport_mode, create_date, update_date, create_user, update_user) + VALUES + ('Truck', '{}', '{}', 'no_user', 'no_user'), + ('Marine', '{}', '{}', 'no_user', 'no_user') + + """.format( + current_time, current_time, current_time, current_time + ) + ) + + +def downgrade() -> None: + # Remove Truck and Marine transport modes + op.execute( + """ + DELETE FROM transport_mode + WHERE transport_mode IN ('Truck', 'Marine') + """ + ) diff --git a/etl/database/nifi-registry-primary.mv.db b/etl/database/nifi-registry-primary.mv.db index f5b1bf947c3f448e892103b5cff8f494e380d00b..700e8333804575984593f1564c4e95ac0ea8c5d1 100644 GIT binary patch delta 1585 zcmdUvUuaWT9LLYOO_OVEjX13}S(mHE>AJi0{z>jX9gTacj&7}+Wpp|`IXzd4X%d^H zRv*?117WaP{lO;4Dn7WkF~fcFVGjkzo`&GqWZT2m`6Nz3_96^AcaoblVN4%<6E5e+ z@523^%lGsB{^plE=a+)pha64L<_h$5DN50X5iyXJFyM%{ns|x@)VhMh@mNRZgPeV^Ttx4`r&SYS+Mm@ z3A+%P`w230FT!_U?B=ug%uCViRooESZa`2?Imhyj4!7oBm`l}XY9?*XRMUpS-xeL3 z_H|H6Q@d16J5x8)ZQ2=@sk?F|Un#MPz2&i{hIUI%Uq?;NQn^5BrAYGhl;bK`?b10M zDLKy1!kO_kq&{AEHTW%=?CB{c-pCcQ!>mja@180$goIM}sMmk^gpl0uY2g21WKiJh z&uuU=C^)kbMoX^>n+Bmecmr;p?-H9#{sTj_IEKz>D(Eep{#)p-QQ!!E@BK4`df<~w zJJyJGA(LF}XQa{hO2h7T09s3-HtQR_^V!otR;l6aAEm- ze0@9?jmF?t<)!uaJ0D^phD23kx|<@*d#ns#$Q(TB%^tWfc$tIya7etj?v5bD;Kx5I zA~h#0)250ybm!|JEWbbMJ-X}Sz;h2)60%iDEcU|(xlmUvKFxdrT{QdZE9MC?vEa)^ zX^VTU8B(heQXjVl|Ky@Et!-cgyZp)(L*0SiwFJ-xK zWcYv|$?$3iq*<7mq$P4~Oq|a@`7b}OBw0E)|CQ$okT=)KNzDT~p&&6mwb;s3CpWRe%Fxuz z0LUn?N;aBYG*3yYEVZaOGe6HN)m$epwW0**(31RQD?`In!^w#Xo*Y~Z3{1sL77UxU zV+)w{m=`iKvM@3*m^m;g_=|yQ#e``L43-BN816}c`AXL=f%#19LM9h9X*09jW12j# z=^Te48_-g{WTVaYd)~56zBav_oq>Uwl{1=o^Zm|WOx%V{$wmweEXtf!ER(yd)fmk- x%X?`uZoWOogK=~00xf5|006sPc_jb< diff --git a/etl/nifi/conf/flow.json.gz b/etl/nifi/conf/flow.json.gz index e2e4eaaef942864e2673fd0ac31286feb8ada085..3e3841498a551595c343a35d8cd64772726cf54c 100644 GIT binary patch delta 9924 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 CP*#Tk delta 9900 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 diff --git a/etl/nifi_scripts/fuel_code.groovy b/etl/nifi_scripts/fuel_code.groovy index 57de4f16f..a0fef4616 100644 --- a/etl/nifi_scripts/fuel_code.groovy +++ b/etl/nifi_scripts/fuel_code.groovy @@ -22,6 +22,121 @@ def transformCallback = { inputStream, outputStream -> record.fuel_id = fuelIdMapping[record.fuel_id] } + // Parse facility location + def locationParts = (record.facility_location ?: '').split(',').collect { it.trim() } + def facilityCity = null + def facilityProvinceState = null + def facilityCountry = null + + // Map of provinces and states to their full names (only those appearing in the data) + def provinceStateMap = [ + // Canadian Provinces + 'BC': 'British Columbia', + 'AB': 'Alberta', + 'SK': 'Saskatchewan', + 'MB': 'Manitoba', + 'ON': 'Ontario', + 'QC': 'Quebec', + 'NL': 'Newfoundland and Labrador', + 'BRITISH COLUMBIA': 'British Columbia', + 'ALBERTA': 'Alberta', + 'SASKATCHEWAN': 'Saskatchewan', + 'MANITOBA': 'Manitoba', + 'ONTARIO': 'Ontario', + 'QUEBEC': 'Quebec', + 'NEWFOUNDLAND': 'Newfoundland and Labrador', + + // US States + 'CA': 'California', + 'CT': 'Connecticut', + 'CONNETICUT': 'Connecticut', // Add misspelled variant + 'CONNECTICUT': 'Connecticut', + 'GA': 'Georgia', + 'IA': 'Iowa', + 'IL': 'Illinois', + 'IN': 'Indiana', + 'KS': 'Kansas', + 'LA': 'Louisiana', + 'MN': 'Minnesota', + 'MS': 'Mississippi', + 'MO': 'Missouri', + 'MT': 'Montana', + 'ND': 'North Dakota', + 'NE': 'Nebraska', + 'NM': 'New Mexico', + 'OH': 'Ohio', + 'OK': 'Oklahoma', + 'OR': 'Oregon', + 'SD': 'South Dakota', + 'TX': 'Texas', + 'WA': 'Washington', + 'WI': 'Wisconsin', + 'WY': 'Wyoming', + 'CALIFORNIA': 'California', + 'GEORGIA': 'Georgia', + 'IOWA': 'Iowa', + 'ILLINOIS': 'Illinois', + 'INDIANA': 'Indiana', + 'KANSAS': 'Kansas', + 'LOUISIANA': 'Louisiana', + 'MINNESOTA': 'Minnesota', + 'MISSISSIPPI': 'Mississippi', + 'MISSOURI': 'Missouri', + 'MONTANA': 'Montana', + 'NORTH DAKOTA': 'North Dakota', + 'NEBRASKA': 'Nebraska', + 'NEW MEXICO': 'New Mexico', + 'OHIO': 'Ohio', + 'OKLAHOMA': 'Oklahoma', + 'OREGON': 'Oregon', + 'SOUTH DAKOTA': 'South Dakota', + 'TEXAS': 'Texas', + 'WASHINGTON': 'Washington', + 'WISCONSIN': 'Wisconsin', + 'WYOMING': 'Wyoming', + 'WYOMING.': 'Wyoming', // Add variant with period + ] + + if (locationParts.size() == 1) { + def location = locationParts[0].toUpperCase() + if (location == 'US CENTRAL') { + facilityCountry = 'United States of America' + } else if (provinceStateMap.containsKey(location)) { + facilityProvinceState = provinceStateMap[location] + } + } else if (locationParts.size() == 2) { + // First part is always city + facilityCity = locationParts[0] + + // Process second part - could be province/state or country + def location = locationParts[1].toUpperCase() + if (provinceStateMap.containsKey(location)) { + facilityProvinceState = provinceStateMap[location] + } else { + // If not a recognized province/state, treat as country + facilityCountry = locationParts[1] + } + } else if (locationParts.size() == 3) { + // First part is always city + facilityCity = locationParts[0] + + // Second part is province/state + def location = locationParts[1].toUpperCase() + if (provinceStateMap.containsKey(location)) { + facilityProvinceState = provinceStateMap[location] + } else { + facilityProvinceState = locationParts[1] + } + + // Third part is always country - expand USA to full name + def country = locationParts[2].toUpperCase() + if (country == 'USA') { + facilityCountry = 'United States of America' + } else { + facilityCountry = locationParts[2] + } + } + // Map the fields from the source to the target schema // The following fields are not used in the migration: fuel_code_id, facility_location, renewable_percentage, facility_nameplate_capacity_unit def transformedRecord = [ @@ -30,7 +145,7 @@ def transformCallback = { inputStream, outputStream -> fuel_suffix : "${record.fuel_code_version}.${record.fuel_code_version_minor}", company : record.company, carbon_intensity : record.carbon_intensity, - edrms : "", + edrms : '', last_updated : record.update_timestamp, application_date : record.application_date, approval_date : record.approval_date, @@ -48,20 +163,19 @@ def transformCallback = { inputStream, outputStream -> effective_date : record.effective_date, expiration_date : record.expiry_date, effective_status : true, - fuel_production_facility_city : null, - fuel_production_facility_province_state: null, - fuel_production_facility_country : null, + fuel_production_facility_city : facilityCity, + fuel_production_facility_province_state: facilityProvinceState, + fuel_production_facility_country : facilityCountry, contact_name : null, contact_email : null ] // Write the transformed data back to the output - outputStream.write(JsonOutput.toJson(transformedRecord).getBytes("UTF-8")) - + outputStream.write(JsonOutput.toJson(transformedRecord).getBytes('UTF-8')) } catch (Exception e) { def recordId = record?.id if (recordId) { - flowFile = session.putAttribute(flowFile, "failed_record_id", recordId.toString()) + flowFile = session.putAttribute(flowFile, 'failed_record_id', recordId.toString()) } throw e } From 24abeda385fc074b9857c2359fc35ccc7d1306b2 Mon Sep 17 00:00:00 2001 From: Kevin Hashimoto Date: Thu, 16 Jan 2025 10:31:31 -0800 Subject: [PATCH 2/4] feat: new fuel code etl script --- etl/nifi/conf/flow.json.gz | Bin 9976 -> 13298 bytes etl/nifi/conf/flow.xml.gz | Bin 15510 -> 22613 bytes etl/nifi_scripts/fuel_code.groovy | 415 +++++++++++++++++--------- etl/nifi_scripts/fuel_code.old.groovy | 194 ++++++++++++ 4 files changed, 465 insertions(+), 144 deletions(-) create mode 100644 etl/nifi_scripts/fuel_code.old.groovy diff --git a/etl/nifi/conf/flow.json.gz b/etl/nifi/conf/flow.json.gz index 3e3841498a551595c343a35d8cd64772726cf54c..b9c271f270d115842647f7b14296b409ac763e93 100644 GIT binary patch literal 13298 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

NHF}8*UUWZw`HIRQYRbZU_#+jqjZJi~&#AV& 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 literal 9976 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 C>vzEb diff --git a/etl/nifi/conf/flow.xml.gz b/etl/nifi/conf/flow.xml.gz index c09dd537d80ca9e700f3be97b39014c794990b3d..13fa45db27513c3acb96f448788abce3bd78cd2b 100644 GIT binary patch literal 22613 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 UqGeJ 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 diff --git a/etl/nifi_scripts/fuel_code.groovy b/etl/nifi_scripts/fuel_code.groovy index a0fef4616..11aa7017f 100644 --- a/etl/nifi_scripts/fuel_code.groovy +++ b/etl/nifi_scripts/fuel_code.groovy @@ -1,102 +1,229 @@ -import org.apache.nifi.processor.io.StreamCallback +import java.sql.Connection +import java.sql.PreparedStatement +import java.sql.ResultSet import groovy.json.JsonSlurper -import groovy.json.JsonOutput - -def transformCallback = { inputStream, outputStream -> - try { - // Parse JSON input - def record = new JsonSlurper().parseText(inputStream.text) - - // Map the fuel_id to the corresponding new value - def fuelIdMapping = [ - 8 : 13, // Propane - 21 : 15, // Renewable naphtha - 10 : 14, // Renewable gasoline - 19 : 16, // Fossil-derived diesel - 11 : 17, // Fossil-derived gasoline - 20 : 17 // Fossil-derived gasoline - ] - - // Replace fuel_id if it matches one of the keys in the map - if (fuelIdMapping.containsKey(record.fuel_id)) { - record.fuel_id = fuelIdMapping[record.fuel_id] - } - // Parse facility location - def locationParts = (record.facility_location ?: '').split(',').collect { it.trim() } +log.warn('**** STARTING FUEL CODE ETL ****') + +def fuelIdMapping = [ + 8 : 13, + 9 : 5, // TODO: need to double check this + 10 : 14, + 11 : 17, + 19 : 16, + 20 : 17, + 21 : 15, +] + +def transportModeMapping = [ + 1 : 6, + 3 : 7 +] + +def provinceStateMap = [ + // Canadian Provinces + 'BC': 'British Columbia', + 'AB': 'Alberta', + 'SK': 'Saskatchewan', + 'MB': 'Manitoba', + 'ON': 'Ontario', + 'QC': 'Quebec', + 'NL': 'Newfoundland and Labrador', + 'BRITISH COLUMBIA': 'British Columbia', + 'ALBERTA': 'Alberta', + 'SASKATCHEWAN': 'Saskatchewan', + 'MANITOBA': 'Manitoba', + 'ONTARIO': 'Ontario', + 'QUEBEC': 'Quebec', + 'NEWFOUNDLAND': 'Newfoundland and Labrador', + + // US States + 'CA': 'California', + 'CT': 'Connecticut', + 'GA': 'Georgia', + 'IA': 'Iowa', + 'IL': 'Illinois', + 'IN': 'Indiana', + 'KS': 'Kansas', + 'LA': 'Louisiana', + 'MN': 'Minnesota', + 'MS': 'Mississippi', + 'MO': 'Missouri', + 'MT': 'Montana', + 'ND': 'North Dakota', + 'NE': 'Nebraska', + 'NM': 'New Mexico', + 'OH': 'Ohio', + 'OK': 'Oklahoma', + 'OR': 'Oregon', + 'SD': 'South Dakota', + 'TX': 'Texas', + 'WA': 'Washington', + 'WI': 'Wisconsin', + 'WY': 'Wyoming', + 'CALIFORNIA': 'California', + 'GEORGIA': 'Georgia', + 'IOWA': 'Iowa', + 'ILLINOIS': 'Illinois', + 'INDIANA': 'Indiana', + 'KANSAS': 'Kansas', + 'LOUISIANA': 'Louisiana', + 'MINNESOTA': 'Minnesota', + 'MISSISSIPPI': 'Mississippi', + 'MISSOURI': 'Missouri', + 'MONTANA': 'Montana', + 'NORTH DAKOTA': 'North Dakota', + 'NEBRASKA': 'Nebraska', + 'NEW MEXICO': 'New Mexico', + 'OHIO': 'Ohio', + 'OKLAHOMA': 'Oklahoma', + 'OREGON': 'Oregon', + 'SOUTH DAKOTA': 'South Dakota', + 'TEXAS': 'Texas', + 'WASHINGTON': 'Washington', + 'WISCONSIN': 'Wisconsin', + 'WYOMING': 'Wyoming', + 'WYOMING.': 'Wyoming', // Add variant with period + 'CONNETICUT': 'Connecticut', // Add misspelled variant + 'CONNECTICUT': 'Connecticut', +] + +def fuelCodeQuery = ''' + SELECT + fc.*, + array_agg(DISTINCT finishedFtm.transport_mode_id) AS finished_fuel_transport_modes, + array_agg(DISTINCT feedstockFtf.transport_mode_id) AS feedstock_fuel_transport_modes + FROM + fuel_code fc + LEFT JOIN + fuel_transport_mode_fuel_code finishedFtm ON fc.id = finishedFtm.fuel_code_id + LEFT JOIN + feedstock_transport_mode_fuel_code feedstockFtf ON fc.id = feedstockFtf.fuel_code_id + GROUP BY + fc.id; +''' + +// Insert `fuel_code` into the target database +def insertFuelCodeSQL = ''' + INSERT INTO fuel_code ( + fuel_status_id, + fuel_suffix, + company, + carbon_intensity, + last_updated, + application_date, + approval_date, + fuel_type_id, + feedstock, + feedstock_location, + feedstock_misc, + facility_nameplate_capacity, + former_company, + create_date, + update_date, + effective_date, + expiration_date, + fuel_production_facility_city, + fuel_production_facility_province_state, + fuel_production_facility_country, + prefix_id, + edrms, + notes, + create_user, + update_user, + effective_status, + contact_name, + contact_email + ) + VALUES ( + ?, + ?, + ?, + ?, + ?, + ?, + ?, + ?, + ?, + ?, + ?, + ?, + ?, + ?, + ?, + ?, + ?, + ?, + ?, + ?, + 1, + '', + null, + null, + null, + true, + null, + null + ) + RETURNING fuel_code_id; +''' + +// Insert into `finished_fuel_transport_mode` +def insertFinishedFuelTransportModeSQL = ''' + INSERT INTO finished_fuel_transport_mode (fuel_code_id, transport_mode_id) + VALUES (?, ?); +''' + +// Insert into `feedstock_fuel_transport_mode` +def insertFeedstockFuelTransportModeSQL = ''' + INSERT INTO feedstock_fuel_transport_mode (fuel_code_id, transport_mode_id) + VALUES (?, ?); +''' + +// Fetch connections to both source and destination databases +def sourceDbcpService = context.controllerServiceLookup.getControllerService('3245b078-0192-1000-ffff-ffffba20c1eb') +def destinationDbcpService = context.controllerServiceLookup.getControllerService('3244bf63-0192-1000-ffff-ffffc8ec6d93') + +sourceConn = null +destinationConn = null + +try { + // Get connections + sourceConn = sourceDbcpService.getConnection() + destinationConn = destinationDbcpService.getConnection() + + fetchFuelCodes = sourceConn.prepareStatement(fuelCodeQuery) + fuelCodes = fetchFuelCodes.executeQuery() + + while (fuelCodes.next()) { + def fuelCodeVersion = fuelCodes.getString('fuel_code_version') + def fuelCodeVersionMinor = fuelCodes.getString('fuel_code_version_minor') + + def fuelStatusId = fuelCodes.getInt('status_id') + def fuelSuffix = "${fuelCodeVersion}.${fuelCodeVersionMinor}" + def company = fuelCodes.getString('company') + def carbonIntensity = fuelCodes.getDouble('carbon_intensity') + def lastUpdated = fuelCodes.getDate('update_timestamp') + def applicationDate = fuelCodes.getDate('application_date') + def approvalDate = fuelCodes.getDate('approval_date') + def fuelTypeId = fuelCodes.getInt('fuel_id') + def feedstock = fuelCodes.getString('feedstock') + def feedstockLocation = fuelCodes.getString('feedstock_location') + def feedstockMisc = fuelCodes.getString('feedstock_misc') + def facilityNameplateCapacity = fuelCodes.getDouble('facility_nameplate') + def formerCompany = fuelCodes.getString('former_company') + def createDate = fuelCodes.getDate('create_timestamp') + def updateDate = fuelCodes.getDate('update_timestamp') + def effectiveDate = fuelCodes.getDate('effective_date') + def expirationDate = fuelCodes.getDate('expiry_date') + + def facilityLocation = fuelCodes.getString('facility_location') + + def locationParts = (facilityLocation ?: '').split(',').collect { it.trim() } def facilityCity = null def facilityProvinceState = null def facilityCountry = null - // Map of provinces and states to their full names (only those appearing in the data) - def provinceStateMap = [ - // Canadian Provinces - 'BC': 'British Columbia', - 'AB': 'Alberta', - 'SK': 'Saskatchewan', - 'MB': 'Manitoba', - 'ON': 'Ontario', - 'QC': 'Quebec', - 'NL': 'Newfoundland and Labrador', - 'BRITISH COLUMBIA': 'British Columbia', - 'ALBERTA': 'Alberta', - 'SASKATCHEWAN': 'Saskatchewan', - 'MANITOBA': 'Manitoba', - 'ONTARIO': 'Ontario', - 'QUEBEC': 'Quebec', - 'NEWFOUNDLAND': 'Newfoundland and Labrador', - - // US States - 'CA': 'California', - 'CT': 'Connecticut', - 'CONNETICUT': 'Connecticut', // Add misspelled variant - 'CONNECTICUT': 'Connecticut', - 'GA': 'Georgia', - 'IA': 'Iowa', - 'IL': 'Illinois', - 'IN': 'Indiana', - 'KS': 'Kansas', - 'LA': 'Louisiana', - 'MN': 'Minnesota', - 'MS': 'Mississippi', - 'MO': 'Missouri', - 'MT': 'Montana', - 'ND': 'North Dakota', - 'NE': 'Nebraska', - 'NM': 'New Mexico', - 'OH': 'Ohio', - 'OK': 'Oklahoma', - 'OR': 'Oregon', - 'SD': 'South Dakota', - 'TX': 'Texas', - 'WA': 'Washington', - 'WI': 'Wisconsin', - 'WY': 'Wyoming', - 'CALIFORNIA': 'California', - 'GEORGIA': 'Georgia', - 'IOWA': 'Iowa', - 'ILLINOIS': 'Illinois', - 'INDIANA': 'Indiana', - 'KANSAS': 'Kansas', - 'LOUISIANA': 'Louisiana', - 'MINNESOTA': 'Minnesota', - 'MISSISSIPPI': 'Mississippi', - 'MISSOURI': 'Missouri', - 'MONTANA': 'Montana', - 'NORTH DAKOTA': 'North Dakota', - 'NEBRASKA': 'Nebraska', - 'NEW MEXICO': 'New Mexico', - 'OHIO': 'Ohio', - 'OKLAHOMA': 'Oklahoma', - 'OREGON': 'Oregon', - 'SOUTH DAKOTA': 'South Dakota', - 'TEXAS': 'Texas', - 'WASHINGTON': 'Washington', - 'WISCONSIN': 'Wisconsin', - 'WYOMING': 'Wyoming', - 'WYOMING.': 'Wyoming', // Add variant with period - ] - if (locationParts.size() == 1) { def location = locationParts[0].toUpperCase() if (location == 'US CENTRAL') { @@ -137,58 +264,58 @@ def transformCallback = { inputStream, outputStream -> } } - // Map the fields from the source to the target schema - // The following fields are not used in the migration: fuel_code_id, facility_location, renewable_percentage, facility_nameplate_capacity_unit - def transformedRecord = [ - fuel_status_id : record.status_id, - prefix_id : 1, // BCLCF - fuel_suffix : "${record.fuel_code_version}.${record.fuel_code_version_minor}", - company : record.company, - carbon_intensity : record.carbon_intensity, - edrms : '', - last_updated : record.update_timestamp, - application_date : record.application_date, - approval_date : record.approval_date, - fuel_type_id : record.fuel_id, - feedstock : record.feedstock, - feedstock_location : record.feedstock_location, - feedstock_misc : record.feedstock_misc, - facility_nameplate_capacity : record.facility_nameplate, - former_company : record.former_company, - notes : null, - create_date : record.create_timestamp, - update_date : record.update_timestamp, - create_user : null, - update_user : null, - effective_date : record.effective_date, - expiration_date : record.expiry_date, - effective_status : true, - fuel_production_facility_city : facilityCity, - fuel_production_facility_province_state: facilityProvinceState, - fuel_production_facility_country : facilityCountry, - contact_name : null, - contact_email : null - ] - - // Write the transformed data back to the output - outputStream.write(JsonOutput.toJson(transformedRecord).getBytes('UTF-8')) - } catch (Exception e) { - def recordId = record?.id - if (recordId) { - flowFile = session.putAttribute(flowFile, 'failed_record_id', recordId.toString()) + def finishedModes = fuelCodes.getArray('finished_fuel_transport_modes')?.getArray() ?: [] + def feedstockModes = fuelCodes.getArray('feedstock_fuel_transport_modes')?.getArray() ?: [] + + // Insert `fuel_code` and get the new ID + def insertFuelCode = destinationConn.prepareStatement(insertFuelCodeSQL) + insertFuelCode.setInt(1, fuelStatusId) + insertFuelCode.setString(2, fuelSuffix) + insertFuelCode.setString(3, company) + insertFuelCode.setDouble(4, carbonIntensity) + insertFuelCode.setDate(5, lastUpdated) + insertFuelCode.setDate(6, applicationDate) + insertFuelCode.setDate(7, approvalDate) + insertFuelCode.setInt(8, fuelIdMapping[fuelTypeId] ?: fuelTypeId) + insertFuelCode.setString(9, feedstock) + insertFuelCode.setString(10, feedstockLocation) + insertFuelCode.setString(11, feedstockMisc) + insertFuelCode.setDouble(12, facilityNameplateCapacity) + insertFuelCode.setString(13, formerCompany) + insertFuelCode.setDate(14, createDate) + insertFuelCode.setDate(15, updateDate) + insertFuelCode.setDate(16, effectiveDate) + insertFuelCode.setDate(17, expirationDate) + insertFuelCode.setString(18, facilityCity) + insertFuelCode.setString(19, facilityProvinceState) + insertFuelCode.setString(20, facilityCountry) + + def rs = insertFuelCode.executeQuery() + def newFuelCodeId = rs.next() ? rs.getInt('fuel_code_id') : null + rs.close() + + // Insert finished fuel transport modes + finishedModes.each { mode -> + def insertFinishedMode = destinationConn.prepareStatement(insertFinishedFuelTransportModeSQL) + insertFinishedMode.setInt(1, newFuelCodeId) + insertFinishedMode.setInt(2, transportModeMapping[mode] ?: mode) + insertFinishedMode.executeUpdate() + } + + // Insert feedstock fuel transport modes + feedstockModes.each { mode -> + def insertFeedstockMode = destinationConn.prepareStatement(insertFeedstockFuelTransportModeSQL) + insertFeedstockMode.setInt(1, newFuelCodeId) + insertFeedstockMode.setInt(2, transportModeMapping[mode] ?: mode) + insertFeedstockMode.executeUpdate() } - throw e } +} catch (Exception e) { + log.error('Error occurred during ETL process', e) +} finally { + if (fetchFuelCodes) fetchFuelCodes.close() + if (sourceConn) sourceConn.close() + if (destinationConn) destinationConn.close() } -// Obtain the flowFile from the session -flowFile = session.get() -if (flowFile != null) { - try { - // Write the transformed data using the transformCallback - flowFile = session.write(flowFile, transformCallback as StreamCallback) - session.transfer(flowFile, REL_SUCCESS) - } catch (Exception e) { - session.transfer(flowFile, REL_FAILURE) - } -} +log.warn('**** COMPLETED FUEL CODE ETL ****') diff --git a/etl/nifi_scripts/fuel_code.old.groovy b/etl/nifi_scripts/fuel_code.old.groovy new file mode 100644 index 000000000..a0fef4616 --- /dev/null +++ b/etl/nifi_scripts/fuel_code.old.groovy @@ -0,0 +1,194 @@ +import org.apache.nifi.processor.io.StreamCallback +import groovy.json.JsonSlurper +import groovy.json.JsonOutput + +def transformCallback = { inputStream, outputStream -> + try { + // Parse JSON input + def record = new JsonSlurper().parseText(inputStream.text) + + // Map the fuel_id to the corresponding new value + def fuelIdMapping = [ + 8 : 13, // Propane + 21 : 15, // Renewable naphtha + 10 : 14, // Renewable gasoline + 19 : 16, // Fossil-derived diesel + 11 : 17, // Fossil-derived gasoline + 20 : 17 // Fossil-derived gasoline + ] + + // Replace fuel_id if it matches one of the keys in the map + if (fuelIdMapping.containsKey(record.fuel_id)) { + record.fuel_id = fuelIdMapping[record.fuel_id] + } + + // Parse facility location + def locationParts = (record.facility_location ?: '').split(',').collect { it.trim() } + def facilityCity = null + def facilityProvinceState = null + def facilityCountry = null + + // Map of provinces and states to their full names (only those appearing in the data) + def provinceStateMap = [ + // Canadian Provinces + 'BC': 'British Columbia', + 'AB': 'Alberta', + 'SK': 'Saskatchewan', + 'MB': 'Manitoba', + 'ON': 'Ontario', + 'QC': 'Quebec', + 'NL': 'Newfoundland and Labrador', + 'BRITISH COLUMBIA': 'British Columbia', + 'ALBERTA': 'Alberta', + 'SASKATCHEWAN': 'Saskatchewan', + 'MANITOBA': 'Manitoba', + 'ONTARIO': 'Ontario', + 'QUEBEC': 'Quebec', + 'NEWFOUNDLAND': 'Newfoundland and Labrador', + + // US States + 'CA': 'California', + 'CT': 'Connecticut', + 'CONNETICUT': 'Connecticut', // Add misspelled variant + 'CONNECTICUT': 'Connecticut', + 'GA': 'Georgia', + 'IA': 'Iowa', + 'IL': 'Illinois', + 'IN': 'Indiana', + 'KS': 'Kansas', + 'LA': 'Louisiana', + 'MN': 'Minnesota', + 'MS': 'Mississippi', + 'MO': 'Missouri', + 'MT': 'Montana', + 'ND': 'North Dakota', + 'NE': 'Nebraska', + 'NM': 'New Mexico', + 'OH': 'Ohio', + 'OK': 'Oklahoma', + 'OR': 'Oregon', + 'SD': 'South Dakota', + 'TX': 'Texas', + 'WA': 'Washington', + 'WI': 'Wisconsin', + 'WY': 'Wyoming', + 'CALIFORNIA': 'California', + 'GEORGIA': 'Georgia', + 'IOWA': 'Iowa', + 'ILLINOIS': 'Illinois', + 'INDIANA': 'Indiana', + 'KANSAS': 'Kansas', + 'LOUISIANA': 'Louisiana', + 'MINNESOTA': 'Minnesota', + 'MISSISSIPPI': 'Mississippi', + 'MISSOURI': 'Missouri', + 'MONTANA': 'Montana', + 'NORTH DAKOTA': 'North Dakota', + 'NEBRASKA': 'Nebraska', + 'NEW MEXICO': 'New Mexico', + 'OHIO': 'Ohio', + 'OKLAHOMA': 'Oklahoma', + 'OREGON': 'Oregon', + 'SOUTH DAKOTA': 'South Dakota', + 'TEXAS': 'Texas', + 'WASHINGTON': 'Washington', + 'WISCONSIN': 'Wisconsin', + 'WYOMING': 'Wyoming', + 'WYOMING.': 'Wyoming', // Add variant with period + ] + + if (locationParts.size() == 1) { + def location = locationParts[0].toUpperCase() + if (location == 'US CENTRAL') { + facilityCountry = 'United States of America' + } else if (provinceStateMap.containsKey(location)) { + facilityProvinceState = provinceStateMap[location] + } + } else if (locationParts.size() == 2) { + // First part is always city + facilityCity = locationParts[0] + + // Process second part - could be province/state or country + def location = locationParts[1].toUpperCase() + if (provinceStateMap.containsKey(location)) { + facilityProvinceState = provinceStateMap[location] + } else { + // If not a recognized province/state, treat as country + facilityCountry = locationParts[1] + } + } else if (locationParts.size() == 3) { + // First part is always city + facilityCity = locationParts[0] + + // Second part is province/state + def location = locationParts[1].toUpperCase() + if (provinceStateMap.containsKey(location)) { + facilityProvinceState = provinceStateMap[location] + } else { + facilityProvinceState = locationParts[1] + } + + // Third part is always country - expand USA to full name + def country = locationParts[2].toUpperCase() + if (country == 'USA') { + facilityCountry = 'United States of America' + } else { + facilityCountry = locationParts[2] + } + } + + // Map the fields from the source to the target schema + // The following fields are not used in the migration: fuel_code_id, facility_location, renewable_percentage, facility_nameplate_capacity_unit + def transformedRecord = [ + fuel_status_id : record.status_id, + prefix_id : 1, // BCLCF + fuel_suffix : "${record.fuel_code_version}.${record.fuel_code_version_minor}", + company : record.company, + carbon_intensity : record.carbon_intensity, + edrms : '', + last_updated : record.update_timestamp, + application_date : record.application_date, + approval_date : record.approval_date, + fuel_type_id : record.fuel_id, + feedstock : record.feedstock, + feedstock_location : record.feedstock_location, + feedstock_misc : record.feedstock_misc, + facility_nameplate_capacity : record.facility_nameplate, + former_company : record.former_company, + notes : null, + create_date : record.create_timestamp, + update_date : record.update_timestamp, + create_user : null, + update_user : null, + effective_date : record.effective_date, + expiration_date : record.expiry_date, + effective_status : true, + fuel_production_facility_city : facilityCity, + fuel_production_facility_province_state: facilityProvinceState, + fuel_production_facility_country : facilityCountry, + contact_name : null, + contact_email : null + ] + + // Write the transformed data back to the output + outputStream.write(JsonOutput.toJson(transformedRecord).getBytes('UTF-8')) + } catch (Exception e) { + def recordId = record?.id + if (recordId) { + flowFile = session.putAttribute(flowFile, 'failed_record_id', recordId.toString()) + } + throw e + } +} + +// Obtain the flowFile from the session +flowFile = session.get() +if (flowFile != null) { + try { + // Write the transformed data using the transformCallback + flowFile = session.write(flowFile, transformCallback as StreamCallback) + session.transfer(flowFile, REL_SUCCESS) + } catch (Exception e) { + session.transfer(flowFile, REL_FAILURE) + } +} From 56e781b19211456d50a8441ce4e031b6791cd489 Mon Sep 17 00:00:00 2001 From: Kevin Hashimoto Date: Thu, 16 Jan 2025 10:44:55 -0800 Subject: [PATCH 3/4] fix: migration fix --- .../db/migrations/versions/2025-01-15-22-48_5bc0ef48739a.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/lcfs/db/migrations/versions/2025-01-15-22-48_5bc0ef48739a.py b/backend/lcfs/db/migrations/versions/2025-01-15-22-48_5bc0ef48739a.py index eb19ef8c9..e5b8ed5a7 100644 --- a/backend/lcfs/db/migrations/versions/2025-01-15-22-48_5bc0ef48739a.py +++ b/backend/lcfs/db/migrations/versions/2025-01-15-22-48_5bc0ef48739a.py @@ -12,7 +12,7 @@ # revision identifiers, used by Alembic. revision = "5bc0ef48739a" -down_revision = "f78e53370ed2" +down_revision = "5163af6ba4a4" branch_labels = None depends_on = None From 41abf976cb16b7f9cb318faf744ffdf4fc7a27c1 Mon Sep 17 00:00:00 2001 From: Kevin Hashimoto Date: Thu, 16 Jan 2025 13:14:35 -0800 Subject: [PATCH 4/4] fix: migration fix --- .../db/migrations/versions/2025-01-15-22-48_5bc0ef48739a.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/lcfs/db/migrations/versions/2025-01-15-22-48_5bc0ef48739a.py b/backend/lcfs/db/migrations/versions/2025-01-15-22-48_5bc0ef48739a.py index e5b8ed5a7..5046cf1f2 100644 --- a/backend/lcfs/db/migrations/versions/2025-01-15-22-48_5bc0ef48739a.py +++ b/backend/lcfs/db/migrations/versions/2025-01-15-22-48_5bc0ef48739a.py @@ -12,7 +12,7 @@ # revision identifiers, used by Alembic. revision = "5bc0ef48739a" -down_revision = "5163af6ba4a4" +down_revision = "8119d12538df" branch_labels = None depends_on = None