Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ export interface CliConfig {
bigQueryProjectId: string;
datasetId: string;
tableNamePrefix: string;
databaseId?: string;
schemas: { [schemaName: string]: FirestoreSchema };
useGemini?: boolean;
geminiAnalyzeCollectionPath?: string;
Expand All @@ -48,6 +49,7 @@ export async function parseConfig(): Promise<CliConfig> {
bigQueryProjectId: program.bigQueryProject || program.project,
datasetId: program.dataset,
tableNamePrefix: program.tableNamePrefix,
databaseId: program.databaseId || "(default)",
useGemini: !!program.useGemini,
schemas: !program.useGemini ? readSchemas(program.schemaFiles) : {},
geminiAnalyzeCollectionPath: program.useGemini,
Expand All @@ -62,6 +64,7 @@ export async function parseConfig(): Promise<CliConfig> {
bigQueryProjectId,
datasetId,
tableNamePrefix,
databaseId,
schemaFiles,
useGemini,
geminiAnalyzeCollectionPath,
Expand All @@ -75,6 +78,7 @@ export async function parseConfig(): Promise<CliConfig> {
bigQueryProjectId,
datasetId,
tableNamePrefix,
databaseId,
schemas: !useGemini ? readSchemas([schemaFiles]) : {},
useGemini,
geminiAnalyzeCollectionPath,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,13 @@ export const questions = [
validate: (value) =>
validateInput(value, "table name prefix", BIGQUERY_VALID_CHARACTERS),
},
{
message:
"What is your Firestore database ID? (Leave as default '(default)' for the default database)",
name: "databaseId",
type: "input",
default: "(default)",
},
{
message:
"Would you like to use a Gemini to automatically analyze your data and generate a draft schema?",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,10 @@ export const configureProgram = () => {
"-t, --table-name-prefix <table-name-prefix>",
"A common prefix for the names of all views generated by this script."
)
.option(
"-D, --database-id <database-id>",
"Firestore database ID (default: '(default)')"
)
.option(
"-f, --schema-files <schema-files>",
"A collection of files from which to read schemas.",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
*/

import type { CliConfig } from "../config";
import firebase = require("firebase-admin");
import { getFirestore, GeoPoint, DocumentReference } from "firebase-admin/firestore";
import { genkit, z } from "genkit";
import { googleAI } from "@genkit-ai/googleai";
import * as fs from "fs";
Expand All @@ -24,9 +24,12 @@ import inquirer from "inquirer";

export async function sampleFirestoreDocuments(
collectionPath: string,
sampleSize: number
sampleSize: number,
databaseId?: string
): Promise<any[]> {
const db = firebase.firestore();
const db = (databaseId && databaseId !== "(default)")
? getFirestore(databaseId)
: getFirestore();

try {
const snapshot = await db
Expand Down Expand Up @@ -54,15 +57,15 @@ export function serializeDocument(data: any): any {
return { _type: "timestamp", value: data.toISOString() };
}

if (data instanceof firebase.firestore.GeoPoint) {
if (data instanceof GeoPoint) {
return {
_type: "geopoint",
latitude: data.latitude,
longitude: data.longitude,
};
}

if (data instanceof firebase.firestore.DocumentReference) {
if (data instanceof DocumentReference) {
return { _type: "reference", path: data.path };
}

Expand Down Expand Up @@ -197,7 +200,8 @@ export const generateSchemaFilesWithGemini = async (config: CliConfig) => {
// get sample data from Firestore
const sampleData = await sampleFirestoreDocuments(
config.geminiAnalyzeCollectionPath!,
config.agentSampleSize!
config.agentSampleSize!,
config.databaseId
);

if (sampleData.length === 0) {
Expand Down
Loading