added search
This commit is contained in:
1 parent
0e51144845
commit
91788dd54b
11 files changed
+169
-73
No files matched your search
@@ -1,4 +1,5 @@
|
||||
using DuckDB.NET.Data;
|
||||
using FuzzierSharp;
|
||||
|
||||
namespace YongeStreet.Services;
|
||||
|
||||
@@ -10,15 +11,27 @@ public record CityRoadLengthStats(string Name, double MunicipalRoadLength, DateO
|
||||
|
||||
public class DataService
|
||||
{
|
||||
private static readonly List<string> CITY_STREET_HIGHWAY = ["primary",
|
||||
private static readonly List<string> CITY_STREET_HIGHWAY =
|
||||
[
|
||||
"primary",
|
||||
"primary_link",
|
||||
"secondary",
|
||||
"secondary",
|
||||
"secondary_link",
|
||||
"tertiary",
|
||||
"tertiary_link",
|
||||
"residential",
|
||||
"unclassified"];
|
||||
private readonly string path = System.Environment.GetEnvironmentVariable("PREPROCESSED_DUCKDB_FILE") ?? "/home/didier/all-dressed-programming/YongeStreet/real.duckdb";
|
||||
"unclassified"
|
||||
];
|
||||
|
||||
private readonly ILogger<DataService> _logger;
|
||||
|
||||
private readonly string path = Environment.GetEnvironmentVariable("PREPROCESSED_DUCKDB_FILE") ??
|
||||
"/home/didier/all-dressed-programming/YongeStreet/real.duckdb";
|
||||
|
||||
public DataService(ILogger<DataService> logger)
|
||||
{
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public IList<Road> GetRoads(string city, DateOnly extractDate)
|
||||
{
|
||||
@@ -48,20 +61,20 @@ public class DataService
|
||||
return ret;
|
||||
}
|
||||
|
||||
public IList<CityOverview> GetCityOverview()
|
||||
public List<CityOverview> GetCityOverview()
|
||||
{
|
||||
using var duckDBConnection = new DuckDBConnection($"Data Source={path};ACCESS_MODE=READ_ONLY");
|
||||
duckDBConnection.Open();
|
||||
|
||||
using var command = duckDBConnection.CreateCommand();
|
||||
command.CommandText = """
|
||||
SELECT city_name,
|
||||
WITH raw AS (SELECT city_name,
|
||||
SUM(length) FILTER (list_contains($allowed_highway, highway) AND extract_date = (Date '2025-01-01')) AS length,
|
||||
LIST(DISTINCT extract_date) AS available_years
|
||||
FROM city_road
|
||||
GROUP BY city_name
|
||||
ORDER BY length desc
|
||||
LIMIT 100
|
||||
ORDER BY length desc)
|
||||
SELECT * FROM raw WHERE length > 1000
|
||||
""";
|
||||
command.Parameters.Add(new DuckDBParameter("allowed_highway", CITY_STREET_HIGHWAY));
|
||||
using var reader = command.ExecuteReader();
|
||||
@@ -74,7 +87,36 @@ public class DataService
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
public List<string> GetAllCityNames()
|
||||
{
|
||||
using var duckDBConnection = new DuckDBConnection($"Data Source={path};ACCESS_MODE=READ_ONLY");
|
||||
duckDBConnection.Open();
|
||||
|
||||
using var command = duckDBConnection.CreateCommand();
|
||||
command.CommandText = "SELECT DISTINCT city_name FROM city_road";
|
||||
using var reader = command.ExecuteReader();
|
||||
|
||||
var ret = new List<string>();
|
||||
while (reader.Read()) ret.Add(reader.GetString(0));
|
||||
return ret;
|
||||
}
|
||||
|
||||
public List<CityOverview> GetCityOverview(string search)
|
||||
{
|
||||
_logger.LogWarning("Seeking " + search);
|
||||
if (search == "") return GetCityOverview().Take(20).ToList();
|
||||
|
||||
var cityNames = GetAllCityNames();
|
||||
var foundCityNames = Process.ExtractSorted(search, cityNames);
|
||||
return (
|
||||
from cityName in foundCityNames
|
||||
join city in GetCityOverview() on cityName.Value equals city.Name
|
||||
orderby cityName.Score descending
|
||||
select city
|
||||
).Take(20).ToList();
|
||||
}
|
||||
|
||||
public IList<CityRoadLengthStats> GetCityRoadLengthStats(string city)
|
||||
{
|
||||
using var duckDBConnection = new DuckDBConnection($"Data Source={path};ACCESS_MODE=READ_ONLY");
|
||||
@@ -95,15 +137,10 @@ public class DataService
|
||||
|
||||
var ret = new List<CityRoadLengthStats>();
|
||||
while (reader.Read())
|
||||
{
|
||||
ret.Add(new CityRoadLengthStats(city,
|
||||
reader.GetInt32(0),
|
||||
ret.Add(new CityRoadLengthStats(city,
|
||||
reader.GetInt32(0),
|
||||
reader.GetFieldValue<DateOnly>(1)));
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
Reference in new issue
Block a user