dynoquery 0.1.10 → 0.1.13
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/README.md +129 -76
- package/dist/index-query.d.ts +8 -3
- package/dist/index-query.js +23 -18
- package/dist/partition.d.ts +8 -2
- package/dist/partition.js +20 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -11,119 +11,172 @@ npm install dynoquery
|
|
|
11
11
|
## Features
|
|
12
12
|
|
|
13
13
|
- Basic CRUD operations (create, get, update, delete)
|
|
14
|
-
- Optimized for **Single-Table Design**
|
|
15
|
-
-
|
|
14
|
+
- Optimized for **Single-Table Design** (Partitions and GSIs)
|
|
15
|
+
- Automatic result mapping to models
|
|
16
|
+
- Built-in caching for partition instances
|
|
16
17
|
- TypeScript support
|
|
17
18
|
|
|
18
|
-
## Usage
|
|
19
|
+
## Quick Start (Basic Usage)
|
|
20
|
+
|
|
21
|
+
First, initialize the client with your table name.
|
|
19
22
|
|
|
20
23
|
```typescript
|
|
21
24
|
import { DynoQuery } from 'dynoquery';
|
|
22
25
|
|
|
23
26
|
const db = new DynoQuery({
|
|
24
27
|
region: 'us-east-1',
|
|
25
|
-
tableName: 'MyTable'
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
tableName: 'MyTable'
|
|
29
|
+
});
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### 1. Working with Partitions (Models)
|
|
33
|
+
|
|
34
|
+
Define your models to handle different types of data within your single table.
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
const db = new DynoQuery({
|
|
38
|
+
region: 'us-east-1',
|
|
39
|
+
tableName: 'MyTable',
|
|
31
40
|
models: {
|
|
32
|
-
User: { pkPrefix: 'USER#' }, //
|
|
41
|
+
User: { pkPrefix: 'USER#' }, // Resulting PK: USER#<id>
|
|
42
|
+
Product: { pkPrefix: 'PROD#' }
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
async function userExample() {
|
|
47
|
+
const john = db.User('john@example.com');
|
|
48
|
+
|
|
49
|
+
// Create an item (SK: PROFILE)
|
|
50
|
+
await john.create('PROFILE', { name: 'John Doe', email: 'john@example.com' });
|
|
51
|
+
|
|
52
|
+
// Get an item (uses cache if already loaded)
|
|
53
|
+
const profile = await john.get('PROFILE');
|
|
54
|
+
console.log(profile.name); // 'John Doe'
|
|
55
|
+
|
|
56
|
+
// Update an item (partial update)
|
|
57
|
+
await john.update('PROFILE', { theme: 'dark' });
|
|
58
|
+
|
|
59
|
+
// Delete an item
|
|
60
|
+
await john.delete('PROFILE');
|
|
61
|
+
|
|
62
|
+
// Fetch all items in this partition
|
|
63
|
+
const allData = await john.getAll();
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### 2. Global Secondary Indexes (findBy)
|
|
68
|
+
|
|
69
|
+
Use `findBy` to query your GSIs easily.
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
const db = new DynoQuery({
|
|
73
|
+
region: 'us-east-1',
|
|
74
|
+
tableName: 'MyTable',
|
|
75
|
+
models: {
|
|
76
|
+
Product: { pkPrefix: 'PROD#' }
|
|
33
77
|
},
|
|
34
78
|
findBy: {
|
|
35
|
-
|
|
36
|
-
Category: { indexName: 'GSI1', pkPrefix: 'CAT#' } // pkName defaults to GSI1PK, skName defaults to GSI1SK
|
|
79
|
+
Category: { indexName: 'GSI1', pkPrefix: 'CAT#' }, // pkName defaults to GSI1PK, skName defaults to GSI1SK
|
|
37
80
|
}
|
|
38
81
|
});
|
|
39
82
|
|
|
40
|
-
async function
|
|
41
|
-
//
|
|
42
|
-
|
|
43
|
-
const john = db.User('john@example.com');
|
|
83
|
+
async function indexExample() {
|
|
84
|
+
// Query by Category PK: CAT#ELECTRONICS
|
|
85
|
+
const electronics = db.findByCategory('ELECTRONICS');
|
|
44
86
|
|
|
45
|
-
//
|
|
46
|
-
|
|
47
|
-
const categories = db.findByCategory('1');
|
|
48
|
-
const items = await categories.get('100');
|
|
49
|
-
const allItems = await categories.getAll();
|
|
87
|
+
// Get all items in this category
|
|
88
|
+
const items = await electronics.getAll();
|
|
50
89
|
|
|
51
|
-
//
|
|
90
|
+
// If results match a registered model prefix, they are automatically mapped
|
|
52
91
|
items.forEach(item => {
|
|
53
|
-
if (item.__model === '
|
|
54
|
-
|
|
55
|
-
// You can also get a Partition instance for this item
|
|
56
|
-
const userPartition = item.getPartition();
|
|
92
|
+
if (item.__model === 'Product') {
|
|
93
|
+
const productPartition = item.getPartition(); // Returns a Partition instance
|
|
57
94
|
}
|
|
58
95
|
});
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
const allJohnData = await john.getAll();
|
|
62
|
-
|
|
63
|
-
// john.get() loads data immediately (using cache if loaded)
|
|
64
|
-
const userMetadata = await john.get('METADATA');
|
|
65
|
-
console.log(userMetadata);
|
|
96
|
+
}
|
|
97
|
+
```
|
|
66
98
|
|
|
67
|
-
|
|
68
|
-
await john.create('PROFILE', { name: 'John Doe', email: 'john@example.com' });
|
|
69
|
-
|
|
70
|
-
// Resulting GSI1PK: TENANT#A#CAT#USER
|
|
71
|
-
const cat = db.findByCategory('USER', '1');
|
|
72
|
-
console.log(cat.getSkValue()); // '1'
|
|
73
|
-
await john.create('PROFILE', {
|
|
74
|
-
name: 'John Doe',
|
|
75
|
-
email: 'john@example.com',
|
|
76
|
-
GSI1PK: cat.getPkValue(),
|
|
77
|
-
GSI1SK: cat.getSkValue()
|
|
78
|
-
});
|
|
99
|
+
### 3. Creating Items with GSI Support
|
|
79
100
|
|
|
80
|
-
|
|
81
|
-
await john.update('PROFILE', { theme: 'dark' });
|
|
101
|
+
You can pass index queries directly to `create()` to automatically populate GSI attributes.
|
|
82
102
|
|
|
83
|
-
|
|
84
|
-
|
|
103
|
+
```typescript
|
|
104
|
+
const electronics = db.findByCategory('ELECTRONICS', 'RANK#1');
|
|
85
105
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
106
|
+
// This will automatically set GSI1PK='CAT#ELECTRONICS' and GSI1SK='RANK#1'
|
|
107
|
+
await db.Product('p123').create('INFO', {
|
|
108
|
+
name: 'Gaming Mouse',
|
|
109
|
+
price: 50
|
|
110
|
+
}, [electronics]);
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Optional Configuration Parameters
|
|
114
|
+
|
|
115
|
+
| Parameter | Type | Default | Description |
|
|
116
|
+
| :--- | :--- | :--- | :--- |
|
|
117
|
+
| `pkName` | `string` | `'PK'` | Custom attribute name for Partition Key. |
|
|
118
|
+
| `skName` | `string` | `'SK'` | Custom attribute name for Sort Key. |
|
|
119
|
+
| `pkPrefix` | `string` | `''` | Global prefix for all partitions (useful for multitenancy, e.g., `TENANT#A#`). |
|
|
120
|
+
| `endpoint` | `string` | - | Optional endpoint for local development (e.g., `http://localhost:8000`). |
|
|
121
|
+
| `credentials` | `object` | - | Custom AWS credentials (`{ accessKeyId, secretAccessKey, sessionToken? }`). |
|
|
122
|
+
|
|
123
|
+
### Example with Optional Parameters
|
|
124
|
+
|
|
125
|
+
```typescript
|
|
126
|
+
const db = new DynoQuery({
|
|
127
|
+
region: 'us-east-1',
|
|
128
|
+
tableName: 'MyTable',
|
|
129
|
+
pkName: 'PartitionKey', // Custom PK name
|
|
130
|
+
skName: 'SortKey', // Custom SK name
|
|
131
|
+
pkPrefix: 'TENANT#A#', // Global prefix for multitenancy
|
|
132
|
+
endpoint: 'http://localhost:8000', // For local DynamoDB
|
|
133
|
+
credentials: {
|
|
134
|
+
accessKeyId: 'MY_ACCESS_KEY',
|
|
135
|
+
secretAccessKey: 'MY_SECRET_KEY'
|
|
91
136
|
}
|
|
137
|
+
});
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Advanced Usage
|
|
141
|
+
|
|
142
|
+
### Pagination
|
|
143
|
+
|
|
144
|
+
Both `Partition.getAll()` and `IndexQuery.getAll()` support pagination.
|
|
145
|
+
|
|
146
|
+
```typescript
|
|
147
|
+
const index = db.findByCategory('ELECTRONICS');
|
|
148
|
+
const items = await index.getAll({ limit: 10 });
|
|
92
149
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
150
|
+
const token = index.getLastEvaluatedKey();
|
|
151
|
+
if (token) {
|
|
152
|
+
// Fetch next page
|
|
153
|
+
const nextItems = await index.getAll({ limit: 10, exclusiveStartKey: token });
|
|
96
154
|
}
|
|
97
155
|
```
|
|
98
156
|
|
|
99
157
|
## API Reference
|
|
100
158
|
|
|
101
159
|
### DynoQuery
|
|
102
|
-
|
|
103
|
-
- `
|
|
104
|
-
- `
|
|
105
|
-
- `
|
|
106
|
-
- `
|
|
107
|
-
- `
|
|
108
|
-
- `scan(params)`: Scan items.
|
|
160
|
+
- `create(params)`: Low-level PutCommand wrapper.
|
|
161
|
+
- `get(params)`: Low-level GetCommand wrapper.
|
|
162
|
+
- `update(params)`: Low-level UpdateCommand wrapper.
|
|
163
|
+
- `delete(params)`: Low-level DeleteCommand wrapper.
|
|
164
|
+
- `query(params)`: Low-level QueryCommand wrapper.
|
|
165
|
+
- `scan(params)`: Low-level ScanCommand wrapper.
|
|
109
166
|
|
|
110
167
|
### Partition
|
|
111
|
-
|
|
112
|
-
- `
|
|
113
|
-
- `
|
|
114
|
-
- `
|
|
115
|
-
- `create(sk, data)`: Creates an item in the partition.
|
|
116
|
-
- `update(sk, data)`: Updates an existing item (partial update).
|
|
168
|
+
- `get(sk)`: Fetches data for a specific SK (returns a Promise).
|
|
169
|
+
- `getAll(options?)`: Fetches items in the partition. Options: `{ limit, exclusiveStartKey }`.
|
|
170
|
+
- `create(sk, data, indices?)`: Creates an item. `indices` is an array of `IndexQuery` for GSI population.
|
|
171
|
+
- `update(sk, data)`: Partial update of an item.
|
|
117
172
|
- `delete(sk)`: Deletes an item.
|
|
118
173
|
- `deleteAll()`: Deletes all items in the partition.
|
|
174
|
+
- `getLastEvaluatedKey()`: Returns the pagination token from the last `getAll()`.
|
|
119
175
|
|
|
120
176
|
### IndexQuery
|
|
121
|
-
|
|
122
|
-
- `
|
|
123
|
-
- `
|
|
124
|
-
- `get(skValue | options)`: Query items in the index. Supports `skValue` (string) for `begins_with` search, or an options object with `skValue`, `limit`, and `scanIndexForward`. If `skValue` was provided when the `IndexQuery` was created, it will be used as the default if no `skValue` is passed here.
|
|
125
|
-
- `getAll()`: Fetches all items in the index for the given partition key. If `skValue` was provided when the `IndexQuery` was created, it will filter by it using `begins_with`.
|
|
126
|
-
- Automatically identifies the model name in results using `__model` (based on registered models) and provides `getPartition()` helper.
|
|
177
|
+
- `get(skValue?)`: Get a single item from the index.
|
|
178
|
+
- `getAll(options?)`: Query index. Options: `{ limit, scanIndexForward, exclusiveStartKey, skValue }`.
|
|
179
|
+
- `getLastEvaluatedKey()`: Returns the pagination token from the last `getAll()`.
|
|
127
180
|
|
|
128
181
|
## License
|
|
129
182
|
|
package/dist/index-query.d.ts
CHANGED
|
@@ -16,14 +16,19 @@ export declare class IndexQuery {
|
|
|
16
16
|
protected skName: string;
|
|
17
17
|
protected pkValue: string;
|
|
18
18
|
protected skValue?: string;
|
|
19
|
+
protected lastEvaluatedKey: any;
|
|
19
20
|
constructor(db: DynoQuery, config: IndexQueryConfig);
|
|
20
|
-
|
|
21
|
-
skValue?: string;
|
|
21
|
+
getAll<T = any>(options?: {
|
|
22
22
|
limit?: number;
|
|
23
23
|
scanIndexForward?: boolean;
|
|
24
|
+
exclusiveStartKey?: any;
|
|
25
|
+
skValue?: string;
|
|
24
26
|
}): Promise<T[]>;
|
|
25
|
-
|
|
27
|
+
get<T = any>(skValue?: string): Promise<T | null>;
|
|
26
28
|
getPkValue(): string;
|
|
29
|
+
getPkName(): string;
|
|
30
|
+
getSkName(): string;
|
|
27
31
|
getSkValue(): string | undefined;
|
|
32
|
+
getLastEvaluatedKey(): any;
|
|
28
33
|
private mapItemToModel;
|
|
29
34
|
}
|
package/dist/index-query.js
CHANGED
|
@@ -13,6 +13,7 @@ exports.IndexQuery = void 0;
|
|
|
13
13
|
const partition_1 = require("./partition");
|
|
14
14
|
class IndexQuery {
|
|
15
15
|
constructor(db, config) {
|
|
16
|
+
this.lastEvaluatedKey = null;
|
|
16
17
|
this.db = db;
|
|
17
18
|
this.tableName = config.tableName || db.getTableName() || "";
|
|
18
19
|
this.indexName = config.indexName;
|
|
@@ -30,18 +31,9 @@ class IndexQuery {
|
|
|
30
31
|
throw new Error("TableName must be provided in IndexQueryConfig or DynoQueryConfig");
|
|
31
32
|
}
|
|
32
33
|
}
|
|
33
|
-
|
|
34
|
+
getAll(options) {
|
|
34
35
|
return __awaiter(this, void 0, void 0, function* () {
|
|
35
|
-
|
|
36
|
-
if (typeof skValueOrOptions === 'string') {
|
|
37
|
-
options.skValue = skValueOrOptions;
|
|
38
|
-
}
|
|
39
|
-
else if (typeof skValueOrOptions === 'object') {
|
|
40
|
-
options = skValueOrOptions;
|
|
41
|
-
}
|
|
42
|
-
else if (this.skValue) {
|
|
43
|
-
options.skValue = this.skValue;
|
|
44
|
-
}
|
|
36
|
+
const finalSkValue = (options === null || options === void 0 ? void 0 : options.skValue) || this.skValue;
|
|
45
37
|
let keyCondition = "#pk = :pk";
|
|
46
38
|
const expressionAttributeNames = {
|
|
47
39
|
"#pk": this.pkName,
|
|
@@ -49,10 +41,10 @@ class IndexQuery {
|
|
|
49
41
|
const expressionAttributeValues = {
|
|
50
42
|
":pk": this.pkValue,
|
|
51
43
|
};
|
|
52
|
-
if (
|
|
44
|
+
if (finalSkValue) {
|
|
53
45
|
keyCondition += " AND begins_with(#sk, :sk)";
|
|
54
46
|
expressionAttributeNames["#sk"] = this.skName;
|
|
55
|
-
expressionAttributeValues[":sk"] =
|
|
47
|
+
expressionAttributeValues[":sk"] = finalSkValue;
|
|
56
48
|
}
|
|
57
49
|
const response = yield this.db.query({
|
|
58
50
|
TableName: this.tableName,
|
|
@@ -60,24 +52,37 @@ class IndexQuery {
|
|
|
60
52
|
KeyConditionExpression: keyCondition,
|
|
61
53
|
ExpressionAttributeNames: expressionAttributeNames,
|
|
62
54
|
ExpressionAttributeValues: expressionAttributeValues,
|
|
63
|
-
Limit: options.limit,
|
|
64
|
-
ScanIndexForward: options.scanIndexForward,
|
|
55
|
+
Limit: options === null || options === void 0 ? void 0 : options.limit,
|
|
56
|
+
ScanIndexForward: options === null || options === void 0 ? void 0 : options.scanIndexForward,
|
|
57
|
+
ExclusiveStartKey: options === null || options === void 0 ? void 0 : options.exclusiveStartKey,
|
|
65
58
|
});
|
|
66
59
|
const items = (response.Items || []);
|
|
67
|
-
|
|
60
|
+
const mappedItems = items.map(item => this.mapItemToModel(item));
|
|
61
|
+
this.lastEvaluatedKey = response.LastEvaluatedKey || null;
|
|
62
|
+
return mappedItems;
|
|
68
63
|
});
|
|
69
64
|
}
|
|
70
|
-
|
|
65
|
+
get(skValue) {
|
|
71
66
|
return __awaiter(this, void 0, void 0, function* () {
|
|
72
|
-
|
|
67
|
+
const items = yield this.getAll({ limit: 1, skValue });
|
|
68
|
+
return items.length > 0 ? items[0] : null;
|
|
73
69
|
});
|
|
74
70
|
}
|
|
75
71
|
getPkValue() {
|
|
76
72
|
return this.pkValue;
|
|
77
73
|
}
|
|
74
|
+
getPkName() {
|
|
75
|
+
return this.pkName;
|
|
76
|
+
}
|
|
77
|
+
getSkName() {
|
|
78
|
+
return this.skName;
|
|
79
|
+
}
|
|
78
80
|
getSkValue() {
|
|
79
81
|
return this.skValue;
|
|
80
82
|
}
|
|
83
|
+
getLastEvaluatedKey() {
|
|
84
|
+
return this.lastEvaluatedKey;
|
|
85
|
+
}
|
|
81
86
|
mapItemToModel(item) {
|
|
82
87
|
const pkName = this.db.getPkName();
|
|
83
88
|
const pkValue = item[pkName];
|
package/dist/partition.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { DynoQuery } from "./index";
|
|
2
|
+
import { IndexQuery } from "./index-query";
|
|
2
3
|
export interface PartitionConfig {
|
|
3
4
|
tableName?: string;
|
|
4
5
|
pk?: string;
|
|
@@ -12,16 +13,20 @@ export declare class Partition {
|
|
|
12
13
|
protected skName: string;
|
|
13
14
|
protected cache: Record<string, any>;
|
|
14
15
|
protected isLoaded: boolean;
|
|
16
|
+
protected lastEvaluatedKey: any;
|
|
15
17
|
constructor(db: DynoQuery, config: PartitionConfig, id?: string);
|
|
16
18
|
/**
|
|
17
19
|
* Fetches all items in the partition and caches them.
|
|
18
20
|
* Returns the data and caches it.
|
|
19
21
|
*/
|
|
20
|
-
getAll<T = any>(
|
|
22
|
+
getAll<T = any>(options?: {
|
|
23
|
+
limit?: number;
|
|
24
|
+
exclusiveStartKey?: any;
|
|
25
|
+
}): Promise<T[]>;
|
|
21
26
|
/**
|
|
22
27
|
* Create an item in this partition.
|
|
23
28
|
*/
|
|
24
|
-
create<T = any>(sk: string, data: T): Promise<void>;
|
|
29
|
+
create<T = any>(sk: string, data: T, indices?: IndexQuery[]): Promise<void>;
|
|
25
30
|
/**
|
|
26
31
|
* Update an existing item in this partition.
|
|
27
32
|
*/
|
|
@@ -37,6 +42,7 @@ export declare class Partition {
|
|
|
37
42
|
*/
|
|
38
43
|
get<T = any>(sk: string): Promise<T | null>;
|
|
39
44
|
getPkValue(): string;
|
|
45
|
+
getLastEvaluatedKey(): any;
|
|
40
46
|
/**
|
|
41
47
|
* Delete all data in this partition.
|
|
42
48
|
*/
|
package/dist/partition.js
CHANGED
|
@@ -14,6 +14,7 @@ class Partition {
|
|
|
14
14
|
constructor(db, config, id) {
|
|
15
15
|
this.cache = {};
|
|
16
16
|
this.isLoaded = false;
|
|
17
|
+
this.lastEvaluatedKey = null;
|
|
17
18
|
this.db = db;
|
|
18
19
|
this.tableName = config.tableName || db.getTableName();
|
|
19
20
|
this.pkName = db.getPkName();
|
|
@@ -54,7 +55,7 @@ class Partition {
|
|
|
54
55
|
* Fetches all items in the partition and caches them.
|
|
55
56
|
* Returns the data and caches it.
|
|
56
57
|
*/
|
|
57
|
-
getAll() {
|
|
58
|
+
getAll(options) {
|
|
58
59
|
return __awaiter(this, void 0, void 0, function* () {
|
|
59
60
|
const response = yield this.db.query({
|
|
60
61
|
TableName: this.tableName,
|
|
@@ -65,6 +66,8 @@ class Partition {
|
|
|
65
66
|
ExpressionAttributeValues: {
|
|
66
67
|
":pk": this.pkValue,
|
|
67
68
|
},
|
|
69
|
+
Limit: options === null || options === void 0 ? void 0 : options.limit,
|
|
70
|
+
ExclusiveStartKey: options === null || options === void 0 ? void 0 : options.exclusiveStartKey,
|
|
68
71
|
});
|
|
69
72
|
const items = (response.Items || []);
|
|
70
73
|
items.forEach((item) => {
|
|
@@ -72,16 +75,27 @@ class Partition {
|
|
|
72
75
|
this.cache[item[this.skName]] = item;
|
|
73
76
|
}
|
|
74
77
|
});
|
|
75
|
-
|
|
78
|
+
if (!(options === null || options === void 0 ? void 0 : options.exclusiveStartKey) && !response.LastEvaluatedKey) {
|
|
79
|
+
this.isLoaded = true;
|
|
80
|
+
}
|
|
81
|
+
this.lastEvaluatedKey = response.LastEvaluatedKey || null;
|
|
76
82
|
return items;
|
|
77
83
|
});
|
|
78
84
|
}
|
|
79
85
|
/**
|
|
80
86
|
* Create an item in this partition.
|
|
81
87
|
*/
|
|
82
|
-
create(sk, data) {
|
|
88
|
+
create(sk, data, indices) {
|
|
83
89
|
return __awaiter(this, void 0, void 0, function* () {
|
|
84
90
|
const item = Object.assign({ [this.pkName]: this.pkValue, [this.skName]: sk }, data);
|
|
91
|
+
if (indices) {
|
|
92
|
+
indices.forEach((index) => {
|
|
93
|
+
item[index.getPkName()] = index.getPkValue();
|
|
94
|
+
if (index.getSkValue() !== undefined) {
|
|
95
|
+
item[index.getSkName()] = index.getSkValue();
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
85
99
|
yield this.db.create({
|
|
86
100
|
TableName: this.tableName,
|
|
87
101
|
Item: item,
|
|
@@ -144,6 +158,9 @@ class Partition {
|
|
|
144
158
|
getPkValue() {
|
|
145
159
|
return this.pkValue;
|
|
146
160
|
}
|
|
161
|
+
getLastEvaluatedKey() {
|
|
162
|
+
return this.lastEvaluatedKey;
|
|
163
|
+
}
|
|
147
164
|
/**
|
|
148
165
|
* Delete all data in this partition.
|
|
149
166
|
*/
|