@exabugs/dynamodb-client 1.26.0 → 1.27.1
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 +45 -0
- package/dist/__generated__/models/apiOperation.d.ts +1 -0
- package/dist/__generated__/models/apiOperation.d.ts.map +1 -1
- package/dist/__generated__/models/apiOperation.js +1 -0
- package/dist/__generated__/models/apiOperation.js.map +1 -1
- package/dist/__generated__/models/bulkOperationResult.d.ts +2 -0
- package/dist/__generated__/models/bulkOperationResult.d.ts.map +1 -1
- package/dist/__generated__/models/countParams.d.ts +31 -0
- package/dist/__generated__/models/countParams.d.ts.map +1 -0
- package/dist/__generated__/models/countParams.js +2 -0
- package/dist/__generated__/models/countParams.js.map +1 -0
- package/dist/__generated__/models/countResult.d.ts +37 -0
- package/dist/__generated__/models/countResult.d.ts.map +1 -0
- package/dist/__generated__/models/countResult.js +2 -0
- package/dist/__generated__/models/countResult.js.map +1 -0
- package/dist/__generated__/models/countResultConsumedCapacity.d.ts +35 -0
- package/dist/__generated__/models/countResultConsumedCapacity.d.ts.map +1 -0
- package/dist/__generated__/models/countResultConsumedCapacity.js +25 -0
- package/dist/__generated__/models/countResultConsumedCapacity.js.map +1 -0
- package/dist/__generated__/models/executeOperationBodyOp.d.ts +1 -0
- package/dist/__generated__/models/executeOperationBodyOp.d.ts.map +1 -1
- package/dist/__generated__/models/executeOperationBodyOp.js +1 -0
- package/dist/__generated__/models/executeOperationBodyOp.js.map +1 -1
- package/dist/__generated__/models/findResultPageInfo.d.ts +2 -0
- package/dist/__generated__/models/findResultPageInfo.d.ts.map +1 -1
- package/dist/__generated__/models/index.d.ts +3 -0
- package/dist/__generated__/models/index.d.ts.map +1 -1
- package/dist/__generated__/models/index.js +3 -0
- package/dist/__generated__/models/index.js.map +1 -1
- package/dist/client/Collection.d.ts +7 -0
- package/dist/client/Collection.d.ts.map +1 -1
- package/dist/client/Collection.js +20 -1
- package/dist/client/Collection.js.map +1 -1
- package/dist/scripts/repair-shadows.js +86 -42
- package/dist/scripts/repair-shadows.js.map +1 -1
- package/dist/scripts/utils/cliParser.d.ts +9 -22
- package/dist/scripts/utils/cliParser.d.ts.map +1 -1
- package/dist/scripts/utils/cliParser.js +14 -37
- package/dist/scripts/utils/cliParser.js.map +1 -1
- package/dist/scripts/utils/shadowAudit.d.ts +49 -0
- package/dist/scripts/utils/shadowAudit.d.ts.map +1 -0
- package/dist/scripts/utils/shadowAudit.js +84 -0
- package/dist/scripts/utils/shadowAudit.js.map +1 -0
- package/dist/scripts/utils/shadowRepair.d.ts +42 -0
- package/dist/scripts/utils/shadowRepair.d.ts.map +1 -0
- package/dist/scripts/utils/shadowRepair.js +110 -0
- package/dist/scripts/utils/shadowRepair.js.map +1 -0
- package/dist/server/handler.cjs +1237 -1122
- package/dist/server/handler.cjs.map +4 -4
- package/dist/server/handler.js +2 -2
- package/dist/server/handler.js.map +1 -1
- package/dist/server/media-handler.cjs +2 -2
- package/dist/server/media-process-handler-dlq.cjs +19 -3
- package/dist/server/media-process-handler-dlq.cjs.map +2 -2
- package/dist/server/media-process-handler.cjs +19 -3
- package/dist/server/media-process-handler.cjs.map +2 -2
- package/dist/server/operations/count.d.ts +3 -0
- package/dist/server/operations/count.d.ts.map +1 -0
- package/dist/server/operations/count.js +81 -0
- package/dist/server/operations/count.js.map +1 -0
- package/dist/server/operations/deleteMany.d.ts.map +1 -1
- package/dist/server/operations/deleteMany.js +2 -1
- package/dist/server/operations/deleteMany.js.map +1 -1
- package/dist/server/operations/deleteOne.d.ts.map +1 -1
- package/dist/server/operations/deleteOne.js +3 -12
- package/dist/server/operations/deleteOne.js.map +1 -1
- package/dist/server/operations/find/handler.d.ts.map +1 -1
- package/dist/server/operations/find/handler.js +4 -1
- package/dist/server/operations/find/handler.js.map +1 -1
- package/dist/server/operations/find/keyCondition.d.ts +38 -0
- package/dist/server/operations/find/keyCondition.d.ts.map +1 -0
- package/dist/server/operations/find/keyCondition.js +184 -0
- package/dist/server/operations/find/keyCondition.js.map +1 -0
- package/dist/server/operations/find/nearQuery.d.ts +4 -1
- package/dist/server/operations/find/nearQuery.d.ts.map +1 -1
- package/dist/server/operations/find/nearQuery.js +30 -42
- package/dist/server/operations/find/nearQuery.js.map +1 -1
- package/dist/server/operations/find/shadowQuery.d.ts.map +1 -1
- package/dist/server/operations/find/shadowQuery.js +16 -143
- package/dist/server/operations/find/shadowQuery.js.map +1 -1
- package/dist/server/operations/find/utils.d.ts.map +1 -1
- package/dist/server/operations/find/utils.js +0 -5
- package/dist/server/operations/find/utils.js.map +1 -1
- package/dist/server/operations/insertMany.d.ts.map +1 -1
- package/dist/server/operations/insertMany.js +1 -4
- package/dist/server/operations/insertMany.js.map +1 -1
- package/dist/server/operations/insertOne.d.ts.map +1 -1
- package/dist/server/operations/insertOne.js +2 -6
- package/dist/server/operations/insertOne.js.map +1 -1
- package/dist/server/operations/operationDispatcher.d.ts.map +1 -1
- package/dist/server/operations/operationDispatcher.js +3 -0
- package/dist/server/operations/operationDispatcher.js.map +1 -1
- package/dist/server/operations/updateMany.d.ts.map +1 -1
- package/dist/server/operations/updateMany.js +23 -17
- package/dist/server/operations/updateMany.js.map +1 -1
- package/dist/server/operations/updateOne.d.ts.map +1 -1
- package/dist/server/operations/updateOne.js +10 -21
- package/dist/server/operations/updateOne.js.map +1 -1
- package/dist/server/query/nearSearch.d.ts +37 -25
- package/dist/server/query/nearSearch.d.ts.map +1 -1
- package/dist/server/query/nearSearch.js +87 -125
- package/dist/server/query/nearSearch.js.map +1 -1
- package/dist/server/types.d.ts +7 -1
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/utils/bulkError.d.ts +12 -0
- package/dist/server/utils/bulkError.d.ts.map +1 -0
- package/dist/server/utils/bulkError.js +21 -0
- package/dist/server/utils/bulkError.js.map +1 -0
- package/dist/server/utils/chunking.d.ts +9 -1
- package/dist/server/utils/chunking.d.ts.map +1 -1
- package/dist/server/utils/chunking.js +20 -3
- package/dist/server/utils/chunking.js.map +1 -1
- package/dist/server/utils/filter.d.ts +3 -105
- package/dist/server/utils/filter.d.ts.map +1 -1
- package/dist/server/utils/filter.js +14 -218
- package/dist/server/utils/filter.js.map +1 -1
- package/dist/server/utils/updateOperators.d.ts +12 -1
- package/dist/server/utils/updateOperators.d.ts.map +1 -1
- package/dist/server/utils/updateOperators.js +53 -6
- package/dist/server/utils/updateOperators.js.map +1 -1
- package/docs/README.md +9 -12
- package/package.json +1 -1
- package/dist/scripts/operations/bulkRecordRepair.d.ts +0 -17
- package/dist/scripts/operations/bulkRecordRepair.d.ts.map +0 -1
- package/dist/scripts/operations/bulkRecordRepair.js +0 -76
- package/dist/scripts/operations/bulkRecordRepair.js.map +0 -1
- package/dist/scripts/operations/singleRecordRepair.d.ts +0 -18
- package/dist/scripts/operations/singleRecordRepair.d.ts.map +0 -1
- package/dist/scripts/operations/singleRecordRepair.js +0 -46
- package/dist/scripts/operations/singleRecordRepair.js.map +0 -1
- package/dist/scripts/utils/awsUtils.d.ts +0 -15
- package/dist/scripts/utils/awsUtils.d.ts.map +0 -1
- package/dist/scripts/utils/awsUtils.js +0 -31
- package/dist/scripts/utils/awsUtils.js.map +0 -1
- package/dist/scripts/utils/clientFactory.d.ts +0 -22
- package/dist/scripts/utils/clientFactory.d.ts.map +0 -1
- package/dist/scripts/utils/clientFactory.js +0 -36
- package/dist/scripts/utils/clientFactory.js.map +0 -1
- package/dist/scripts/utils/repairUtils.d.ts +0 -58
- package/dist/scripts/utils/repairUtils.d.ts.map +0 -1
- package/dist/scripts/utils/repairUtils.js +0 -52
- package/dist/scripts/utils/repairUtils.js.map +0 -1
- package/dist/server/utils/ttl.d.ts +0 -17
- package/dist/server/utils/ttl.d.ts.map +0 -1
- package/dist/server/utils/ttl.js +0 -64
- package/dist/server/utils/ttl.js.map +0 -1
|
@@ -1,163 +1,123 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* GeoHash近隣検索ロジック
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* 周囲 9 マス(中心 + 隣接 8 方向)のシャドーだけを読み、位置の近似から、確定できる範囲で打ち切る。
|
|
5
|
+
* 本体レコードは、最後に、結果になりうる候補だけを 1 回読む。
|
|
6
|
+
*
|
|
7
|
+
* 保証できる半径 r(p, 緯度) = 精度 p のマスの短い辺。検索点から r 以内の点は、必ず周囲 9 マスの中にある
|
|
8
|
+
* (検索点は中央のマスのどこにでもあるので、9 マスの縁までの最短距離は、マス 1 つぶんの短い辺)。
|
|
5
9
|
*/
|
|
6
|
-
import { DEFAULT_GEOHASH_CONFIG, calculateDistance, encodeGeoHash, extractCoordinatesFromNearQuery, extractMaxDistanceFromNearQuery, extractMinDistanceFromNearQuery, getNeighborGeoHashes, } from '../../shared/geohash/index.js';
|
|
10
|
+
import { DEFAULT_GEOHASH_CONFIG, calculateDistance, decodeGeoHash, encodeGeoHash, extractCoordinatesFromNearQuery, extractMaxDistanceFromNearQuery, extractMinDistanceFromNearQuery, getNeighborGeoHashes, } from '../../shared/geohash/index.js';
|
|
11
|
+
/** 緯度 1 度の長さ(メートル)。経度 1 度の長さの上限(赤道)にも使う(実際は地球の半径から求めるより少し長い) */
|
|
12
|
+
const METERS_PER_DEGREE = 111320;
|
|
7
13
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
14
|
+
* 精度 p のマスの(緯度方向の高さ, 経度方向の幅)。メートル。経度は `cosLat` を掛ける
|
|
15
|
+
*
|
|
16
|
+
* geohash は経度から先に 1 ビットずつ割る。精度 p は 5p ビットで、経度が ceil(5p/2)、緯度が floor(5p/2)
|
|
10
17
|
*/
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
};
|
|
18
|
+
function cellSizeMeters(precision, cosLat) {
|
|
19
|
+
const latBits = Math.floor((5 * precision) / 2);
|
|
20
|
+
const lonBits = Math.ceil((5 * precision) / 2);
|
|
21
|
+
const heightDeg = 180 / 2 ** latBits;
|
|
22
|
+
return {
|
|
23
|
+
height: heightDeg * METERS_PER_DEGREE,
|
|
24
|
+
width: (360 / 2 ** lonBits) * METERS_PER_DEGREE * cosLat,
|
|
25
|
+
heightDeg,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
20
28
|
/**
|
|
21
|
-
*
|
|
29
|
+
* 精度 p で保証できる半径(メートル)= マスの短い辺
|
|
30
|
+
*
|
|
31
|
+
* 経度方向の幅は、周囲 9 マスのうち最も高緯度の縁の cos を使う(高緯度ほど狭い)。
|
|
22
32
|
*/
|
|
23
|
-
function
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
33
|
+
export function guaranteedRadius(precision, latitude) {
|
|
34
|
+
const { heightDeg } = cellSizeMeters(precision, 1);
|
|
35
|
+
const worstLatitude = Math.min(89.9, Math.abs(latitude) + 2 * heightDeg);
|
|
36
|
+
const { height, width } = cellSizeMeters(precision, Math.cos((worstLatitude * Math.PI) / 180));
|
|
37
|
+
return Math.min(height, width);
|
|
38
|
+
}
|
|
39
|
+
/** シャドーの精度の位置の誤差 ε(メートル)= マスの対角線の半分(経度は赤道の長さで見て、上限にする) */
|
|
40
|
+
export function shadowPositionError(shadowPrecision) {
|
|
41
|
+
const { height, width } = cellSizeMeters(shadowPrecision, 1);
|
|
42
|
+
return Math.hypot(height, width) / 2;
|
|
43
|
+
}
|
|
44
|
+
/** 近似の距離の列から、k 番目に小さいもの(k 件に足りなければ undefined)。昇順に並べて渡すこと */
|
|
45
|
+
function kthOf(sortedAscending, k) {
|
|
46
|
+
return sortedAscending.length >= k ? sortedAscending[k - 1] : undefined;
|
|
29
47
|
}
|
|
30
48
|
/**
|
|
31
|
-
*
|
|
49
|
+
* 近隣検索を実行
|
|
32
50
|
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
51
|
+
* 1. 周囲 9 マスのシャドーを読み、近似の距離 d̃ を求める(重複は id で消える)
|
|
52
|
+
* 2. 上位 limit 件が 9 マスの中で確定する(d̃ₖ + ε ≤ r)か、円の全体を 9 マスが覆う(maxDistance + ε ≤ r)
|
|
53
|
+
* まで、精度を 1 つずつ下げて 1 に戻る(`minPrecision` まで)
|
|
54
|
+
* 3. d̃ が d̃ₖ + 2ε 以内の候補(maxDistance・minDistance があればその範囲)だけの本体を、1 回読む
|
|
35
55
|
*
|
|
36
56
|
* @param nearQuery - $nearクエリ
|
|
37
57
|
* @param fieldName - GeoHashフィールド名
|
|
38
58
|
* @param limit - 取得件数
|
|
39
|
-
* @param
|
|
59
|
+
* @param searchShadows - 1 マス(geohash の接頭辞)のシャドーを読む関数
|
|
60
|
+
* @param readBodies - id の本体を読む関数(ほかの条件で絞る場合は、ここで絞る)
|
|
40
61
|
* @param config - GeoHash設定
|
|
41
|
-
* @returns 距離付きドキュメントと検索メタデータ
|
|
42
|
-
*
|
|
43
|
-
* @example
|
|
44
|
-
* ```typescript
|
|
45
|
-
* const result = await executeNearSearch(
|
|
46
|
-
* { latitude: 35.6812, longitude: 139.7671, maxDistance: 5000 },
|
|
47
|
-
* 'location',
|
|
48
|
-
* 10,
|
|
49
|
-
* async (geohashPrefix) => {
|
|
50
|
-
* // DynamoDBから検索
|
|
51
|
-
* return await collection.find({ geohash: { $regex: `^${geohashPrefix}` } }).toArray();
|
|
52
|
-
* }
|
|
53
|
-
* );
|
|
54
|
-
* ```
|
|
55
62
|
*/
|
|
56
|
-
export async function executeNearSearch(nearQuery, fieldName, limit,
|
|
57
|
-
// クエリから緯度・経度を抽出
|
|
63
|
+
export async function executeNearSearch(nearQuery, fieldName, limit, searchShadows, readBodies, config = DEFAULT_GEOHASH_CONFIG) {
|
|
58
64
|
const { latitude, longitude } = extractCoordinatesFromNearQuery(nearQuery);
|
|
59
65
|
const maxDistance = extractMaxDistanceFromNearQuery(nearQuery);
|
|
60
66
|
const minDistance = extractMinDistanceFromNearQuery(nearQuery);
|
|
67
|
+
const epsilon = shadowPositionError(config.shadowPrecision);
|
|
61
68
|
let precision = config.searchPrecision;
|
|
62
|
-
let allCandidates = [];
|
|
63
69
|
let iterations = 0;
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
70
|
+
let exhaustive = false;
|
|
71
|
+
/** id → 近似の距離 d̃ */
|
|
72
|
+
let approx = new Map();
|
|
73
|
+
/** 上位 limit 件を確定できた d̃ₖ(確定できなければ undefined) */
|
|
74
|
+
let kth;
|
|
75
|
+
while (precision >= config.minPrecision && iterations < config.maxIterations) {
|
|
68
76
|
iterations++;
|
|
69
|
-
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
// 重複を除外して追加
|
|
78
|
-
for (const candidate of candidates) {
|
|
79
|
-
if (!allCandidates.some((c) => c.id === candidate.id)) {
|
|
80
|
-
allCandidates.push(candidate);
|
|
81
|
-
}
|
|
77
|
+
const radius = guaranteedRadius(precision, latitude);
|
|
78
|
+
const neighbors = getNeighborGeoHashes(encodeGeoHash(latitude, longitude, precision));
|
|
79
|
+
const hits = (await Promise.all(neighbors.map((prefix) => searchShadows(prefix)))).flat();
|
|
80
|
+
// 精度を下げた回は、前の回の範囲を含むので、作り直す
|
|
81
|
+
approx = new Map();
|
|
82
|
+
for (const hit of hits) {
|
|
83
|
+
const center = decodeGeoHash(hit.geohash);
|
|
84
|
+
approx.set(hit.id, calculateDistance(latitude, longitude, center.latitude, center.longitude));
|
|
82
85
|
}
|
|
83
|
-
// maxDistance
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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
|
-
}
|
|
86
|
+
// 結果になることが確かな候補(真の距離が minDistance 以上・maxDistance 以下)の中で、k 番目に近いもの
|
|
87
|
+
const sure = [...approx.values()]
|
|
88
|
+
.filter((d) => (minDistance === undefined || d - epsilon >= minDistance) &&
|
|
89
|
+
(maxDistance === undefined || d + epsilon <= maxDistance))
|
|
90
|
+
.sort((a, b) => a - b);
|
|
91
|
+
kth = kthOf(sure, limit);
|
|
92
|
+
const topKConfirmed = kth !== undefined && kth + epsilon <= radius;
|
|
93
|
+
const circleCovered = maxDistance !== undefined && maxDistance + epsilon <= radius;
|
|
94
|
+
if (topKConfirmed || circleCovered) {
|
|
95
|
+
exhaustive = true;
|
|
96
|
+
break;
|
|
121
97
|
}
|
|
122
|
-
// 精度を1文字減らす(検索範囲を広げる)
|
|
123
98
|
precision--;
|
|
124
99
|
}
|
|
125
|
-
//
|
|
126
|
-
const
|
|
100
|
+
// 本体を読む候補: 近似の距離が d̃ₖ + 2ε 以内(確定した上位 limit 件の真の距離は、d̃ₖ + ε 以内)
|
|
101
|
+
const cutoff = kth !== undefined ? kth + 2 * epsilon : undefined;
|
|
102
|
+
const wanted = [...approx.entries()]
|
|
103
|
+
.filter(([, d]) => (cutoff === undefined || d <= cutoff) &&
|
|
104
|
+
(maxDistance === undefined || d <= maxDistance + epsilon) &&
|
|
105
|
+
(minDistance === undefined || d >= minDistance - epsilon))
|
|
106
|
+
.map(([id]) => id);
|
|
107
|
+
const bodies = wanted.length > 0 ? await readBodies(wanted) : [];
|
|
108
|
+
const documents = bodies
|
|
127
109
|
.map((doc) => {
|
|
128
|
-
// フィールドから地理座標を取得
|
|
129
110
|
const location = doc[fieldName];
|
|
130
|
-
// デバッグログ: locationフィールドの内容を確認
|
|
131
|
-
if (!location) {
|
|
132
|
-
console.log('[nearSearch] Location field not found:', {
|
|
133
|
-
fieldName,
|
|
134
|
-
docKeys: Object.keys(doc),
|
|
135
|
-
doc: JSON.stringify(doc).substring(0, 200),
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
111
|
if (!location ||
|
|
139
112
|
typeof location.latitude !== 'number' ||
|
|
140
113
|
typeof location.longitude !== 'number') {
|
|
141
114
|
return null;
|
|
142
115
|
}
|
|
143
|
-
// 距離計算
|
|
144
116
|
const distance = calculateDistance(latitude, longitude, location.latitude, location.longitude);
|
|
145
|
-
|
|
146
|
-
console.log('[nearSearch] Distance calculated:', {
|
|
147
|
-
docId: doc.id,
|
|
148
|
-
distance,
|
|
149
|
-
maxDistance,
|
|
150
|
-
minDistance,
|
|
151
|
-
willBeFiltered: (maxDistance !== undefined && distance > maxDistance) ||
|
|
152
|
-
(minDistance !== undefined && distance < minDistance),
|
|
153
|
-
});
|
|
154
|
-
// 距離フィルタリング
|
|
155
|
-
if (maxDistance !== undefined && distance > maxDistance) {
|
|
117
|
+
if (maxDistance !== undefined && distance > maxDistance)
|
|
156
118
|
return null;
|
|
157
|
-
|
|
158
|
-
if (minDistance !== undefined && distance < minDistance) {
|
|
119
|
+
if (minDistance !== undefined && distance < minDistance)
|
|
159
120
|
return null;
|
|
160
|
-
}
|
|
161
121
|
return {
|
|
162
122
|
...doc,
|
|
163
123
|
__distance: distance,
|
|
@@ -168,11 +128,13 @@ export async function executeNearSearch(nearQuery, fieldName, limit, searchFunct
|
|
|
168
128
|
.sort((a, b) => (a.__distance ?? 0) - (b.__distance ?? 0))
|
|
169
129
|
.slice(0, limit);
|
|
170
130
|
return {
|
|
171
|
-
documents
|
|
131
|
+
documents,
|
|
172
132
|
metadata: {
|
|
173
133
|
iterations,
|
|
174
|
-
candidatesFound:
|
|
134
|
+
candidatesFound: approx.size,
|
|
135
|
+
bodiesRead: wanted.length,
|
|
175
136
|
requestedLimit: limit,
|
|
137
|
+
exhaustive,
|
|
176
138
|
},
|
|
177
139
|
};
|
|
178
140
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nearSearch.js","sourceRoot":"","sources":["../../../src/server/query/nearSearch.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"nearSearch.js","sourceRoot":"","sources":["../../../src/server/query/nearSearch.ts"],"names":[],"mappings":"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"}
|
package/dist/server/types.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*
|
|
6
6
|
* NOTE: OpenAPI仕様から型を生成し、実装で使用しています。
|
|
7
7
|
*/
|
|
8
|
-
import type { ApiErrorResponse, ApiOperation, BulkOperationResult, DeleteOneResult, FilterOperators, FindManyReferenceParams, FindManyReferenceResult, FindParams, FindResult, ApiRequest as GeneratedApiRequest, ApiSuccessResponse as GeneratedApiSuccessResponse, DeleteManyParams as GeneratedDeleteManyParams, DeleteOneParams as GeneratedDeleteOneParams, FindManyParams as GeneratedFindManyParams, FindOneParams as GeneratedFindOneParams, UpdateManyParams as GeneratedUpdateManyParams, UpdateOneParams as GeneratedUpdateOneParams, InsertManyParams, InsertOneParams, InsertOneResult, OperationError, UpdateOneResult } from '../__generated__/models/index.js';
|
|
8
|
+
import type { ApiErrorResponse, ApiOperation, BulkOperationResult, CountParams, CountResult, DeleteOneResult, FilterOperators, FindManyReferenceParams, FindManyReferenceResult, FindParams, FindResult, ApiRequest as GeneratedApiRequest, ApiSuccessResponse as GeneratedApiSuccessResponse, DeleteManyParams as GeneratedDeleteManyParams, DeleteOneParams as GeneratedDeleteOneParams, FindManyParams as GeneratedFindManyParams, FindOneParams as GeneratedFindOneParams, UpdateManyParams as GeneratedUpdateManyParams, UpdateOneParams as GeneratedUpdateOneParams, InsertManyParams, InsertOneParams, InsertOneResult, OperationError, UpdateOneResult } from '../__generated__/models/index.js';
|
|
9
9
|
/**
|
|
10
10
|
* サーバー内部の追加条件(id 以外の条件)
|
|
11
11
|
*
|
|
@@ -33,6 +33,10 @@ export type ApiRequest<T = unknown> = Omit<GeneratedApiRequest, 'params'> & {
|
|
|
33
33
|
* find パラメータ
|
|
34
34
|
*/
|
|
35
35
|
export type { FindParams };
|
|
36
|
+
/**
|
|
37
|
+
* count パラメータ・レスポンスデータ
|
|
38
|
+
*/
|
|
39
|
+
export type { CountParams, CountResult };
|
|
36
40
|
/**
|
|
37
41
|
* findOne パラメータ
|
|
38
42
|
*/
|
|
@@ -155,6 +159,7 @@ export type ApiParamsMap = {
|
|
|
155
159
|
findOne: FindOneParams;
|
|
156
160
|
findMany: FindManyParams;
|
|
157
161
|
findManyReference: FindManyReferenceParams;
|
|
162
|
+
count: CountParams;
|
|
158
163
|
insertOne: InsertOneParams;
|
|
159
164
|
updateOne: UpdateOneParams;
|
|
160
165
|
updateMany: UpdateManyParams;
|
|
@@ -170,6 +175,7 @@ export type ApiDataMap = {
|
|
|
170
175
|
findOne: FindOneResult;
|
|
171
176
|
findMany: FindManyResult;
|
|
172
177
|
findManyReference: FindManyReferenceResult;
|
|
178
|
+
count: CountResult;
|
|
173
179
|
insertOne: InsertOneResult;
|
|
174
180
|
updateOne: UpdateOneResult;
|
|
175
181
|
updateMany: UpdateManyResult;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/server/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/server/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* *Many 操作の失敗(errors の要素)を、単体操作(*One)の AppError に直す
|
|
3
|
+
*
|
|
4
|
+
* 「対象が無い」は 404、競合は 409、リクエストの誤りは 400 にする。
|
|
5
|
+
* それ以外は 500(障害)のまま。
|
|
6
|
+
*/
|
|
7
|
+
import { AppError } from '../../shared/index.js';
|
|
8
|
+
export declare function toAppError(error: {
|
|
9
|
+
code?: string;
|
|
10
|
+
message?: string;
|
|
11
|
+
} | undefined, fallbackMessage: string): AppError;
|
|
12
|
+
//# sourceMappingURL=bulkError.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bulkError.d.ts","sourceRoot":"","sources":["../../../src/server/utils/bulkError.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,QAAQ,EAAa,MAAM,uBAAuB,CAAC;AAE5D,wBAAgB,UAAU,CACxB,KAAK,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,EACtD,eAAe,EAAE,MAAM,GACtB,QAAQ,CAYV"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* *Many 操作の失敗(errors の要素)を、単体操作(*One)の AppError に直す
|
|
3
|
+
*
|
|
4
|
+
* 「対象が無い」は 404、競合は 409、リクエストの誤りは 400 にする。
|
|
5
|
+
* それ以外は 500(障害)のまま。
|
|
6
|
+
*/
|
|
7
|
+
import { AppError, ErrorCode } from '../../shared/index.js';
|
|
8
|
+
export function toAppError(error, fallbackMessage) {
|
|
9
|
+
const message = error?.message ?? fallbackMessage;
|
|
10
|
+
switch (error?.code) {
|
|
11
|
+
case ErrorCode.VALIDATION_ERROR:
|
|
12
|
+
return new AppError(ErrorCode.VALIDATION_ERROR, message, 400);
|
|
13
|
+
case ErrorCode.ITEM_NOT_FOUND:
|
|
14
|
+
return new AppError(ErrorCode.ITEM_NOT_FOUND, message, 404);
|
|
15
|
+
case ErrorCode.VERSION_CONFLICT:
|
|
16
|
+
return new AppError(ErrorCode.VERSION_CONFLICT, message, 409);
|
|
17
|
+
default:
|
|
18
|
+
return new AppError(ErrorCode.INTERNAL_ERROR, message, 500);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=bulkError.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bulkError.js","sourceRoot":"","sources":["../../../src/server/utils/bulkError.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,UAAU,UAAU,CACxB,KAAsD,EACtD,eAAuB;IAEvB,MAAM,OAAO,GAAG,KAAK,EAAE,OAAO,IAAI,eAAe,CAAC;IAClD,QAAQ,KAAK,EAAE,IAAI,EAAE,CAAC;QACpB,KAAK,SAAS,CAAC,gBAAgB;YAC7B,OAAO,IAAI,QAAQ,CAAC,SAAS,CAAC,gBAAgB,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QAChE,KAAK,SAAS,CAAC,cAAc;YAC3B,OAAO,IAAI,QAAQ,CAAC,SAAS,CAAC,cAAc,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QAC9D,KAAK,SAAS,CAAC,gBAAgB;YAC7B,OAAO,IAAI,QAAQ,CAAC,SAAS,CAAC,gBAAgB,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QAChE;YACE,OAAO,IAAI,QAAQ,CAAC,SAAS,CAAC,cAAc,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IAChE,CAAC;AACH,CAAC"}
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 1 チャンク(1 トランザクション)の推定サイズの上限(バイト)
|
|
3
|
+
*
|
|
4
|
+
* DynamoDB のトランザクションは合計 4MB までなので、シャドーなどの余白を見て 3.5MB で分ける。
|
|
5
|
+
*/
|
|
6
|
+
export declare const CHUNK_MAX_BYTES: number;
|
|
1
7
|
/**
|
|
2
8
|
* チャンク分割結果
|
|
3
9
|
*/
|
|
@@ -15,6 +21,8 @@ export interface ChunkResult<T> {
|
|
|
15
21
|
*
|
|
16
22
|
* @param records - 処理対象のレコード配列
|
|
17
23
|
* @param getItemCount - 各レコードのアイテム数を計算する関数
|
|
24
|
+
* @param getByteSize - 各レコードの推定サイズ(バイト)を返す関数(既定は JSON の長さ)。
|
|
25
|
+
* 合計が {@link CHUNK_MAX_BYTES} を超えるときもチャンクを分ける(4MB の上限対策)
|
|
18
26
|
* @returns チャンク分割結果
|
|
19
27
|
* @throws {Error} 単一レコードが100アイテムを超える場合
|
|
20
28
|
*
|
|
@@ -34,7 +42,7 @@ export interface ChunkResult<T> {
|
|
|
34
42
|
* });
|
|
35
43
|
* ```
|
|
36
44
|
*/
|
|
37
|
-
export declare function calculateChunks<T>(records: T[], getItemCount: (record: T) => number): ChunkResult<T>;
|
|
45
|
+
export declare function calculateChunks<T>(records: T[], getItemCount: (record: T) => number, getByteSize?: (record: T) => number): ChunkResult<T>;
|
|
38
46
|
/**
|
|
39
47
|
* チャンク実行結果
|
|
40
48
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunking.d.ts","sourceRoot":"","sources":["../../../src/server/utils/chunking.ts"],"names":[],"mappings":"AAaA;;GAEG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,8BAA8B;IAC9B,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;IACd,kBAAkB;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED
|
|
1
|
+
{"version":3,"file":"chunking.d.ts","sourceRoot":"","sources":["../../../src/server/utils/chunking.ts"],"names":[],"mappings":"AAaA;;;;GAIG;AACH,eAAO,MAAM,eAAe,QAAoB,CAAC;AAOjD;;GAEG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,8BAA8B;IAC9B,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;IACd,kBAAkB;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAC/B,OAAO,EAAE,CAAC,EAAE,EACZ,YAAY,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,EACnC,WAAW,GAAE,CAAC,MAAM,EAAE,CAAC,KAAK,MAA4B,GACvD,WAAW,CAAC,CAAC,CAAC,CA6DhB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB,CAAC,CAAC;IACrC,eAAe;IACf,cAAc,EAAE,CAAC,EAAE,CAAC;IACpB,kBAAkB;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY;IACZ,MAAM,EAAE,UAAU,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,aAAa;IACb,EAAE,EAAE,MAAM,CAAC;IACX,aAAa;IACb,IAAI,EAAE,MAAM,CAAC;IACb,eAAe;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,aAAa,CAAC,CAAC,EACnC,MAAM,EAAE,CAAC,EAAE,EAAE,EACb,YAAY,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC,EAAE,CAAC,EAC1C,WAAW,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,GACjC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CA8FlC"}
|
|
@@ -9,6 +9,16 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { DYNAMODB_TRANSACT_WRITE_MAX_ITEMS, createLogger } from '../../shared/index.js';
|
|
11
11
|
const logger = createLogger({ service: 'records-lambda' });
|
|
12
|
+
/**
|
|
13
|
+
* 1 チャンク(1 トランザクション)の推定サイズの上限(バイト)
|
|
14
|
+
*
|
|
15
|
+
* DynamoDB のトランザクションは合計 4MB までなので、シャドーなどの余白を見て 3.5MB で分ける。
|
|
16
|
+
*/
|
|
17
|
+
export const CHUNK_MAX_BYTES = 3.5 * 1024 * 1024;
|
|
18
|
+
/** レコードの推定サイズ(JSON の長さ。メインレコードの大きさが支配的なので近似として使う) */
|
|
19
|
+
function estimateRecordBytes(record) {
|
|
20
|
+
return Buffer.byteLength(JSON.stringify(record) ?? '', 'utf8');
|
|
21
|
+
}
|
|
12
22
|
/**
|
|
13
23
|
* バルク操作のチャンクサイズを動的に計算する
|
|
14
24
|
*
|
|
@@ -17,6 +27,8 @@ const logger = createLogger({ service: 'records-lambda' });
|
|
|
17
27
|
*
|
|
18
28
|
* @param records - 処理対象のレコード配列
|
|
19
29
|
* @param getItemCount - 各レコードのアイテム数を計算する関数
|
|
30
|
+
* @param getByteSize - 各レコードの推定サイズ(バイト)を返す関数(既定は JSON の長さ)。
|
|
31
|
+
* 合計が {@link CHUNK_MAX_BYTES} を超えるときもチャンクを分ける(4MB の上限対策)
|
|
20
32
|
* @returns チャンク分割結果
|
|
21
33
|
* @throws {Error} 単一レコードが100アイテムを超える場合
|
|
22
34
|
*
|
|
@@ -36,13 +48,15 @@ const logger = createLogger({ service: 'records-lambda' });
|
|
|
36
48
|
* });
|
|
37
49
|
* ```
|
|
38
50
|
*/
|
|
39
|
-
export function calculateChunks(records, getItemCount) {
|
|
51
|
+
export function calculateChunks(records, getItemCount, getByteSize = estimateRecordBytes) {
|
|
40
52
|
const chunks = [];
|
|
41
53
|
const itemCounts = [];
|
|
42
54
|
let currentChunk = [];
|
|
43
55
|
let currentItemCount = 0;
|
|
56
|
+
let currentBytes = 0;
|
|
44
57
|
for (const record of records) {
|
|
45
58
|
const itemCount = getItemCount(record);
|
|
59
|
+
const bytes = getByteSize(record);
|
|
46
60
|
// 単一レコードがDynamoDB制限を超える場合はエラー
|
|
47
61
|
if (itemCount > DYNAMODB_TRANSACT_WRITE_MAX_ITEMS) {
|
|
48
62
|
const errorMsg = `Single record exceeds ${DYNAMODB_TRANSACT_WRITE_MAX_ITEMS} items limit: ${itemCount} items`;
|
|
@@ -52,18 +66,21 @@ export function calculateChunks(records, getItemCount) {
|
|
|
52
66
|
});
|
|
53
67
|
throw new Error(errorMsg);
|
|
54
68
|
}
|
|
55
|
-
// 現在のチャンクに追加するとDynamoDB
|
|
56
|
-
if (currentItemCount + itemCount > DYNAMODB_TRANSACT_WRITE_MAX_ITEMS
|
|
69
|
+
// 現在のチャンクに追加するとDynamoDB制限(アイテム数・サイズ)を超える場合、新しいチャンクを開始
|
|
70
|
+
if (currentItemCount + itemCount > DYNAMODB_TRANSACT_WRITE_MAX_ITEMS ||
|
|
71
|
+
currentBytes + bytes > CHUNK_MAX_BYTES) {
|
|
57
72
|
if (currentChunk.length > 0) {
|
|
58
73
|
chunks.push(currentChunk);
|
|
59
74
|
itemCounts.push(currentItemCount);
|
|
60
75
|
}
|
|
61
76
|
currentChunk = [record];
|
|
62
77
|
currentItemCount = itemCount;
|
|
78
|
+
currentBytes = bytes;
|
|
63
79
|
}
|
|
64
80
|
else {
|
|
65
81
|
currentChunk.push(record);
|
|
66
82
|
currentItemCount += itemCount;
|
|
83
|
+
currentBytes += bytes;
|
|
67
84
|
}
|
|
68
85
|
}
|
|
69
86
|
// 最後のチャンクを追加
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunking.js","sourceRoot":"","sources":["../../../src/server/utils/chunking.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,iCAAiC,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAExF,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"chunking.js","sourceRoot":"","sources":["../../../src/server/utils/chunking.ts"],"names":[],"mappings":"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"}
|