收尾:验收脚本自动清死元组、城市圈首末到访按可见到访算、补使用说明

verify.sh:测试库 ≥ VACUUM_MIN_MB(默认 200MB)时先 VACUUM (ANALYZE)——一轮全量会留几百 MB
死元组,级联删除随之变慢(同一夹具用例实测 13.6s → 10.2s)。只用普通 VACUUM:FULL 要
ACCESS EXCLUSIVE 锁,有别的服务连着测试库时会把验收整段卡住。

/api/cities 的首末到访改成按可见到访的到达时间算(内层 min/max(v.arrival)),不再取
places.first/last_visit_at——那两列是全量的,会被已并入 / 子段的到访推早推晚。

README 补两节:「数据编辑页上的重复到访」(判定口径与清理范围)、「为什么有些到访在页面上看不到」
(已并入 / 子段不计入显示与统计,但导出必须原样带着),并在开发提示里记下验收环境的死元组与
is_active 两个坑。

回归:city_agg_test.go 补了一段能区分的断言——把某地点最晚那次到访标成已并入后,城市最近到访
必须从 09-13 退到 09-08(原先只比对同口径时,两种算法在夹具数据上结果一样,是条假绿的断言)。
This commit is contained in:
tamakyi
2026-09-29 23:49:39 +08:00
parent 3d03aae018
commit 881f2933ff
4 changed files with 144 additions and 3 deletions
+4 -1
View File
@@ -956,7 +956,10 @@ func (s *Server) apiCityAgg(w http.ResponseWriter, r *http.Request) {
COALESCE(sum(pa.visits),0), count(*), COALESCE(sum(pa.dwell),0),
min(pa.first_at), max(pa.last_at)
FROM (
SELECT p.id, p.city, p.province, p.lat, p.lon, p.first_visit_at AS first_at, p.last_visit_at AS last_at,
SELECT p.id, p.city, p.province, p.lat, p.lon,
-- 首末到访按**可见到访**的到达时间算,不取 places 列值(那两列是全量,
-- 会被已并入 / 子段的行推早推晚),与 visit_count 之类的口径保持一致
min(v.arrival) AS first_at, max(v.arrival) AS last_at,
count(*) AS visits,
COALESCE(sum(LEAST(COALESCE(v.duration_min,0),10080)),0) AS dwell
FROM places p