using InABox.Core; using NPOI.HSSF.Record; using NPOI.OpenXmlFormats.Spreadsheet; namespace InABox.Database.Stores; public class AddressLookupStore : Store { private static List _cache= new(); private static IQueryProviderFactory? _queryProviderFactory = null; public override void Init() { base.Init(); // Load the cache file into memory string cachefile = Path.Combine(CoreUtils.GetPath(), "GNAF_CORE.psv"); if (File.Exists(cachefile)) { DateTime start = DateTime.Now; Logger.Send(LogType.Information,"",$"Loading Address Lookup File: {cachefile}"); using (StreamReader sr = new(cachefile)) { var headers = sr.ReadLine().Split('|').ToList(); int streetfield = headers.IndexOf("ADDRESS_LABEL"); int statefield = headers.IndexOf("STATE"); int latfield = headers.IndexOf("LATITUDE"); int lngfield = headers.IndexOf("LONGITUDE"); while (!sr.EndOfStream) { var line = sr.ReadLine().Split('|').ToArray(); if (string.Equals(line[statefield], "WA")) { _cache.Add(new AddressLookup() { Address = line[streetfield], Latitude = double.Parse(line[latfield]), Longitude = double.Parse(line[lngfield]) }); } } } Logger.Send(LogType.Information,"",$"Found {_cache.Count} addresses in {(DateTime.Now - start):g}"); } else Logger.Send(LogType.Information,"",$"Address Lookup File: {cachefile} not found!"); } protected override CoreTable OnQuery(Filter? filter, Columns? columns, SortOrder? sort, CoreRange? range) { _queryProviderFactory ??= this.GetQueryProviderFactory(); var result = new CoreTable(); var cols = columns ?? Columns.All(); result.Columns.AddRange(cols.Select(x => new CoreColumn(x.Property))); foreach (var lookup in _cache) { if (filter == null || filter.Match(lookup, _queryProviderFactory)) { var row = result.NewRow(); result.LoadRow(lookup); result.Rows.Add(row); } } return result; } }