예제 #1
0
        public bool DoOneZipCode(string zipCode)
        {
            // Get all zip rows from ZipStreetsDownloaded
            var    isSingle           = false;
            var    found              = false;
            string singleLdsStateCode = null;
            var    streetsTable       = ZipStreetsDownloaded.GetLookupDataByZipCode(zipCode, 0);

            if (streetsTable.Count > 0)
            {
                found = true;

                // Fetch and summarize the USZD data
                var ldsDictionary = new Dictionary <LdsInfo, object>();
                var zip4S         = CreateZipPlus4List(streetsTable);
                var uszdTable     = Uszd.GetDataByZip4List(zipCode, zip4S, 0);
                foreach (var row in uszdTable)
                {
                    var stateCode = StateCache.StateCodeFromLdsStateCode(row.LdsStateCode);
                    singleLdsStateCode = row.LdsStateCode;
                    var ldsInfo = new LdsInfo(stateCode, row.Congress, row.StateSenate,
                                              row.StateHouse, row.County);
                    ldsDictionary[ldsInfo] = null;
                }
                if (ldsDictionary.Count == 1)
                {
                    isSingle = true;
                    var singleLdsInfo = ldsDictionary.Keys.Single();
                    if (!_SuppressUpdate)
                    {
                        ZipSingleUszd.Insert(zipCode: zipCode,
                                             congress: singleLdsInfo.Congress.Substring(1),
                                             // LdsInfo padds it to 3
                                             stateSenate: singleLdsInfo.StateSenate,
                                             stateHouse: singleLdsInfo.StateHouse,
                                             ldsStateCode: singleLdsStateCode, county: singleLdsInfo.County,
                                             stateCode: singleLdsInfo.StateCode);
                    }
                }
            }

            if (found)
            {
                Report("{0}: {1}", zipCode, isSingle ? "Single" : "Multiple");
            }

            return(isSingle);
        }
예제 #2
0
 public void SetMissingLdsInfo() => LdsInfo = LdsInfo.Missing;
예제 #3
0
        //private void CheckForSingleLdsOverall(Dictionary<string, List<StreetAnalysisData>> splits)
        //{
        //  // If all entries in all three lists have the same ldsInfo, we can
        //  // substitute a single "B" entry
        //  StreetAnalysisData firstFound = null;
        //  bool canSubstitute = true;
        //  foreach (var split in splits.Values)
        //  {
        //    foreach (var data in split)
        //      if (firstFound == null)
        //        firstFound = data;
        //      else if (firstFound.LdsInfo != data.LdsInfo) // no good
        //      {
        //        canSubstitute = false;
        //        break;
        //      }
        //    if (!canSubstitute) break;
        //  }
        //  if (canSubstitute)
        //  {
        //    // use firstFound as the "B" entry
        //    firstFound.PrimaryOddEven = "B";
        //    firstFound.PrimaryLowNumber = string.Empty;
        //    firstFound.PrimaryHighNumber = string.Empty;
        //    firstFound.BuildingName = string.Empty;
        //    firstFound.SecondaryType = string.Empty;
        //    firstFound.SecondaryLowNumber = string.Empty;
        //    firstFound.SecondaryHighNumber = string.Empty;

        //    // adjust count and clear out old
        //    foreach (var split in splits.Values)
        //    {
        //      _Statistics.Merged += split.Count;
        //      split.Clear();
        //    }

        //    // add in new
        //    splits["B"].Add(firstFound);
        //    _Statistics.Merged--;
        //  }
        //}

        private static bool CheckPoBoxRange(StreetAnalysisData data,
                                            ICollection <StreetAnalysisData> deletions,
                                            ICollection <StreetAnalysisData> additions)
        {
            var addressLow  = long.Parse(data.PrimaryLowNumber);
            var addressHigh = long.Parse(data.PrimaryHighNumber);
            var zip4Low     = int.Parse(data.Plus4Low);
            var zip4High    = int.Parse(data.Plus4High);

            // Ranges must correspond
            if (addressHigh - addressLow != zip4High - zip4Low)
            {
                return(false);
            }

            // This dictionary caches the Zip+4 values
            var zip4List      = CreateZip4List(zip4Low, zip4High);
            var ldsDictionary = GetLdsInfoDictionary(data.ZipCode, zip4List);

            // Build the list of results
            var boxList = new List <PoBoxInfo>();

            for (var n = 0; n <= addressHigh - addressLow; n++)
            {
                var address = (addressLow + n).ToString(CultureInfo.InvariantCulture)
                              .ZeroPad(AddressFinder.MaxHouseNumberLength);
                var zip4 = (zip4Low + n).ToString(CultureInfo.InvariantCulture)
                           .ZeroPad(4);
                LdsInfo ldsInfo;
                if (!ldsDictionary.TryGetValue(zip4, out ldsInfo))
                {
                    ldsInfo = LdsInfo.Missing;
                }
                boxList.Add(new PoBoxInfo {
                    Address = address, LdsInfo = ldsInfo
                });
            }

            // Summarize to additions
            LdsInfo currentLdsInfo = null;
            string  lowAddress     = null;
            var     sequence       = 0;

            for (var n = 0; n <= boxList.Count; n++)
            {
                var endOfData = n == boxList.Count;
                if (endOfData || (boxList[n].LdsInfo != currentLdsInfo))
                {
                    if (currentLdsInfo != null) // create new
                    {
                        sequence++;
                        var toAdd = data.Clone();
                        toAdd.UpdateKey += "-" + sequence.ToString(CultureInfo.InvariantCulture)
                                           .ZeroPad(2);
                        toAdd.PrimaryLowNumber  = lowAddress;
                        toAdd.PrimaryHighNumber = boxList[n - 1].Address;
                        toAdd.LdsInfo           = currentLdsInfo;
                        additions.Add(toAdd);
                    }
                    if (!endOfData)
                    {
                        currentLdsInfo = boxList[n].LdsInfo;
                        lowAddress     = boxList[n].Address;
                    }
                }
            }

            deletions.Add(data);

            return(true);
        }
예제 #4
0
 public static bool Equals(LdsInfo x, LdsInfo y) =>
 (x.StateCode == y.StateCode) &&
 (x.Congress == y.Congress) &&
 (x.StateSenate == y.StateSenate) &&
 (x.StateHouse == y.StateHouse) &&
 (x.County == y.County);