Update zip4 matching

This commit is contained in:
Skylar Ittner 2025-11-16 23:08:10 -07:00
parent b2de3304f3
commit 5a901f37a2

View File

@ -117,7 +117,7 @@ def subaddrMatchRows(rows, unit):
unitrows = []
nounitrows = []
for row in rows:
if row["AddressSecLowNumber"] == "":
if (row["RecordType"] != "H" and row["RecordType"] != "F") or row["AddressSecLowNumber"] == "":
nounitrows.append(row)
continue
if row["AddressSecLowNumber"] <= unit and row["AddressSecHighNumber"] >= unit:
@ -216,11 +216,11 @@ def getZIP4(number, street, unit, state, lat, lon, city=False, zip=False, county
# Build a list of queries to run, starting with the most specific and getting more desperate until a match is found
if zip:
queries.append("SELECT ZipCode, Plus4Low, StreetFull, AddressSecAbbr, AddressSecLowNumber, AddressSecHighNumber, AddressPrimaryLowNumber, AddressPrimaryHighNumber, AddressPrimaryEvenOdd FROM ZIP4 WHERE StreetFull = '" + street + "' AND State = '" + state + "'" + " AND ZipCode='"+zip+"'")
basenamequeries.append("SELECT ZipCode, Plus4Low, StreetFull, AddressSecAbbr, AddressSecLowNumber, AddressSecHighNumber, AddressPrimaryLowNumber, AddressPrimaryHighNumber, AddressPrimaryEvenOdd FROM ZIP4 WHERE StName = '" + streetBasename + "' AND State = '" + state + "'" + " AND ZipCode='"+zip+"'")
queries.append("SELECT ZipCode, Plus4Low, StreetFull, AddressSecAbbr, AddressSecLowNumber, AddressSecHighNumber, AddressSecOddEven, AddressPrimaryLowNumber, AddressPrimaryHighNumber, AddressPrimaryEvenOdd, RecordType FROM ZIP4 WHERE StreetFull = '" + street + "' AND State = '" + state + "'" + " AND ZipCode='"+zip+"'")
basenamequeries.append("SELECT ZipCode, Plus4Low, StreetFull, AddressSecAbbr, AddressSecLowNumber, AddressSecHighNumber, AddressSecOddEven, AddressPrimaryLowNumber, AddressPrimaryHighNumber, AddressPrimaryEvenOdd, RecordType FROM ZIP4 WHERE StName = '" + streetBasename + "' AND State = '" + state + "'" + " AND ZipCode='"+zip+"'")
if zipfilter:
queries.append("SELECT ZipCode, Plus4Low, StreetFull, AddressSecAbbr, AddressSecLowNumber, AddressSecHighNumber, AddressPrimaryLowNumber, AddressPrimaryHighNumber, AddressPrimaryEvenOdd FROM ZIP4 WHERE StreetFull = '" + street + "' AND State = '" + state + "'" + " AND ZipCode IN ('" + ("','".join(zipfilter)) + "')")
basenamequeries.append("SELECT ZipCode, Plus4Low, StreetFull, AddressSecAbbr, AddressSecLowNumber, AddressSecHighNumber, AddressPrimaryLowNumber, AddressPrimaryHighNumber, AddressPrimaryEvenOdd FROM ZIP4 WHERE StName = '" + streetBasename + "' AND State = '" + state + "'" + " AND ZipCode IN ('" + ("','".join(zipfilter)) + "')")
queries.append("SELECT ZipCode, Plus4Low, StreetFull, AddressSecAbbr, AddressSecLowNumber, AddressSecHighNumber, AddressSecOddEven, AddressPrimaryLowNumber, AddressPrimaryHighNumber, AddressPrimaryEvenOdd, RecordType FROM ZIP4 WHERE StreetFull = '" + street + "' AND State = '" + state + "'" + " AND ZipCode IN ('" + ("','".join(zipfilter)) + "')")
basenamequeries.append("SELECT ZipCode, Plus4Low, StreetFull, AddressSecAbbr, AddressSecLowNumber, AddressSecHighNumber, AddressSecOddEven, AddressPrimaryLowNumber, AddressPrimaryHighNumber, AddressPrimaryEvenOdd, RecordType FROM ZIP4 WHERE StName = '" + streetBasename + "' AND State = '" + state + "'" + " AND ZipCode IN ('" + ("','".join(zipfilter)) + "')")
if not unit and re.match(".* ([0-9]{1,5}|[A-Z]{1})$", street):
# Maybe the street has the apartment number in it for some reason
@ -232,18 +232,18 @@ def getZIP4(number, street, unit, state, lat, lon, city=False, zip=False, county
newstreetBasename = re.sub("^[NSEW]{1,2} ", "", typelessStreet)
newstreetBasename = re.sub(" [NSEW]{1,2}$", "", newstreetBasename)
if zip:
queries.append("SELECT ZipCode, Plus4Low, StreetFull, AddressSecAbbr, AddressSecLowNumber, AddressSecHighNumber, AddressPrimaryLowNumber, AddressPrimaryHighNumber, AddressPrimaryEvenOdd FROM ZIP4 WHERE StreetFull = '" + newStreet + "' AND State = '" + state + "'" + " AND ZipCode='"+zip+"'")
basenamequeries.append("SELECT ZipCode, Plus4Low, StreetFull, AddressSecAbbr, AddressSecLowNumber, AddressSecHighNumber, AddressPrimaryLowNumber, AddressPrimaryHighNumber, AddressPrimaryEvenOdd FROM ZIP4 WHERE StName = '" + newstreetBasename + "' AND State = '" + state + "'" + " AND ZipCode='"+zip+"'")
queries.append("SELECT ZipCode, Plus4Low, StreetFull, AddressSecAbbr, AddressSecLowNumber, AddressSecHighNumber, AddressSecOddEven, AddressPrimaryLowNumber, AddressPrimaryHighNumber, AddressPrimaryEvenOdd, RecordType FROM ZIP4 WHERE StreetFull = '" + newStreet + "' AND State = '" + state + "'" + " AND ZipCode='"+zip+"'")
basenamequeries.append("SELECT ZipCode, Plus4Low, StreetFull, AddressSecAbbr, AddressSecLowNumber, AddressSecHighNumber, AddressSecOddEven, AddressPrimaryLowNumber, AddressPrimaryHighNumber, AddressPrimaryEvenOdd, RecordType FROM ZIP4 WHERE StName = '" + newstreetBasename + "' AND State = '" + state + "'" + " AND ZipCode='"+zip+"'")
if zipfilter:
queries.append("SELECT ZipCode, Plus4Low, StreetFull, AddressSecAbbr, AddressSecLowNumber, AddressSecHighNumber, AddressPrimaryLowNumber, AddressPrimaryHighNumber, AddressPrimaryEvenOdd FROM ZIP4 WHERE StreetFull = '" + newStreet + "' AND State = '" + state + "'" + " AND ZipCode IN ('" + ("','".join(zipfilter)) + "')")
basenamequeries.append("SELECT ZipCode, Plus4Low, StreetFull, AddressSecAbbr, AddressSecLowNumber, AddressSecHighNumber, AddressPrimaryLowNumber, AddressPrimaryHighNumber, AddressPrimaryEvenOdd FROM ZIP4 WHERE StName = '" + newstreetBasename + "' AND State = '" + state + "'" + " AND ZipCode IN ('" + ("','".join(zipfilter)) + "')")
queries.append("SELECT ZipCode, Plus4Low, StreetFull, AddressSecAbbr, AddressSecLowNumber, AddressSecHighNumber, AddressSecOddEven, AddressPrimaryLowNumber, AddressPrimaryHighNumber, AddressPrimaryEvenOdd, RecordType FROM ZIP4 WHERE StreetFull = '" + newStreet + "' AND State = '" + state + "'" + " AND ZipCode IN ('" + ("','".join(zipfilter)) + "')")
basenamequeries.append("SELECT ZipCode, Plus4Low, StreetFull, AddressSecAbbr, AddressSecLowNumber, AddressSecHighNumber, AddressSecOddEven, AddressPrimaryLowNumber, AddressPrimaryHighNumber, AddressPrimaryEvenOdd, RecordType FROM ZIP4 WHERE StName = '" + newstreetBasename + "' AND State = '" + state + "'" + " AND ZipCode IN ('" + ("','".join(zipfilter)) + "')")
if not zip and not zipfilter:
# Who needs ZIP Codes and city names anyways
queries.append("SELECT ZipCode, Plus4Low, StreetFull, AddressSecAbbr, AddressSecLowNumber, AddressSecHighNumber, AddressPrimaryLowNumber, AddressPrimaryHighNumber, AddressPrimaryEvenOdd FROM ZIP4 WHERE StreetFull = '" + street + "' AND State = '" + state + "'")
queries.append("SELECT ZipCode, Plus4Low, StreetFull, AddressSecAbbr, AddressSecLowNumber, AddressSecHighNumber, AddressPrimaryLowNumber, AddressPrimaryHighNumber, AddressPrimaryEvenOdd FROM ZIP4 WHERE StName = '" + street + "' AND State = '" + state + "'")
basenamequeries.append("SELECT ZipCode, Plus4Low, StreetFull, AddressSecAbbr, AddressSecLowNumber, AddressSecHighNumber, AddressPrimaryLowNumber, AddressPrimaryHighNumber, AddressPrimaryEvenOdd FROM ZIP4 WHERE StName = '" + streetBasename + "' AND State = '" + state + "'")
queries.append("SELECT ZipCode, Plus4Low, StreetFull, AddressSecAbbr, AddressSecLowNumber, AddressSecHighNumber, AddressPrimaryLowNumber, AddressPrimaryHighNumber, AddressPrimaryEvenOdd FROM ZIP4 WHERE StreetFull LIKE '" + street + "%' AND State = '" + state + "'")
queries.append("SELECT ZipCode, Plus4Low, StreetFull, AddressSecAbbr, AddressSecLowNumber, AddressSecHighNumber, AddressSecOddEven, AddressPrimaryLowNumber, AddressPrimaryHighNumber, AddressPrimaryEvenOdd, RecordType FROM ZIP4 WHERE StreetFull = '" + street + "' AND State = '" + state + "'")
queries.append("SELECT ZipCode, Plus4Low, StreetFull, AddressSecAbbr, AddressSecLowNumber, AddressSecHighNumber, AddressSecOddEven, AddressPrimaryLowNumber, AddressPrimaryHighNumber, AddressPrimaryEvenOdd, RecordType FROM ZIP4 WHERE StName = '" + street + "' AND State = '" + state + "'")
basenamequeries.append("SELECT ZipCode, Plus4Low, StreetFull, AddressSecAbbr, AddressSecLowNumber, AddressSecHighNumber, AddressSecOddEven, AddressPrimaryLowNumber, AddressPrimaryHighNumber, AddressPrimaryEvenOdd, RecordType FROM ZIP4 WHERE StName = '" + streetBasename + "' AND State = '" + state + "'")
queries.append("SELECT ZipCode, Plus4Low, StreetFull, AddressSecAbbr, AddressSecLowNumber, AddressSecHighNumber, AddressSecOddEven, AddressPrimaryLowNumber, AddressPrimaryHighNumber, AddressPrimaryEvenOdd, RecordType FROM ZIP4 WHERE StreetFull LIKE '" + street + "%' AND State = '" + state + "'")
#queries.append("SELECT ZipCode, Plus4Low, StreetFull, AddressSecAbbr, AddressSecLowNumber, AddressSecHighNumber, AddressPrimaryLowNumber, AddressPrimaryHighNumber, AddressPrimaryEvenOdd FROM ZIP4 WHERE StName LIKE '" + streetBasename + "%' AND State = '" + state + "'")
resultrows = []
@ -302,14 +302,38 @@ def getZIP4(number, street, unit, state, lat, lon, city=False, zip=False, county
if base_rows:
# Narrow further by looking for exact number matches (low and high are the same and what we're looking for)
exact_rows = []
street_rows = []
for row in base_rows:
if addressRangeIsExactNumber(row["AddressPrimaryLowNumber"], row["AddressPrimaryHighNumber"], number):
exact_rows.append(row)
else:
street_rows.append(row)
if len(exact_rows) > 0:
resultrows = exact_rows
elif len(street_rows) > 0:
resultrows = street_rows
else:
resultrows = base_rows
elif unit:
exact_rows = []
default_rows = []
street_rows = []
for row in resultrows:
if row["RecordType"] == "H" and addressRangeContainsNumber(row["AddressSecLowNumber"], row["AddressSecHighNumber"], row["AddressSecOddEven"], unit):
exact_rows.append(row)
elif row["RecordType"] == "H" and row["AddressSecLowNumber"] == "":
default_rows.append(row)
elif row["RecordType"] == "S":
street_rows.append(row)
if len(exact_rows) > 0:
resultrows = exact_rows
elif len(default_rows) > 0:
resultrows = default_rows
elif len(street_rows) > 0:
resultrows = street_rows
# If that left us with exactly one, we can return it immediately
if len(resultrows) == 1:
@ -318,9 +342,10 @@ def getZIP4(number, street, unit, state, lat, lon, city=False, zip=False, county
row["ZipCode"],
row["Plus4Low"],
row["StreetFull"],
"", # no unit designator when no unit was given
unit, # still the original (empty) unit
row["AddressSecAbbr"],
unit
)
suggestZip = resultrows[0]["ZipCode"]
suggestStreet = resultrows[0]["StreetFull"]
for row in resultrows: