@exabugs/dynamodb-client 1.3.42 → 1.3.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/README.md +1 -6
- package/dist/server/handler.cjs +65 -3
- package/dist/server/handler.cjs.map +2 -2
- package/dist/server/query/nearSearch.d.ts.map +1 -1
- package/dist/server/query/nearSearch.js +62 -0
- package/dist/server/query/nearSearch.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nearSearch.d.ts","sourceRoot":"","sources":["../../../src/server/query/nearSearch.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,SAAS,EAOf,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"nearSearch.d.ts","sourceRoot":"","sources":["../../../src/server/query/nearSearch.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,SAAS,EAOf,MAAM,+BAA+B,CAAC;AA2BvC;;GAEG;AACH,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,iBAAiB;IACjB,SAAS,EAAE,KAAK,CAAC,CAAC,GAAG,oBAAoB,CAAC,CAAC;IAC3C,cAAc;IACd,QAAQ,EAAE;QACR,aAAa;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU;QACV,eAAe,EAAE,MAAM,CAAC;QACxB,WAAW;QACX,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvE,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,EAAE,CAAC,EACvD,MAAM,GAAE,aAAsC,GAC7C,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAgK9B"}
|
|
@@ -4,6 +4,29 @@
|
|
|
4
4
|
* Records Lambdaで検証済みの9ブロック検索アルゴリズムを移植
|
|
5
5
|
*/
|
|
6
6
|
import { DEFAULT_GEOHASH_CONFIG, calculateDistance, encodeGeoHash, extractCoordinatesFromNearQuery, extractMaxDistanceFromNearQuery, extractMinDistanceFromNearQuery, getNeighborGeoHashes, } from '../../shared/geohash/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* GeoHash精度ごとの誤差範囲(メートル)
|
|
9
|
+
* 9ブロック検索(3×3)での実効カバー範囲を計算
|
|
10
|
+
*/
|
|
11
|
+
const GEOHASH_COVERAGE = {
|
|
12
|
+
8: 19 * 3, // ±19m × 3 = 約57m
|
|
13
|
+
7: 76 * 3, // ±76m × 3 = 約228m
|
|
14
|
+
6: 610 * 3, // ±610m × 3 = 約1,830m (1.8km)
|
|
15
|
+
5: 2400 * 3, // ±2.4km × 3 = 約7,200m (7.2km)
|
|
16
|
+
4: 20000 * 3, // ±20km × 3 = 約60,000m (60km)
|
|
17
|
+
3: 78000 * 3, // ±78km × 3 = 約234,000m (234km)
|
|
18
|
+
2: 630000 * 3, // ±630km × 3 = 約1,890,000m (1,890km)
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* 指定された精度での9ブロック検索がmaxDistanceをカバーしているか判定
|
|
22
|
+
*/
|
|
23
|
+
function coversMaxDistance(precision, maxDistance) {
|
|
24
|
+
const coverage = GEOHASH_COVERAGE[precision];
|
|
25
|
+
if (!coverage) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
return coverage >= maxDistance;
|
|
29
|
+
}
|
|
7
30
|
/**
|
|
8
31
|
* 9ブロック検索を実行
|
|
9
32
|
*
|
|
@@ -57,6 +80,45 @@ export async function executeNearSearch(nearQuery, fieldName, limit, searchFunct
|
|
|
57
80
|
allCandidates.push(candidate);
|
|
58
81
|
}
|
|
59
82
|
}
|
|
83
|
+
// maxDistanceが指定されている場合、距離内の候補数をチェック
|
|
84
|
+
if (maxDistance !== undefined) {
|
|
85
|
+
// 現在の候補から距離内のものをカウント
|
|
86
|
+
let candidatesWithinDistance = 0;
|
|
87
|
+
for (const candidate of allCandidates) {
|
|
88
|
+
const location = candidate[fieldName];
|
|
89
|
+
if (location &&
|
|
90
|
+
typeof location.latitude === 'number' &&
|
|
91
|
+
typeof location.longitude === 'number') {
|
|
92
|
+
const distance = calculateDistance(latitude, longitude, location.latitude, location.longitude);
|
|
93
|
+
if (distance <= maxDistance) {
|
|
94
|
+
candidatesWithinDistance++;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// 距離内の候補が十分に見つかったら終了
|
|
99
|
+
if (candidatesWithinDistance >= limit) {
|
|
100
|
+
console.log('[nearSearch] Early termination: found enough candidates within maxDistance', {
|
|
101
|
+
candidatesWithinDistance,
|
|
102
|
+
limit,
|
|
103
|
+
maxDistance,
|
|
104
|
+
precision,
|
|
105
|
+
iterations,
|
|
106
|
+
});
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
// 現在の精度での検索範囲がmaxDistanceを完全にカバーしている場合、
|
|
110
|
+
// これ以上精度を緩和しても意味がないので終了
|
|
111
|
+
if (coversMaxDistance(precision, maxDistance)) {
|
|
112
|
+
console.log('[nearSearch] Early termination: current precision covers maxDistance', {
|
|
113
|
+
precision,
|
|
114
|
+
maxDistance,
|
|
115
|
+
coverage: GEOHASH_COVERAGE[precision],
|
|
116
|
+
candidatesWithinDistance,
|
|
117
|
+
iterations,
|
|
118
|
+
});
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
60
122
|
// 精度を1文字減らす(検索範囲を広げる)
|
|
61
123
|
precision--;
|
|
62
124
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nearSearch.js","sourceRoot":"","sources":["../../../src/server/query/nearSearch.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,sBAAsB,EAItB,iBAAiB,EACjB,aAAa,EACb,+BAA+B,EAC/B,+BAA+B,EAC/B,+BAA+B,EAC/B,oBAAoB,GACrB,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"nearSearch.js","sourceRoot":"","sources":["../../../src/server/query/nearSearch.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@exabugs/dynamodb-client",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.43",
|
|
4
4
|
"description": "DynamoDB Single-Table Client SDK with MongoDB-like API, Shadow Records, and Lambda implementation for serverless applications",
|
|
5
5
|
"author": "exabugs",
|
|
6
6
|
"license": "MIT",
|