@firebaseextensions/firestore-bigquery-change-tracker 1.1.39 → 1.1.41
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/lib/bigquery/handleFailedTransactions.js +8 -5
- package/lib/bigquery/index.d.ts +3 -0
- package/lib/bigquery/index.js +19 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +4 -1
- package/lib/logger.d.ts +19 -0
- package/lib/logger.js +69 -0
- package/lib/logs.js +56 -56
- package/package.json +3 -3
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const
|
|
3
|
+
const admin = require("firebase-admin");
|
|
4
|
+
const app_1 = require("firebase-admin/app");
|
|
4
5
|
const firestore_1 = require("firebase-admin/firestore");
|
|
5
|
-
if (!
|
|
6
|
-
|
|
7
|
-
firebase.firestore().settings({ ignoreUndefinedProperties: true });
|
|
6
|
+
if (!admin.apps.length) {
|
|
7
|
+
(0, app_1.initializeApp)();
|
|
8
8
|
}
|
|
9
9
|
exports.default = async (rows, config, e) => {
|
|
10
|
-
const db = (0, firestore_1.getFirestore)();
|
|
10
|
+
const db = (0, firestore_1.getFirestore)(config.firestoreInstanceId);
|
|
11
|
+
db.settings({
|
|
12
|
+
ignoreUndefinedProperties: true,
|
|
13
|
+
});
|
|
11
14
|
const batchArray = [db.batch()];
|
|
12
15
|
let operationCounter = 0;
|
|
13
16
|
let batchIndex = 0;
|
package/lib/bigquery/index.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import * as bigquery from "@google-cloud/bigquery";
|
|
2
2
|
import { FirestoreEventHistoryTracker, FirestoreDocumentChangeEvent } from "../tracker";
|
|
3
|
+
import { LogLevel } from "../logger";
|
|
3
4
|
export { RawChangelogSchema, RawChangelogViewSchema } from "./schema";
|
|
4
5
|
export interface FirestoreBigQueryEventHistoryTrackerConfig {
|
|
5
6
|
datasetId: string;
|
|
6
7
|
tableId: string;
|
|
8
|
+
firestoreInstanceId?: string;
|
|
7
9
|
datasetLocation?: string | undefined;
|
|
8
10
|
transformFunction?: string | undefined;
|
|
9
11
|
timePartitioning?: string | undefined;
|
|
@@ -22,6 +24,7 @@ export interface FirestoreBigQueryEventHistoryTrackerConfig {
|
|
|
22
24
|
useIncrementalMaterializedView?: boolean;
|
|
23
25
|
maxStaleness?: string;
|
|
24
26
|
refreshIntervalMinutes?: number;
|
|
27
|
+
logLevel?: LogLevel | string;
|
|
25
28
|
}
|
|
26
29
|
/**
|
|
27
30
|
* An FirestoreEventHistoryTracker that exports data to BigQuery.
|
package/lib/bigquery/index.js
CHANGED
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.FirestoreBigQueryEventHistoryTracker = exports.RawChangelogViewSchema = exports.RawChangelogSchema = void 0;
|
|
4
|
+
/*
|
|
5
|
+
* Copyright 2019 Google LLC
|
|
6
|
+
*
|
|
7
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
* you may not use this file except in compliance with the License.
|
|
9
|
+
* You may obtain a copy of the License at
|
|
10
|
+
*
|
|
11
|
+
* https://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
*
|
|
13
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
* See the License for the specific language governing permissions and
|
|
17
|
+
* limitations under the License.
|
|
18
|
+
*/
|
|
4
19
|
const bigquery = require("@google-cloud/bigquery");
|
|
5
20
|
const firestore_1 = require("firebase-admin/firestore");
|
|
6
21
|
const traverse = require("traverse");
|
|
@@ -14,6 +29,7 @@ const clustering_1 = require("./clustering");
|
|
|
14
29
|
const checkUpdates_1 = require("./checkUpdates");
|
|
15
30
|
const utils_1 = require("./utils");
|
|
16
31
|
const initializeLatestView_1 = require("./initializeLatestView");
|
|
32
|
+
const logger_1 = require("../logger");
|
|
17
33
|
var schema_2 = require("./schema");
|
|
18
34
|
Object.defineProperty(exports, "RawChangelogSchema", { enumerable: true, get: function () { return schema_2.RawChangelogSchema; } });
|
|
19
35
|
Object.defineProperty(exports, "RawChangelogViewSchema", { enumerable: true, get: function () { return schema_2.RawChangelogViewSchema; } });
|
|
@@ -35,6 +51,9 @@ class FirestoreBigQueryEventHistoryTracker {
|
|
|
35
51
|
if (!this.config.datasetLocation) {
|
|
36
52
|
this.config.datasetLocation = "us";
|
|
37
53
|
}
|
|
54
|
+
this.config.firestoreInstanceId =
|
|
55
|
+
this.config.firestoreInstanceId || "(default)";
|
|
56
|
+
logger_1.logger.setLogLevel(this.config.logLevel || logger_1.LogLevel.INFO);
|
|
38
57
|
}
|
|
39
58
|
async record(events) {
|
|
40
59
|
if (!this.config.skipInit) {
|
package/lib/index.d.ts
CHANGED
package/lib/index.js
CHANGED
|
@@ -15,10 +15,13 @@
|
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
-
exports.ChangeType = exports.RawChangelogViewSchema = exports.RawChangelogSchema = exports.FirestoreBigQueryEventHistoryTracker = void 0;
|
|
18
|
+
exports.Logger = exports.LogLevel = exports.ChangeType = exports.RawChangelogViewSchema = exports.RawChangelogSchema = exports.FirestoreBigQueryEventHistoryTracker = void 0;
|
|
19
19
|
var bigquery_1 = require("./bigquery");
|
|
20
20
|
Object.defineProperty(exports, "FirestoreBigQueryEventHistoryTracker", { enumerable: true, get: function () { return bigquery_1.FirestoreBigQueryEventHistoryTracker; } });
|
|
21
21
|
Object.defineProperty(exports, "RawChangelogSchema", { enumerable: true, get: function () { return bigquery_1.RawChangelogSchema; } });
|
|
22
22
|
Object.defineProperty(exports, "RawChangelogViewSchema", { enumerable: true, get: function () { return bigquery_1.RawChangelogViewSchema; } });
|
|
23
23
|
var tracker_1 = require("./tracker");
|
|
24
24
|
Object.defineProperty(exports, "ChangeType", { enumerable: true, get: function () { return tracker_1.ChangeType; } });
|
|
25
|
+
var logger_1 = require("./logger");
|
|
26
|
+
Object.defineProperty(exports, "LogLevel", { enumerable: true, get: function () { return logger_1.LogLevel; } });
|
|
27
|
+
Object.defineProperty(exports, "Logger", { enumerable: true, get: function () { return logger_1.Logger; } });
|
package/lib/logger.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare enum LogLevel {
|
|
2
|
+
DEBUG = "debug",
|
|
3
|
+
INFO = "info",
|
|
4
|
+
WARN = "warn",
|
|
5
|
+
ERROR = "error",
|
|
6
|
+
SILENT = "silent"
|
|
7
|
+
}
|
|
8
|
+
export declare class Logger {
|
|
9
|
+
private logLevel;
|
|
10
|
+
constructor(logLevel?: LogLevel | string);
|
|
11
|
+
setLogLevel(logLevel: LogLevel | string): void;
|
|
12
|
+
debug(...args: any[]): void;
|
|
13
|
+
info(...args: any[]): void;
|
|
14
|
+
warn(...args: any[]): void;
|
|
15
|
+
error(...args: any[]): void;
|
|
16
|
+
log(...args: any[]): void;
|
|
17
|
+
private runIfLogLevel;
|
|
18
|
+
}
|
|
19
|
+
export declare const logger: Logger;
|
package/lib/logger.js
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.logger = exports.Logger = exports.LogLevel = void 0;
|
|
4
|
+
/*
|
|
5
|
+
* Copyright 2019 Google LLC
|
|
6
|
+
*
|
|
7
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
* you may not use this file except in compliance with the License.
|
|
9
|
+
* You may obtain a copy of the License at
|
|
10
|
+
*
|
|
11
|
+
* https://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
*
|
|
13
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
* See the License for the specific language governing permissions and
|
|
17
|
+
* limitations under the License.
|
|
18
|
+
*/
|
|
19
|
+
const firebase_functions_1 = require("firebase-functions");
|
|
20
|
+
var LogLevel;
|
|
21
|
+
(function (LogLevel) {
|
|
22
|
+
LogLevel["DEBUG"] = "debug";
|
|
23
|
+
LogLevel["INFO"] = "info";
|
|
24
|
+
LogLevel["WARN"] = "warn";
|
|
25
|
+
LogLevel["ERROR"] = "error";
|
|
26
|
+
LogLevel["SILENT"] = "silent";
|
|
27
|
+
})(LogLevel = exports.LogLevel || (exports.LogLevel = {}));
|
|
28
|
+
const levels = {
|
|
29
|
+
debug: 0,
|
|
30
|
+
info: 1,
|
|
31
|
+
warn: 2,
|
|
32
|
+
error: 3,
|
|
33
|
+
silent: 4,
|
|
34
|
+
};
|
|
35
|
+
class Logger {
|
|
36
|
+
constructor(logLevel = LogLevel.INFO) {
|
|
37
|
+
this.setLogLevel(logLevel);
|
|
38
|
+
}
|
|
39
|
+
setLogLevel(logLevel) {
|
|
40
|
+
if (typeof logLevel === "string") {
|
|
41
|
+
this.logLevel = levels[logLevel] ?? levels.info;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
this.logLevel = levels[logLevel];
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
debug(...args) {
|
|
48
|
+
this.runIfLogLevel(levels.debug, firebase_functions_1.logger.debug, ...args);
|
|
49
|
+
}
|
|
50
|
+
info(...args) {
|
|
51
|
+
this.runIfLogLevel(levels.info, firebase_functions_1.logger.info, ...args);
|
|
52
|
+
}
|
|
53
|
+
warn(...args) {
|
|
54
|
+
this.runIfLogLevel(levels.warn, firebase_functions_1.logger.warn, ...args);
|
|
55
|
+
}
|
|
56
|
+
error(...args) {
|
|
57
|
+
this.runIfLogLevel(levels.error, firebase_functions_1.logger.error, ...args);
|
|
58
|
+
}
|
|
59
|
+
log(...args) {
|
|
60
|
+
this.info(...args);
|
|
61
|
+
}
|
|
62
|
+
runIfLogLevel(level, func, ...args) {
|
|
63
|
+
if (this.logLevel <= level) {
|
|
64
|
+
func(...args);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
exports.Logger = Logger;
|
|
69
|
+
exports.logger = new Logger();
|
package/lib/logs.js
CHANGED
|
@@ -16,208 +16,208 @@
|
|
|
16
16
|
*/
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
18
|
exports.updatingMetadata = exports.failedToInitializeWait = exports.tableCreationError = exports.invalidClustering = exports.invalidClusteringTypes = exports.hourAndDatePartitioningWarning = exports.invalidTableReference = exports.invalidProjectIdWarning = exports.cannotPartitionExistingTable = exports.removedClustering = exports.updatedClustering = exports.bigQueryTableInsertErrors = exports.firestoreTimePartitioningParametersWarning = exports.firestoreTimePartitionFieldError = exports.addPartitionFieldColumn = exports.addNewColumn = exports.timestampMissingValue = exports.error = exports.dataTypeInvalid = exports.dataInserting = exports.dataInsertRetried = exports.dataInserted = exports.complete = exports.bigQueryViewValidating = exports.bigQueryViewValidated = exports.bigQueryViewUpToDate = exports.bigQueryViewUpdating = exports.bigQueryViewUpdated = exports.bigQueryViewAlreadyExists = exports.bigQueryViewCreating = exports.bigQueryViewCreated = exports.bigQueryUserDefinedFunctionCreated = exports.bigQueryUserDefinedFunctionCreating = exports.bigQueryTableValidating = exports.bigQueryTableValidated = exports.bigQueryTableUpToDate = exports.bigQueryTableUpdating = exports.bigQueryTableUpdated = exports.bigQueryTableCreating = exports.bigQueryTableCreated = exports.bigQueryTableAlreadyExists = exports.bigQuerySchemaViewCreated = exports.bigQueryLatestSnapshotViewQueryCreated = exports.bigQueryErrorRecordingDocumentChange = exports.bigQueryDatasetExists = exports.bigQueryDatasetCreating = exports.bigQueryDatasetCreated = exports.arrayFieldInvalid = void 0;
|
|
19
|
-
const
|
|
19
|
+
const logger_1 = require("./logger");
|
|
20
20
|
const arrayFieldInvalid = (fieldName) => {
|
|
21
|
-
|
|
21
|
+
logger_1.logger.warn(`Array field '${fieldName}' does not contain an array, skipping`);
|
|
22
22
|
};
|
|
23
23
|
exports.arrayFieldInvalid = arrayFieldInvalid;
|
|
24
24
|
const bigQueryDatasetCreated = (datasetId) => {
|
|
25
|
-
|
|
25
|
+
logger_1.logger.info(`Created BigQuery dataset: ${datasetId}`);
|
|
26
26
|
};
|
|
27
27
|
exports.bigQueryDatasetCreated = bigQueryDatasetCreated;
|
|
28
28
|
const bigQueryDatasetCreating = (datasetId) => {
|
|
29
|
-
|
|
29
|
+
logger_1.logger.debug(`Creating BigQuery dataset: ${datasetId}`);
|
|
30
30
|
};
|
|
31
31
|
exports.bigQueryDatasetCreating = bigQueryDatasetCreating;
|
|
32
32
|
const bigQueryDatasetExists = (datasetId) => {
|
|
33
|
-
|
|
33
|
+
logger_1.logger.info(`BigQuery dataset already exists: ${datasetId}`);
|
|
34
34
|
};
|
|
35
35
|
exports.bigQueryDatasetExists = bigQueryDatasetExists;
|
|
36
36
|
const bigQueryErrorRecordingDocumentChange = (e) => {
|
|
37
|
-
|
|
37
|
+
logger_1.logger.error(`Error recording document changes.`, e);
|
|
38
38
|
};
|
|
39
39
|
exports.bigQueryErrorRecordingDocumentChange = bigQueryErrorRecordingDocumentChange;
|
|
40
40
|
const bigQueryLatestSnapshotViewQueryCreated = (query) => {
|
|
41
|
-
|
|
41
|
+
logger_1.logger.debug(`BigQuery latest snapshot view query:\n${query}`);
|
|
42
42
|
};
|
|
43
43
|
exports.bigQueryLatestSnapshotViewQueryCreated = bigQueryLatestSnapshotViewQueryCreated;
|
|
44
44
|
const bigQuerySchemaViewCreated = (name) => {
|
|
45
|
-
|
|
45
|
+
logger_1.logger.debug(`BigQuery created schema view ${name}\n`);
|
|
46
46
|
};
|
|
47
47
|
exports.bigQuerySchemaViewCreated = bigQuerySchemaViewCreated;
|
|
48
48
|
const bigQueryTableAlreadyExists = (tableName, datasetName) => {
|
|
49
|
-
|
|
49
|
+
logger_1.logger.debug(`BigQuery table with name ${tableName} already ` +
|
|
50
50
|
`exists in dataset ${datasetName}!`);
|
|
51
51
|
};
|
|
52
52
|
exports.bigQueryTableAlreadyExists = bigQueryTableAlreadyExists;
|
|
53
53
|
const bigQueryTableCreated = (tableName) => {
|
|
54
|
-
|
|
54
|
+
logger_1.logger.info(`Created BigQuery table: ${tableName}`);
|
|
55
55
|
};
|
|
56
56
|
exports.bigQueryTableCreated = bigQueryTableCreated;
|
|
57
57
|
const bigQueryTableCreating = (tableName) => {
|
|
58
|
-
|
|
58
|
+
logger_1.logger.debug(`Creating BigQuery table: ${tableName}`);
|
|
59
59
|
};
|
|
60
60
|
exports.bigQueryTableCreating = bigQueryTableCreating;
|
|
61
61
|
const bigQueryTableUpdated = (tableName) => {
|
|
62
|
-
|
|
62
|
+
logger_1.logger.info(`Updated existing BigQuery table: ${tableName}`);
|
|
63
63
|
};
|
|
64
64
|
exports.bigQueryTableUpdated = bigQueryTableUpdated;
|
|
65
65
|
const bigQueryTableUpdating = (tableName) => {
|
|
66
|
-
|
|
66
|
+
logger_1.logger.debug(`Updating existing BigQuery table: ${tableName}`);
|
|
67
67
|
};
|
|
68
68
|
exports.bigQueryTableUpdating = bigQueryTableUpdating;
|
|
69
69
|
const bigQueryTableUpToDate = (tableName) => {
|
|
70
|
-
|
|
70
|
+
logger_1.logger.info(`BigQuery table: ${tableName} is up to date`);
|
|
71
71
|
};
|
|
72
72
|
exports.bigQueryTableUpToDate = bigQueryTableUpToDate;
|
|
73
73
|
const bigQueryTableValidated = (tableName) => {
|
|
74
|
-
|
|
74
|
+
logger_1.logger.info(`Validated existing BigQuery table: ${tableName}`);
|
|
75
75
|
};
|
|
76
76
|
exports.bigQueryTableValidated = bigQueryTableValidated;
|
|
77
77
|
const bigQueryTableValidating = (tableName) => {
|
|
78
|
-
|
|
78
|
+
logger_1.logger.debug(`Validating existing BigQuery table: ${tableName}`);
|
|
79
79
|
};
|
|
80
80
|
exports.bigQueryTableValidating = bigQueryTableValidating;
|
|
81
81
|
const bigQueryUserDefinedFunctionCreating = (functionName) => {
|
|
82
|
-
|
|
82
|
+
logger_1.logger.debug(`Creating BigQuery user-defined function ${functionName}`);
|
|
83
83
|
};
|
|
84
84
|
exports.bigQueryUserDefinedFunctionCreating = bigQueryUserDefinedFunctionCreating;
|
|
85
85
|
const bigQueryUserDefinedFunctionCreated = (functionName) => {
|
|
86
|
-
|
|
86
|
+
logger_1.logger.info(`Created BigQuery user-defined function ${functionName}`);
|
|
87
87
|
};
|
|
88
88
|
exports.bigQueryUserDefinedFunctionCreated = bigQueryUserDefinedFunctionCreated;
|
|
89
89
|
const bigQueryViewCreated = (viewName) => {
|
|
90
|
-
|
|
90
|
+
logger_1.logger.info(`Created BigQuery view: ${viewName}`);
|
|
91
91
|
};
|
|
92
92
|
exports.bigQueryViewCreated = bigQueryViewCreated;
|
|
93
93
|
const bigQueryViewCreating = (viewName, query) => {
|
|
94
|
-
|
|
94
|
+
logger_1.logger.debug(`Creating BigQuery view: ${viewName}\nQuery:\n${query}`);
|
|
95
95
|
};
|
|
96
96
|
exports.bigQueryViewCreating = bigQueryViewCreating;
|
|
97
97
|
const bigQueryViewAlreadyExists = (viewName, datasetName) => {
|
|
98
|
-
|
|
98
|
+
logger_1.logger.info(`View with id ${viewName} already exists in dataset ${datasetName}.`);
|
|
99
99
|
};
|
|
100
100
|
exports.bigQueryViewAlreadyExists = bigQueryViewAlreadyExists;
|
|
101
101
|
const bigQueryViewUpdated = (viewName) => {
|
|
102
|
-
|
|
102
|
+
logger_1.logger.info(`Updated existing BigQuery view: ${viewName}`);
|
|
103
103
|
};
|
|
104
104
|
exports.bigQueryViewUpdated = bigQueryViewUpdated;
|
|
105
105
|
const bigQueryViewUpdating = (viewName) => {
|
|
106
|
-
|
|
106
|
+
logger_1.logger.debug(`Updating existing BigQuery view: ${viewName}`);
|
|
107
107
|
};
|
|
108
108
|
exports.bigQueryViewUpdating = bigQueryViewUpdating;
|
|
109
109
|
const bigQueryViewUpToDate = (viewName) => {
|
|
110
|
-
|
|
110
|
+
logger_1.logger.info(`BigQuery view: ${viewName} is up to date`);
|
|
111
111
|
};
|
|
112
112
|
exports.bigQueryViewUpToDate = bigQueryViewUpToDate;
|
|
113
113
|
const bigQueryViewValidated = (viewName) => {
|
|
114
|
-
|
|
114
|
+
logger_1.logger.info(`Validated existing BigQuery view: ${viewName}`);
|
|
115
115
|
};
|
|
116
116
|
exports.bigQueryViewValidated = bigQueryViewValidated;
|
|
117
117
|
const bigQueryViewValidating = (viewName) => {
|
|
118
|
-
|
|
118
|
+
logger_1.logger.debug(`Validating existing BigQuery view: ${viewName}`);
|
|
119
119
|
};
|
|
120
120
|
exports.bigQueryViewValidating = bigQueryViewValidating;
|
|
121
121
|
const complete = () => {
|
|
122
|
-
|
|
122
|
+
logger_1.logger.info("Completed mod execution");
|
|
123
123
|
};
|
|
124
124
|
exports.complete = complete;
|
|
125
125
|
const dataInserted = (rowCount) => {
|
|
126
|
-
|
|
126
|
+
logger_1.logger.debug(`Inserted ${rowCount} row(s) of data into BigQuery`);
|
|
127
127
|
};
|
|
128
128
|
exports.dataInserted = dataInserted;
|
|
129
129
|
const dataInsertRetried = (rowCount) => {
|
|
130
|
-
|
|
130
|
+
logger_1.logger.debug(`Retried to insert ${rowCount} row(s) of data into BigQuery (ignoring unknown columns)`);
|
|
131
131
|
};
|
|
132
132
|
exports.dataInsertRetried = dataInsertRetried;
|
|
133
133
|
const dataInserting = (rowCount) => {
|
|
134
|
-
|
|
134
|
+
logger_1.logger.debug(`Inserting ${rowCount} row(s) of data into BigQuery`);
|
|
135
135
|
};
|
|
136
136
|
exports.dataInserting = dataInserting;
|
|
137
137
|
const dataTypeInvalid = (fieldName, fieldType, dataType) => {
|
|
138
|
-
|
|
138
|
+
logger_1.logger.warn(`Field '${fieldName}' has invalid data. Expected: ${fieldType}, received: ${dataType}`);
|
|
139
139
|
};
|
|
140
140
|
exports.dataTypeInvalid = dataTypeInvalid;
|
|
141
141
|
const error = (err) => {
|
|
142
|
-
|
|
142
|
+
logger_1.logger.error("Error when mirroring data to BigQuery", err);
|
|
143
143
|
};
|
|
144
144
|
exports.error = error;
|
|
145
145
|
const timestampMissingValue = (fieldName) => {
|
|
146
|
-
|
|
146
|
+
logger_1.logger.warn(`Missing value for timestamp field: ${fieldName}, using default timestamp instead.`);
|
|
147
147
|
};
|
|
148
148
|
exports.timestampMissingValue = timestampMissingValue;
|
|
149
149
|
const addNewColumn = (table, field) => {
|
|
150
|
-
|
|
150
|
+
logger_1.logger.info(`Updated '${table}' table with a '${field}' column`);
|
|
151
151
|
};
|
|
152
152
|
exports.addNewColumn = addNewColumn;
|
|
153
153
|
const addPartitionFieldColumn = (table, field) => {
|
|
154
|
-
|
|
154
|
+
logger_1.logger.info(`Updated '${table}' table with a partition field '${field}' column`);
|
|
155
155
|
};
|
|
156
156
|
exports.addPartitionFieldColumn = addPartitionFieldColumn;
|
|
157
157
|
const firestoreTimePartitionFieldError = (documentName, fieldName, firestoreFieldName, firestoreFieldData) => {
|
|
158
|
-
|
|
158
|
+
logger_1.logger.warn(`Wrong type of Firestore Field for TimePartitioning. Accepts only strings in BigQuery format (DATE, DATETIME, TIMESTAMP) and Firestore Timestamp. Firestore Document field path: ${documentName}. Field name: ${firestoreFieldName}. Field data: ${firestoreFieldData}. Schema field "${fieldName}" value will be null.`);
|
|
159
159
|
};
|
|
160
160
|
exports.firestoreTimePartitionFieldError = firestoreTimePartitionFieldError;
|
|
161
161
|
const firestoreTimePartitioningParametersWarning = (fieldName, fieldType, firestoreFieldName, dataFirestoreField) => {
|
|
162
|
-
|
|
163
|
-
!fieldName &&
|
|
164
|
-
!fieldType &&
|
|
162
|
+
logger_1.logger.warn("All TimePartitioning option parameters need to be available to create new custom schema field");
|
|
163
|
+
!fieldName && logger_1.logger.warn(`Parameter missing: TIME_PARTITIONING_FIELD`);
|
|
164
|
+
!fieldType && logger_1.logger.warn(`Parameter missing: TIME_PARTITIONING_FIELD_TYPE`);
|
|
165
165
|
!firestoreFieldName &&
|
|
166
|
-
|
|
166
|
+
logger_1.logger.warn(`Parameter missing: TIME_PARTITIONING_FIRESTORE_FIELD`);
|
|
167
167
|
!dataFirestoreField &&
|
|
168
|
-
|
|
168
|
+
logger_1.logger.warn(`No data found in Firestore Document under selected field: "${firestoreFieldName}"`);
|
|
169
169
|
};
|
|
170
170
|
exports.firestoreTimePartitioningParametersWarning = firestoreTimePartitioningParametersWarning;
|
|
171
171
|
const bigQueryTableInsertErrors = (insertErrors) => {
|
|
172
|
-
|
|
172
|
+
logger_1.logger.warn(`Error when inserting data to table.`);
|
|
173
173
|
insertErrors?.forEach((error) => {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
error.errors?.forEach((error) =>
|
|
174
|
+
logger_1.logger.warn("ROW DATA JSON:");
|
|
175
|
+
logger_1.logger.warn(error.row);
|
|
176
|
+
error.errors?.forEach((error) => logger_1.logger.warn(`ROW ERROR MESSAGE: ${error.message}`));
|
|
177
177
|
});
|
|
178
178
|
};
|
|
179
179
|
exports.bigQueryTableInsertErrors = bigQueryTableInsertErrors;
|
|
180
180
|
const updatedClustering = (fields) => {
|
|
181
|
-
|
|
181
|
+
logger_1.logger.info(`Clustering updated with new settings fields: ${fields}`);
|
|
182
182
|
};
|
|
183
183
|
exports.updatedClustering = updatedClustering;
|
|
184
184
|
const removedClustering = (tableName) => {
|
|
185
|
-
|
|
185
|
+
logger_1.logger.info(`Clustering removed on ${tableName}`);
|
|
186
186
|
};
|
|
187
187
|
exports.removedClustering = removedClustering;
|
|
188
188
|
const cannotPartitionExistingTable = (table) => {
|
|
189
|
-
|
|
189
|
+
logger_1.logger.warn(`Cannot partition an existing table ${table.dataset.id}_${table.id}`);
|
|
190
190
|
};
|
|
191
191
|
exports.cannotPartitionExistingTable = cannotPartitionExistingTable;
|
|
192
192
|
function invalidProjectIdWarning(bqProjectId) {
|
|
193
|
-
|
|
193
|
+
logger_1.logger.warn(`Invalid project Id ${bqProjectId}, data cannot be synchronized`);
|
|
194
194
|
}
|
|
195
195
|
exports.invalidProjectIdWarning = invalidProjectIdWarning;
|
|
196
196
|
function invalidTableReference() {
|
|
197
|
-
|
|
197
|
+
logger_1.logger.warn(`No valid table reference is available. Skipping partitioning`);
|
|
198
198
|
}
|
|
199
199
|
exports.invalidTableReference = invalidTableReference;
|
|
200
200
|
function hourAndDatePartitioningWarning() {
|
|
201
|
-
|
|
201
|
+
logger_1.logger.warn(`Cannot partition table with hour partitioning and Date. For DATE columns, the partitions can have daily, monthly, or yearly granularity. Skipping partitioning`);
|
|
202
202
|
}
|
|
203
203
|
exports.hourAndDatePartitioningWarning = hourAndDatePartitioningWarning;
|
|
204
204
|
function invalidClusteringTypes(fields) {
|
|
205
|
-
|
|
205
|
+
logger_1.logger.warn(`Unable to add clustering, field(s) ${fields} have invalid types.`);
|
|
206
206
|
}
|
|
207
207
|
exports.invalidClusteringTypes = invalidClusteringTypes;
|
|
208
208
|
function invalidClustering(fields) {
|
|
209
|
-
|
|
209
|
+
logger_1.logger.warn(`Unable to add clustering, field(s) ${fields} do not exist on the expected table`);
|
|
210
210
|
}
|
|
211
211
|
exports.invalidClustering = invalidClustering;
|
|
212
212
|
const tableCreationError = (table, message) => {
|
|
213
|
-
|
|
213
|
+
logger_1.logger.warn(`Error caught creating table`, message);
|
|
214
214
|
};
|
|
215
215
|
exports.tableCreationError = tableCreationError;
|
|
216
216
|
const failedToInitializeWait = (message) => {
|
|
217
|
-
|
|
217
|
+
logger_1.logger.warn(`Failed while waiting to initialize.`, message);
|
|
218
218
|
};
|
|
219
219
|
exports.failedToInitializeWait = failedToInitializeWait;
|
|
220
220
|
const updatingMetadata = (tableName, resources) => {
|
|
221
|
-
|
|
221
|
+
logger_1.logger.info(`Updated Metadata on ${tableName}, ${JSON.stringify(resources)})`);
|
|
222
222
|
};
|
|
223
223
|
exports.updatingMetadata = updatingMetadata;
|
package/package.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"url": "github.com/firebase/extensions.git",
|
|
6
6
|
"directory": "firestore-bigquery-export/firestore-bigquery-change-tracker"
|
|
7
7
|
},
|
|
8
|
-
"version": "1.1.
|
|
8
|
+
"version": "1.1.41",
|
|
9
9
|
"description": "Core change-tracker library for Cloud Firestore Collection BigQuery Exports",
|
|
10
10
|
"main": "./lib/index.js",
|
|
11
11
|
"scripts": {
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
"dependencies": {
|
|
28
28
|
"@google-cloud/bigquery": "^7.6.0",
|
|
29
29
|
"@google-cloud/resource-manager": "^5.1.0",
|
|
30
|
-
"firebase-admin": "^
|
|
31
|
-
"firebase-functions": "^
|
|
30
|
+
"firebase-admin": "^13.2.0",
|
|
31
|
+
"firebase-functions": "^6.3.2",
|
|
32
32
|
"generate-schema": "^2.6.0",
|
|
33
33
|
"inquirer": "^6.4.0",
|
|
34
34
|
"lodash": "^4.17.14",
|