@ceramicnetwork/indexing 1.1.0-rc.0
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 +31 -0
- package/lib/__tests__/chunks.util.d.ts +2 -0
- package/lib/__tests__/chunks.util.d.ts.map +1 -0
- package/lib/__tests__/chunks.util.js +8 -0
- package/lib/__tests__/chunks.util.js.map +1 -0
- package/lib/__tests__/read-csv-fixture.util.d.ts +5 -0
- package/lib/__tests__/read-csv-fixture.util.d.ts.map +1 -0
- package/lib/__tests__/read-csv-fixture.util.js +35 -0
- package/lib/__tests__/read-csv-fixture.util.js.map +1 -0
- package/lib/as-table-name.util.d.ts +3 -0
- package/lib/as-table-name.util.d.ts.map +1 -0
- package/lib/as-table-name.util.js +4 -0
- package/lib/as-table-name.util.js.map +1 -0
- package/lib/build-indexing.d.ts +13 -0
- package/lib/build-indexing.d.ts.map +1 -0
- package/lib/build-indexing.js +55 -0
- package/lib/build-indexing.js.map +1 -0
- package/lib/column-name.util.d.ts +2 -0
- package/lib/column-name.util.d.ts.map +1 -0
- package/lib/column-name.util.js +5 -0
- package/lib/column-name.util.js.map +1 -0
- package/lib/config.d.ts +2 -0
- package/lib/config.d.ts.map +1 -0
- package/lib/config.js +2 -0
- package/lib/config.js.map +1 -0
- package/lib/database-index-api.d.ts +94 -0
- package/lib/database-index-api.d.ts.map +1 -0
- package/lib/database-index-api.js +228 -0
- package/lib/database-index-api.js.map +1 -0
- package/lib/history-sync/interfaces.d.ts +52 -0
- package/lib/history-sync/interfaces.d.ts.map +1 -0
- package/lib/history-sync/interfaces.js +11 -0
- package/lib/history-sync/interfaces.js.map +1 -0
- package/lib/history-sync/sync-api.d.ts +82 -0
- package/lib/history-sync/sync-api.d.ts.map +1 -0
- package/lib/history-sync/sync-api.js +276 -0
- package/lib/history-sync/sync-api.js.map +1 -0
- package/lib/history-sync/utils.d.ts +15 -0
- package/lib/history-sync/utils.d.ts.map +1 -0
- package/lib/history-sync/utils.js +23 -0
- package/lib/history-sync/utils.js.map +1 -0
- package/lib/history-sync/workers/rebuild-anchor.d.ts +15 -0
- package/lib/history-sync/workers/rebuild-anchor.d.ts.map +1 -0
- package/lib/history-sync/workers/rebuild-anchor.js +96 -0
- package/lib/history-sync/workers/rebuild-anchor.js.map +1 -0
- package/lib/history-sync/workers/sync.d.ts +24 -0
- package/lib/history-sync/workers/sync.d.ts.map +1 -0
- package/lib/history-sync/workers/sync.js +77 -0
- package/lib/history-sync/workers/sync.js.map +1 -0
- package/lib/index-query-not-available.error.d.ts +5 -0
- package/lib/index-query-not-available.error.d.ts.map +1 -0
- package/lib/index-query-not-available.error.js +6 -0
- package/lib/index-query-not-available.error.js.map +1 -0
- package/lib/index.d.ts +7 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +6 -0
- package/lib/index.js.map +1 -0
- package/lib/insertion-order.d.ts +15 -0
- package/lib/insertion-order.d.ts.map +1 -0
- package/lib/insertion-order.js +180 -0
- package/lib/insertion-order.js.map +1 -0
- package/lib/local-index-api.d.ts +30 -0
- package/lib/local-index-api.d.ts.map +1 -0
- package/lib/local-index-api.js +118 -0
- package/lib/local-index-api.js.map +1 -0
- package/lib/make-index-api.d.ts +9 -0
- package/lib/make-index-api.d.ts.map +1 -0
- package/lib/make-index-api.js +27 -0
- package/lib/make-index-api.js.map +1 -0
- package/lib/migrations/1-create-model-table.d.ts +34 -0
- package/lib/migrations/1-create-model-table.d.ts.map +1 -0
- package/lib/migrations/1-create-model-table.js +243 -0
- package/lib/migrations/1-create-model-table.js.map +1 -0
- package/lib/migrations/cdb-schema-verification.d.ts +15 -0
- package/lib/migrations/cdb-schema-verification.d.ts.map +1 -0
- package/lib/migrations/cdb-schema-verification.js +272 -0
- package/lib/migrations/cdb-schema-verification.js.map +1 -0
- package/lib/parse-pagination.d.ts +18 -0
- package/lib/parse-pagination.d.ts.map +1 -0
- package/lib/parse-pagination.js +23 -0
- package/lib/parse-pagination.js.map +1 -0
- package/lib/query-filter-converter.d.ts +12 -0
- package/lib/query-filter-converter.d.ts.map +1 -0
- package/lib/query-filter-converter.js +231 -0
- package/lib/query-filter-converter.js.map +1 -0
- package/lib/query-filter-parser.d.ts +63 -0
- package/lib/query-filter-parser.d.ts.map +1 -0
- package/lib/query-filter-parser.js +178 -0
- package/lib/query-filter-parser.js.map +1 -0
- package/lib/tables-manager.d.ts +44 -0
- package/lib/tables-manager.d.ts.map +1 -0
- package/lib/tables-manager.js +218 -0
- package/lib/tables-manager.js.map +1 -0
- package/lib/unsupported-ordering-error.d.ts +4 -0
- package/lib/unsupported-ordering-error.d.ts.map +1 -0
- package/lib/unsupported-ordering-error.js +6 -0
- package/lib/unsupported-ordering-error.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { createBlocksProofsLoader } from '@ceramicnetwork/anchor-listener';
|
|
2
|
+
import { concatMap, lastValueFrom, of, catchError } from 'rxjs';
|
|
3
|
+
import { createRebuildAnchorJob } from './rebuild-anchor.js';
|
|
4
|
+
import { HISTORY_SYNC_JOB, CONTINUOUS_SYNC_JOB, } from '../interfaces.js';
|
|
5
|
+
const SYNC_JOB_OPTIONS = {
|
|
6
|
+
retryLimit: 5,
|
|
7
|
+
retryDelay: 60,
|
|
8
|
+
retryBackoff: true,
|
|
9
|
+
expireInHours: 12,
|
|
10
|
+
retentionDays: 3,
|
|
11
|
+
};
|
|
12
|
+
export function createContinuousSyncJob(data, options) {
|
|
13
|
+
return {
|
|
14
|
+
name: CONTINUOUS_SYNC_JOB,
|
|
15
|
+
data,
|
|
16
|
+
options: options || SYNC_JOB_OPTIONS,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export function createHistorySyncJob(data, options) {
|
|
20
|
+
return {
|
|
21
|
+
name: HISTORY_SYNC_JOB,
|
|
22
|
+
data,
|
|
23
|
+
options: options || SYNC_JOB_OPTIONS,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export class SyncWorker {
|
|
27
|
+
constructor(provider, jobQueue, chainId, logger, syncCompleteCallback) {
|
|
28
|
+
this.provider = provider;
|
|
29
|
+
this.jobQueue = jobQueue;
|
|
30
|
+
this.chainId = chainId;
|
|
31
|
+
this.logger = logger;
|
|
32
|
+
this.syncCompleteCallback = syncCompleteCallback;
|
|
33
|
+
}
|
|
34
|
+
async handler(job) {
|
|
35
|
+
const jobData = job.data;
|
|
36
|
+
const { jobType, fromBlock, toBlock, models } = jobData;
|
|
37
|
+
const currentBlock = jobData.currentBlock || fromBlock;
|
|
38
|
+
const blockProof$ = createBlocksProofsLoader({
|
|
39
|
+
provider: this.provider,
|
|
40
|
+
chainId: this.chainId,
|
|
41
|
+
fromBlock: currentBlock,
|
|
42
|
+
toBlock,
|
|
43
|
+
}).pipe(catchError((err) => {
|
|
44
|
+
this.logger.err(`Received error when retrieving block proofs for models ${models} from block ${currentBlock} to block ${toBlock}: ${err}`);
|
|
45
|
+
return of(null);
|
|
46
|
+
}), concatMap(async (blockProofs) => {
|
|
47
|
+
if (!blockProofs) {
|
|
48
|
+
throw Error('Error loading block proof');
|
|
49
|
+
}
|
|
50
|
+
const { proofs, blockNumber } = blockProofs;
|
|
51
|
+
if (proofs.length > 0) {
|
|
52
|
+
const jobs = proofs.map((proof) => createRebuildAnchorJob(proof, models));
|
|
53
|
+
await this.jobQueue.addJobs(jobs);
|
|
54
|
+
this.logger.debug(`Successfully created ${jobs.length} rebuild anchor commit jobs for block ${blockNumber}`);
|
|
55
|
+
}
|
|
56
|
+
await this.jobQueue.updateJob(job.id, {
|
|
57
|
+
fromBlock,
|
|
58
|
+
currentBlock: blockNumber + 1,
|
|
59
|
+
toBlock,
|
|
60
|
+
models,
|
|
61
|
+
jobType,
|
|
62
|
+
});
|
|
63
|
+
}));
|
|
64
|
+
await lastValueFrom(blockProof$).then(() => {
|
|
65
|
+
if (this.syncCompleteCallback) {
|
|
66
|
+
for (const model of models) {
|
|
67
|
+
this.syncCompleteCallback({
|
|
68
|
+
jobType: jobType,
|
|
69
|
+
modelId: model,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
this.logger.debug(`Sync completed for models ${models} from block ${fromBlock} to block ${toBlock}`);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/history-sync/workers/sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-query-not-available.error.d.ts","sourceRoot":"","sources":["../src/index-query-not-available.error.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAExD,qBAAa,2BAA4B,SAAQ,KAAK;gBACxC,KAAK,EAAE,QAAQ,GAAG,MAAM;CAKrC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export class IndexQueryNotAvailableError extends Error {
|
|
2
|
+
constructor(model) {
|
|
3
|
+
super(`Queries on Model ${model} are not currently available because historical data for that model is still syncing`);
|
|
4
|
+
}
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=index-query-not-available.error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-query-not-available.error.js","sourceRoot":"","sources":["../src/index-query-not-available.error.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,2BAA4B,SAAQ,KAAK;IACpD,YAAY,KAAwB;QAClC,KAAK,CACH,oBAAoB,KAAK,sFAAsF,CAChH,CAAA;IACH,CAAC;CACF"}
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type { IndexingConfig } from './build-indexing.js';
|
|
2
|
+
export { CONFIG_TABLE_NAME } from './config.js';
|
|
3
|
+
export { INDEXED_MODEL_CONFIG_TABLE_NAME } from './database-index-api.js';
|
|
4
|
+
export { BLOCK_CONFIRMATIONS, STATE_TABLE_NAME, SyncApi } from './history-sync/sync-api.js';
|
|
5
|
+
export { LocalIndexApi } from './local-index-api.js';
|
|
6
|
+
export { getDefaultCDBDatabaseConfig } from './migrations/1-create-model-table.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,+BAA+B,EAAE,MAAM,yBAAyB,CAAA;AACzE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAC3F,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAA"}
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { CONFIG_TABLE_NAME } from './config.js';
|
|
2
|
+
export { INDEXED_MODEL_CONFIG_TABLE_NAME } from './database-index-api.js';
|
|
3
|
+
export { BLOCK_CONFIRMATIONS, STATE_TABLE_NAME, SyncApi } from './history-sync/sync-api.js';
|
|
4
|
+
export { LocalIndexApi } from './local-index-api.js';
|
|
5
|
+
export { getDefaultCDBDatabaseConfig } from './migrations/1-create-model-table.js';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,+BAA+B,EAAE,MAAM,yBAAyB,CAAA;AACzE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAC3F,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type Knex } from 'knex';
|
|
2
|
+
import { StreamID } from '@ceramicnetwork/streamid';
|
|
3
|
+
import type { BaseQuery, Page, Pagination } from '@ceramicnetwork/common';
|
|
4
|
+
export declare class InsertionOrder {
|
|
5
|
+
private readonly dbConnection;
|
|
6
|
+
constructor(dbConnection: Knex);
|
|
7
|
+
page(query: BaseQuery & Pagination): Promise<Page<StreamID>>;
|
|
8
|
+
private forwardQuery;
|
|
9
|
+
private backwardQuery;
|
|
10
|
+
private query;
|
|
11
|
+
applyFilters(builder: Knex.QueryBuilder, query: BaseQuery): Knex.QueryBuilder;
|
|
12
|
+
private applyCursor;
|
|
13
|
+
private applySorting;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=insertion-order.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insertion-order.d.ts","sourceRoot":"","sources":["../src/insertion-order.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAA;AAEhC,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAsB,MAAM,wBAAwB,CAAA;AA0G7F,qBAAa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAAZ,YAAY,EAAE,IAAI;IAEzC,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAuDpD,YAAY;YAYZ,aAAa;IAY3B,OAAO,CAAC,KAAK;IAiBb,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC,YAAY;IAuB7E,OAAO,CAAC,WAAW;IA4BnB,OAAO,CAAC,YAAY;CAoBrB"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import * as uint8arrays from 'uint8arrays';
|
|
2
|
+
import { StreamID } from '@ceramicnetwork/streamid';
|
|
3
|
+
import { PaginationKind, parsePagination, } from './parse-pagination.js';
|
|
4
|
+
import { asTableName } from './as-table-name.util.js';
|
|
5
|
+
import { UnsupportedOrderingError } from './unsupported-ordering-error.js';
|
|
6
|
+
import { addColumnPrefix } from './column-name.util.js';
|
|
7
|
+
import { contentKey, convertQueryFilter, DATA_FIELD } from './query-filter-converter.js';
|
|
8
|
+
import { parseQueryFilters } from './query-filter-parser.js';
|
|
9
|
+
class Cursor {
|
|
10
|
+
static parse(cursor) {
|
|
11
|
+
return cursor
|
|
12
|
+
? JSON.parse(uint8arrays.toString(uint8arrays.fromString(cursor, 'base64url')))
|
|
13
|
+
: undefined;
|
|
14
|
+
}
|
|
15
|
+
static stringify(input, orderByKeys = []) {
|
|
16
|
+
if (input == null) {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
let cursor;
|
|
20
|
+
if (orderByKeys.length === 0) {
|
|
21
|
+
cursor = { type: 'timestamp', id: input.stream_id, value: input.created_at };
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
const content = typeof input.stream_content === 'string'
|
|
25
|
+
? JSON.parse(input.stream_content)
|
|
26
|
+
: input.stream_content;
|
|
27
|
+
cursor = { type: 'content', id: input.stream_id, value: {} };
|
|
28
|
+
for (const key of orderByKeys) {
|
|
29
|
+
if (content[key] != null) {
|
|
30
|
+
cursor.value[key] = content[key];
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return uint8arrays.toString(uint8arrays.fromString(JSON.stringify(cursor)), 'base64url');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const REVERSE_ORDER = {
|
|
38
|
+
ASC: 'DESC',
|
|
39
|
+
DESC: 'ASC',
|
|
40
|
+
};
|
|
41
|
+
function getComparisonSign(order = 'ASC', reverse = false) {
|
|
42
|
+
return order === 'ASC' ? (reverse ? '<' : '>') : reverse ? '>' : '<';
|
|
43
|
+
}
|
|
44
|
+
function reverseOrder(entries) {
|
|
45
|
+
return entries.map((entry) => ({ ...entry, order: REVERSE_ORDER[entry.order] }));
|
|
46
|
+
}
|
|
47
|
+
const INSERTION_ORDER = [{ column: 'created_at', order: 'ASC' }];
|
|
48
|
+
export class InsertionOrder {
|
|
49
|
+
constructor(dbConnection) {
|
|
50
|
+
this.dbConnection = dbConnection;
|
|
51
|
+
}
|
|
52
|
+
async page(query) {
|
|
53
|
+
const orderByKeys = Object.keys(query.sorting ?? {});
|
|
54
|
+
const pagination = parsePagination(query);
|
|
55
|
+
const paginationKind = pagination.kind;
|
|
56
|
+
switch (paginationKind) {
|
|
57
|
+
case PaginationKind.FORWARD: {
|
|
58
|
+
const limit = pagination.first;
|
|
59
|
+
const response = await this.forwardQuery(query, pagination);
|
|
60
|
+
const entries = response.slice(0, limit);
|
|
61
|
+
const firstEntry = entries[0];
|
|
62
|
+
const lastEntry = entries[entries.length - 1];
|
|
63
|
+
return {
|
|
64
|
+
edges: entries.map((row) => {
|
|
65
|
+
return {
|
|
66
|
+
cursor: Cursor.stringify(row, orderByKeys),
|
|
67
|
+
node: StreamID.fromString(row.stream_id),
|
|
68
|
+
};
|
|
69
|
+
}),
|
|
70
|
+
pageInfo: {
|
|
71
|
+
hasNextPage: response.length > limit,
|
|
72
|
+
hasPreviousPage: false,
|
|
73
|
+
endCursor: Cursor.stringify(lastEntry, orderByKeys),
|
|
74
|
+
startCursor: Cursor.stringify(firstEntry, orderByKeys),
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
case PaginationKind.BACKWARD: {
|
|
79
|
+
const limit = pagination.last;
|
|
80
|
+
const response = await this.backwardQuery(query, pagination);
|
|
81
|
+
const entries = response.slice(-limit);
|
|
82
|
+
const firstEntry = entries[0];
|
|
83
|
+
const lastEntry = entries[entries.length - 1];
|
|
84
|
+
return {
|
|
85
|
+
edges: entries.map((row) => {
|
|
86
|
+
return {
|
|
87
|
+
cursor: Cursor.stringify(row, orderByKeys),
|
|
88
|
+
node: StreamID.fromString(row.stream_id),
|
|
89
|
+
};
|
|
90
|
+
}),
|
|
91
|
+
pageInfo: {
|
|
92
|
+
hasNextPage: false,
|
|
93
|
+
hasPreviousPage: response.length > limit,
|
|
94
|
+
endCursor: Cursor.stringify(lastEntry, orderByKeys),
|
|
95
|
+
startCursor: Cursor.stringify(firstEntry, orderByKeys),
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
default:
|
|
100
|
+
throw new UnsupportedOrderingError(paginationKind);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
async forwardQuery(query, pagination) {
|
|
104
|
+
return await this.query(query, false, Cursor.parse(pagination.after)).limit(pagination.first + 1);
|
|
105
|
+
}
|
|
106
|
+
async backwardQuery(query, pagination) {
|
|
107
|
+
const response = await this.query(query, true, Cursor.parse(pagination.before)).limit(pagination.last + 1);
|
|
108
|
+
response.reverse();
|
|
109
|
+
return response;
|
|
110
|
+
}
|
|
111
|
+
query(query, isReverseOrder, cursor) {
|
|
112
|
+
let builder = this.dbConnection
|
|
113
|
+
.from(asTableName(query.model))
|
|
114
|
+
.columns(['stream_id', 'last_anchored_at', 'created_at', DATA_FIELD])
|
|
115
|
+
.select();
|
|
116
|
+
builder = this.applyFilters(builder, query);
|
|
117
|
+
const sorting = query.sorting ?? {};
|
|
118
|
+
if (cursor != null) {
|
|
119
|
+
builder = this.applyCursor(builder, cursor, isReverseOrder, sorting);
|
|
120
|
+
}
|
|
121
|
+
builder = this.applySorting(builder, isReverseOrder, sorting);
|
|
122
|
+
return builder;
|
|
123
|
+
}
|
|
124
|
+
applyFilters(builder, query) {
|
|
125
|
+
if (query.account) {
|
|
126
|
+
builder = builder.where({ controller_did: query.account });
|
|
127
|
+
}
|
|
128
|
+
if (query.queryFilters) {
|
|
129
|
+
const parsed = parseQueryFilters(query.queryFilters);
|
|
130
|
+
const converted = convertQueryFilter(parsed);
|
|
131
|
+
if (converted) {
|
|
132
|
+
builder = builder.where(converted.where);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
else if (query.filter) {
|
|
136
|
+
for (const [key, value] of Object.entries(query.filter)) {
|
|
137
|
+
const filterObj = {};
|
|
138
|
+
filterObj[addColumnPrefix(key)] = value;
|
|
139
|
+
builder = builder.andWhere(filterObj);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return builder;
|
|
143
|
+
}
|
|
144
|
+
applyCursor(builder, cursor, isReverseOrder, sorting) {
|
|
145
|
+
if (cursor.type === 'timestamp') {
|
|
146
|
+
builder = builder.where((qb) => {
|
|
147
|
+
qb.where('created_at', isReverseOrder ? '<' : '>', cursor.value)
|
|
148
|
+
.orWhere('created_at', '=', cursor.value)
|
|
149
|
+
.andWhere('stream_id', '>', cursor.id);
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
for (const [key, value] of Object.entries(cursor.value)) {
|
|
154
|
+
const field = contentKey(key);
|
|
155
|
+
const sign = getComparisonSign(sorting[key], isReverseOrder);
|
|
156
|
+
builder = builder.where((qb) => {
|
|
157
|
+
qb.whereRaw(`${field} ${sign} ?`, [value])
|
|
158
|
+
.orWhereRaw(`${field} = ?`, [value])
|
|
159
|
+
.andWhere('stream_id', '>', cursor.id);
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return builder;
|
|
164
|
+
}
|
|
165
|
+
applySorting(builder, isReverseOrder, sorting) {
|
|
166
|
+
const sortingEntries = Object.entries(sorting ?? {});
|
|
167
|
+
if (sortingEntries.length === 0) {
|
|
168
|
+
builder = builder.orderBy(isReverseOrder ? reverseOrder(INSERTION_ORDER) : INSERTION_ORDER);
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
for (const [field, order] of sortingEntries) {
|
|
172
|
+
const orderBy = isReverseOrder ? REVERSE_ORDER[order] : order;
|
|
173
|
+
builder = builder.orderByRaw(`${contentKey(field)} ${orderBy}`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
builder = builder.orderBy('stream_id', 'asc');
|
|
177
|
+
return builder;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=insertion-order.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insertion-order.js","sourceRoot":"","sources":["../src/insertion-order.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { BaseQuery, IndexApi, ModelData, Page, PaginationQuery, StreamState, DiagnosticsLogger, LoadOpts, Stream } from '@ceramicnetwork/common';
|
|
2
|
+
import type { IndexModelArgs } from './database-index-api.js';
|
|
3
|
+
import { IndexStreamArgs } from './database-index-api.js';
|
|
4
|
+
import { type CommitID, StreamID } from '@ceramicnetwork/streamid';
|
|
5
|
+
import { IndexingConfig } from './build-indexing.js';
|
|
6
|
+
import { Networks } from '@ceramicnetwork/common';
|
|
7
|
+
import { ISyncQueryApi } from './history-sync/interfaces.js';
|
|
8
|
+
export declare type CeramicCoreApi = {
|
|
9
|
+
loadStream<T extends Stream>(streamId: StreamID | CommitID | string, opts?: LoadOpts): Promise<T>;
|
|
10
|
+
loadStreamState(streamId: StreamID): Promise<StreamState | undefined>;
|
|
11
|
+
};
|
|
12
|
+
export declare class LocalIndexApi implements IndexApi {
|
|
13
|
+
private readonly core;
|
|
14
|
+
private readonly logger;
|
|
15
|
+
private readonly databaseIndexApi;
|
|
16
|
+
readonly enabled: boolean;
|
|
17
|
+
constructor(indexingConfig: IndexingConfig | undefined, core: CeramicCoreApi, logger: DiagnosticsLogger, networkName: Networks);
|
|
18
|
+
setSyncQueryApi(api: ISyncQueryApi): void;
|
|
19
|
+
shouldIndexStream(args: StreamID): boolean;
|
|
20
|
+
indexStream(args: IndexStreamArgs): Promise<void>;
|
|
21
|
+
count(query: BaseQuery): Promise<number>;
|
|
22
|
+
query(query: PaginationQuery): Promise<Page<StreamState | null>>;
|
|
23
|
+
indexedModels(): Array<ModelData>;
|
|
24
|
+
convertModelDataToIndexModelsArgs(modelsNoLongerIndexed: Array<ModelData>, modelData: ModelData): Promise<IndexModelArgs>;
|
|
25
|
+
indexModels(models: Array<ModelData>): Promise<void>;
|
|
26
|
+
stopIndexingModels(models: Array<ModelData>): Promise<void>;
|
|
27
|
+
init(): Promise<void>;
|
|
28
|
+
close(): Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=local-index-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-index-api.d.ts","sourceRoot":"","sources":["../src/local-index-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,QAAQ,EACR,SAAS,EACT,IAAI,EACJ,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,QAAQ,EACR,MAAM,EACP,MAAM,wBAAwB,CAAA;AAC/B,OAAO,KAAK,EAAoB,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,EAAE,KAAK,QAAQ,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEpD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAE5D,oBAAY,cAAc,GAAG;IAC3B,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IACjG,eAAe,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAA;CACtE,CAAA;AAgCD,qBAAa,aAAc,YAAW,QAAQ;IAM1C,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IANzB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA8B;IAC/D,SAAgB,OAAO,EAAE,OAAO,CAAA;gBAG9B,cAAc,EAAE,cAAc,GAAG,SAAS,EACzB,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,iBAAiB,EAC1C,WAAW,EAAE,QAAQ;IAMvB,eAAe,CAAC,GAAG,EAAE,aAAa;IAMlC,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO;IAcpC,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAQjD,KAAK,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAUxC,KAAK,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAwCtE,aAAa,IAAI,KAAK,CAAC,SAAS,CAAC;IAI3B,iCAAiC,CACrC,qBAAqB,EAAE,KAAK,CAAC,SAAS,CAAC,EACvC,SAAS,EAAE,SAAS,GACnB,OAAO,CAAC,cAAc,CAAC;IAiBpB,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAYpD,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAYrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { makeIndexApi } from './make-index-api.js';
|
|
2
|
+
import { Model } from '@ceramicnetwork/stream-model';
|
|
3
|
+
async function _getIndexModelArgs(req, core) {
|
|
4
|
+
const modelStreamId = req.streamID;
|
|
5
|
+
if (modelStreamId.type != Model.STREAM_TYPE_ID && !modelStreamId.equals(Model.MODEL)) {
|
|
6
|
+
throw new Error(`Cannot index ${modelStreamId.toString()}, it is not a Model StreamID`);
|
|
7
|
+
}
|
|
8
|
+
const opts = {
|
|
9
|
+
model: modelStreamId,
|
|
10
|
+
};
|
|
11
|
+
if (modelStreamId.type == Model.STREAM_TYPE_ID) {
|
|
12
|
+
const modelState = await core.loadStream(modelStreamId, {});
|
|
13
|
+
const content = modelState.state.next?.content ?? modelState.state.content;
|
|
14
|
+
Model.assertVersionValid(content, 'major');
|
|
15
|
+
if (content.relations) {
|
|
16
|
+
opts.relations = content.relations;
|
|
17
|
+
}
|
|
18
|
+
opts.indices = req.indices;
|
|
19
|
+
}
|
|
20
|
+
return opts;
|
|
21
|
+
}
|
|
22
|
+
export class LocalIndexApi {
|
|
23
|
+
constructor(indexingConfig, core, logger, networkName) {
|
|
24
|
+
this.core = core;
|
|
25
|
+
this.logger = logger;
|
|
26
|
+
this.databaseIndexApi = makeIndexApi(indexingConfig, networkName, logger);
|
|
27
|
+
this.enabled = indexingConfig != null && !indexingConfig.disableComposedb;
|
|
28
|
+
}
|
|
29
|
+
setSyncQueryApi(api) {
|
|
30
|
+
if (this.databaseIndexApi) {
|
|
31
|
+
this.databaseIndexApi.setSyncQueryApi(api);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
shouldIndexStream(args) {
|
|
35
|
+
if (!this.databaseIndexApi) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
return this.databaseIndexApi.getIndexedModels().some(function (idx) {
|
|
39
|
+
return idx.streamID.equals(args);
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
async indexStream(args) {
|
|
43
|
+
if (!this.shouldIndexStream(args.model)) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
await this.databaseIndexApi.indexStream(args);
|
|
47
|
+
}
|
|
48
|
+
async count(query) {
|
|
49
|
+
return this.databaseIndexApi.count(query);
|
|
50
|
+
}
|
|
51
|
+
async query(query) {
|
|
52
|
+
if (!this.databaseIndexApi) {
|
|
53
|
+
this.logger.warn(`Indexing is not configured. Unable to serve query ${JSON.stringify(query)}`);
|
|
54
|
+
return {
|
|
55
|
+
edges: [],
|
|
56
|
+
pageInfo: {
|
|
57
|
+
hasNextPage: false,
|
|
58
|
+
hasPreviousPage: false,
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
const page = await this.databaseIndexApi.page(query);
|
|
63
|
+
const edges = await Promise.all(page.edges.map(async (edge) => {
|
|
64
|
+
const node = (await this.core.loadStreamState(edge.node)) ?? null;
|
|
65
|
+
if (!node) {
|
|
66
|
+
this.logger.warn(`
|
|
67
|
+
Did not find stream state for streamid ${edge.node} in our state store when serving an indexed query.
|
|
68
|
+
This may indicate a problem with data persistence of your state store, which can result in data loss.
|
|
69
|
+
Please check that your state store is properly configured with strong persistence guarantees.
|
|
70
|
+
This query may have incomplete results. Affected query: ${JSON.stringify(query)}
|
|
71
|
+
`);
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
cursor: edge.cursor,
|
|
75
|
+
node: node,
|
|
76
|
+
};
|
|
77
|
+
}));
|
|
78
|
+
return {
|
|
79
|
+
edges: edges,
|
|
80
|
+
pageInfo: page.pageInfo,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
indexedModels() {
|
|
84
|
+
return this.databaseIndexApi?.getIndexedModels() ?? [];
|
|
85
|
+
}
|
|
86
|
+
async convertModelDataToIndexModelsArgs(modelsNoLongerIndexed, modelData) {
|
|
87
|
+
const modelStreamId = modelData.streamID;
|
|
88
|
+
this.logger.imp(`Starting indexing for Model ${modelStreamId.toString()}`);
|
|
89
|
+
const modelNoLongerIndexed = modelsNoLongerIndexed.some(function (oldIdx) {
|
|
90
|
+
return oldIdx.streamID.equals(modelStreamId);
|
|
91
|
+
});
|
|
92
|
+
if (modelNoLongerIndexed) {
|
|
93
|
+
throw new Error(`Cannot re-index model ${modelStreamId.toString()}, data may not be up-to-date`);
|
|
94
|
+
}
|
|
95
|
+
return await _getIndexModelArgs(modelData, this.core);
|
|
96
|
+
}
|
|
97
|
+
async indexModels(models) {
|
|
98
|
+
const modelsNoLongerIndexed = (await this.databaseIndexApi?.getModelsNoLongerIndexed()) ?? [];
|
|
99
|
+
const indexModelsArgs = await Promise.all(models.map(async (idx) => await this.convertModelDataToIndexModelsArgs(modelsNoLongerIndexed, idx)));
|
|
100
|
+
await this.databaseIndexApi?.indexModels(indexModelsArgs);
|
|
101
|
+
}
|
|
102
|
+
async stopIndexingModels(models) {
|
|
103
|
+
this.logger.imp(`Stopping indexing for Models: ${models.map(String).join(',')}`);
|
|
104
|
+
await this.databaseIndexApi?.stopIndexingModels(models);
|
|
105
|
+
}
|
|
106
|
+
async init() {
|
|
107
|
+
if (!this.databaseIndexApi) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
await this.databaseIndexApi.init();
|
|
111
|
+
const modelsToIndex = this.databaseIndexApi.getIndexedModels();
|
|
112
|
+
await this.indexModels(modelsToIndex);
|
|
113
|
+
}
|
|
114
|
+
async close() {
|
|
115
|
+
await this.databaseIndexApi?.close();
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=local-index-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-index-api.js","sourceRoot":"","sources":["../src/local-index-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { DiagnosticsLogger } from '@ceramicnetwork/common';
|
|
2
|
+
import { Networks } from '@ceramicnetwork/common';
|
|
3
|
+
import { IndexingConfig } from './build-indexing.js';
|
|
4
|
+
import { DatabaseIndexApi } from './database-index-api.js';
|
|
5
|
+
export declare class UnsupportedIndexingDatabaseError extends Error {
|
|
6
|
+
constructor();
|
|
7
|
+
}
|
|
8
|
+
export declare function makeIndexApi(indexingConfig: IndexingConfig | undefined, network: Networks, logger: DiagnosticsLogger): DatabaseIndexApi | undefined;
|
|
9
|
+
//# sourceMappingURL=make-index-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"make-index-api.d.ts","sourceRoot":"","sources":["../src/make-index-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACjD,OAAO,EAAiB,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACnE,OAAO,EAAE,gBAAgB,EAAkB,MAAM,yBAAyB,CAAA;AAE1E,qBAAa,gCAAiC,SAAQ,KAAK;;CAM1D;AAKD,wBAAgB,YAAY,CAC1B,cAAc,EAAE,cAAc,GAAG,SAAS,EAC1C,OAAO,EAAE,QAAQ,EACjB,MAAM,EAAE,iBAAiB,GACxB,gBAAgB,GAAG,SAAS,CA2B9B"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Networks } from '@ceramicnetwork/common';
|
|
2
|
+
import { buildIndexing } from './build-indexing.js';
|
|
3
|
+
import { SqliteIndexApi } from './database-index-api.js';
|
|
4
|
+
export class UnsupportedIndexingDatabaseError extends Error {
|
|
5
|
+
constructor() {
|
|
6
|
+
super('SQLite is not supported for the ComposeDB indexing database in production use. Please setup a Postgres instance and update the config file to use ComposeDB, or disable ComposeDB to start up without an indexing database.');
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export function makeIndexApi(indexingConfig, network, logger) {
|
|
10
|
+
if (!indexingConfig) {
|
|
11
|
+
logger.warn(`ComposeDB Indexing is not configured. Please add the indexing settings to your config file`);
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
if (indexingConfig.disableComposedb === true) {
|
|
15
|
+
logger.warn('ComposeDB indexing is actively disabled. Change the corresponding CLI flag, config option or ENV variable to enable it.');
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
const indexApi = buildIndexing(indexingConfig, logger, network);
|
|
19
|
+
if (indexingConfig.enableHistoricalSync && indexApi instanceof SqliteIndexApi) {
|
|
20
|
+
throw new UnsupportedIndexingDatabaseError();
|
|
21
|
+
}
|
|
22
|
+
if (network === Networks.MAINNET && indexApi instanceof SqliteIndexApi) {
|
|
23
|
+
throw new UnsupportedIndexingDatabaseError();
|
|
24
|
+
}
|
|
25
|
+
return indexApi;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=make-index-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"make-index-api.js","sourceRoot":"","sources":["../src/make-index-api.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACjD,OAAO,EAAE,aAAa,EAAkB,MAAM,qBAAqB,CAAA;AACnE,OAAO,EAAoB,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAE1E,MAAM,OAAO,gCAAiC,SAAQ,KAAK;IACzD;QACE,KAAK,CACH,6NAA6N,CAC9N,CAAA;IACH,CAAC;CACF;AAKD,MAAM,UAAU,YAAY,CAC1B,cAA0C,EAC1C,OAAiB,EACjB,MAAyB;IAEzB,IAAI,CAAC,cAAc,EAAE;QACnB,MAAM,CAAC,IAAI,CACT,4FAA4F,CAC7F,CAAA;QACD,OAAO,SAAS,CAAA;KACjB;IAED,IAAI,cAAc,CAAC,gBAAgB,KAAK,IAAI,EAAE;QAC5C,MAAM,CAAC,IAAI,CACT,yHAAyH,CAC1H,CAAA;QACD,OAAO,SAAS,CAAA;KACjB;IAED,MAAM,QAAQ,GAAG,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;IAE/D,IAAI,cAAc,CAAC,oBAAoB,IAAI,QAAQ,YAAY,cAAc,EAAE;QAC7E,MAAM,IAAI,gCAAgC,EAAE,CAAA;KAC7C;IAGD,IAAI,OAAO,KAAK,QAAQ,CAAC,OAAO,IAAI,QAAQ,YAAY,cAAc,EAAE;QACtE,MAAM,IAAI,gCAAgC,EAAE,CAAA;KAC7C;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
import { FieldsIndex, Networks } from '@ceramicnetwork/common';
|
|
3
|
+
export declare enum DatabaseType {
|
|
4
|
+
POSTGRES = "postgres",
|
|
5
|
+
SQLITE = "sqlite"
|
|
6
|
+
}
|
|
7
|
+
export declare enum ColumnType {
|
|
8
|
+
STRING = 0
|
|
9
|
+
}
|
|
10
|
+
export declare type ColumnInfo = {
|
|
11
|
+
name: string;
|
|
12
|
+
type: ColumnType;
|
|
13
|
+
};
|
|
14
|
+
export declare type TableIndex = {
|
|
15
|
+
keys: Array<string>;
|
|
16
|
+
name: string;
|
|
17
|
+
indexType: Knex.storageEngineIndexType;
|
|
18
|
+
};
|
|
19
|
+
export declare type TableIndices = {
|
|
20
|
+
indexName: string;
|
|
21
|
+
indices: Array<TableIndex>;
|
|
22
|
+
};
|
|
23
|
+
export declare function indexNameFromTableName(tableName: string): string;
|
|
24
|
+
export declare function defaultIndices(tableName: string): TableIndices;
|
|
25
|
+
export declare function getDefaultCDBDatabaseConfig(networkName: string): {
|
|
26
|
+
[key: string]: any;
|
|
27
|
+
};
|
|
28
|
+
export declare function createPostgresModelTable(dataSource: Knex, tableName: string, extraColumns: Array<ColumnInfo>): Promise<void>;
|
|
29
|
+
export declare function createSqliteModelTable(dataSource: Knex, tableName: string, extraColumns: Array<ColumnInfo>): Promise<void>;
|
|
30
|
+
export declare function createPostgresIndices(dataSource: Knex, tableName: string, indices: Array<FieldsIndex>): Promise<void>;
|
|
31
|
+
export declare function createSqliteIndices(dataSource: Knex, tableName: string, indices: Array<FieldsIndex>): Promise<void>;
|
|
32
|
+
export declare function createConfigTable(dataSource: Knex, tableName: string, network: Networks, jsonb_support: boolean): Promise<void>;
|
|
33
|
+
export declare function migrateConfigTable(dataSource: Knex, tableName: string, jsonb_support: boolean): Promise<void>;
|
|
34
|
+
//# sourceMappingURL=1-create-model-table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"1-create-model-table.d.ts","sourceRoot":"","sources":["../../src/migrations/1-create-model-table.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAChC,OAAO,EAAwB,WAAW,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAKpF,oBAAY,YAAY;IACtB,QAAQ,aAAa;IACrB,MAAM,WAAW;CAClB;AAQD,oBAAY,UAAU;IACpB,MAAM,IAAA;CACP;AAKD,oBAAY,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,UAAU,CAAA;CACjB,CAAA;AAED,oBAAY,UAAU,GAAG;IACvB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,IAAI,CAAC,sBAAsB,CAAA;CACvC,CAAA;AAED,oBAAY,YAAY,GAAG;IACzB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAA;CAC3B,CAAA;AAMD,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEhE;AAKD,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CA0C9D;AAWD,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,MAAM,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,CA0CvF;AAoBD,wBAAsB,wBAAwB,CAC5C,UAAU,EAAE,IAAI,EAChB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,KAAK,CAAC,UAAU,CAAC,GAC9B,OAAO,CAAC,IAAI,CAAC,CAwBf;AAED,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,IAAI,EAChB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,KAAK,CAAC,UAAU,CAAC,GAC9B,OAAO,CAAC,IAAI,CAAC,CAqBf;AAOD,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,IAAI,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,GAC1B,OAAO,CAAC,IAAI,CAAC,CAUf;AAED,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,IAAI,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,GAC1B,OAAO,CAAC,IAAI,CAAC,CAUf;AAED,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,IAAI,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,QAAQ,EACjB,aAAa,EAAE,OAAO,iBAgDvB;AAED,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,IAAI,EAChB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,OAAO,iBAoBvB"}
|