Skip to content

Commit 0eec100

Browse files
authored
Feature/improve metadata processing (#321)
* Add specific function to retrieve db details * Remove modelFieldsHash * Remove card model distinction * Include more fields in card processing
1 parent ba8f07d commit 0eec100

File tree

6 files changed

+23
-45
lines changed

6 files changed

+23
-45
lines changed

apps/src/metabase/helpers/analystModeTypes.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,9 @@ const fieldsToRemove = [
4545
'archived',
4646
'collection_position',
4747
'source_card_id',
48-
'result_metadata',
4948
'creator',
5049
'initially_published_at',
5150
'enable_embedding',
52-
'collection_id',
5351
'made_public_by_id',
5452
'embedding_params',
5553
'cache_ttl',

apps/src/metabase/helpers/metabaseAPIHelpers.ts

Lines changed: 17 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -213,21 +213,18 @@ export async function getAllCardsAndModels(forceRefresh = false, currentDBId: nu
213213
console.log('[minusx] getAllCards - Total cards:', cards.length);
214214

215215
// Filter cards by database_id only
216-
const filteredCardsAndModels = filter(cards, (card) => {
216+
const filteredCards = filter(cards, (card) => {
217217
const databaseId = get(card, 'database_id');
218218

219219
// Filter by selected database only
220220
const matchesDatabase = selectedDbId && databaseId? databaseId === selectedDbId : true;
221221

222222
return matchesDatabase;
223223
});
224-
console.log('[minusx] getAllCards - Filtered:', filteredCardsAndModels.length);
224+
console.log('[minusx] getAllCards - Filtered:', filteredCards.length);
225225

226-
// split into cards and models
227-
const [filteredCards, filteredModels] = partition(filteredCardsAndModels, (card) => get(card, 'type') !== 'model');
228226

229227
console.log('[minusx] Non model cards:', filteredCards.length);
230-
console.log('[minusx] Model cards:', filteredModels.length);
231228
// Calculate relevancy score and sort by it
232229
const cardsWithRelevancy = filteredCards.map((card) => {
233230
const viewCount = get(card, 'view_count') || 0;
@@ -261,24 +258,6 @@ export async function getAllCardsAndModels(forceRefresh = false, currentDBId: nu
261258
const cardsForProcessing = sortedCards.map(card => omit(card, ['relevancy']));
262259
const processedCards = map(cardsForProcessing, processCard);
263260

264-
const processedModelFields = filteredModels.flatMap((model) => {
265-
const result_metadata = get(model, 'result_metadata', [])
266-
if (result_metadata == null) {
267-
console.warn("[minusx] model has no result_metadata: ", model)
268-
return []
269-
}
270-
const columns = result_metadata.map((column: ResultMetadataElm) => {
271-
return {
272-
id: get(column, 'name'),
273-
name: get(column, 'name'),
274-
type: get(column, 'base_type'),
275-
model_id: get(model, 'id'),
276-
model_name: get(model, 'name')
277-
}
278-
})
279-
return columns
280-
})
281-
282261
console.log('Processed cards:', processedCards);
283262
const tables: Record<string, TableAndSchema> = {};
284263
_.forEach(processedCards, (card) => {
@@ -296,7 +275,7 @@ export async function getAllCardsAndModels(forceRefresh = false, currentDBId: nu
296275
const relevantTables = _.chain(tables).values().sortBy('count').reverse().value();
297276
console.log('Tables from cards:', relevantTables);
298277

299-
return { cards: processedCards, tables: relevantTables, modelFields: processedModelFields };
278+
return { cards: processedCards, tables: relevantTables };
300279
}
301280

302281
export async function getAllFields(currentDBId: number) {
@@ -381,18 +360,25 @@ export const getAllRelevantModelsForSelectedDb = async (dbId: number, forceRefre
381360
return modelsAsTables.filter((model: MetabaseModel) => model.collectionName !== 'mx_internal');
382361
}
383362

384-
export async function getDatabaseTablesAndModelsWithoutFields(db_id: number, forceRefreshModels: boolean = false, forceRefreshTables: boolean = false): Promise<DatabaseInfoWithTablesAndModels> {
385-
// If dbId not provided, get the currently selected database ID
386-
const jsonResponse = forceRefreshTables ? await fetchDatabaseWithTables.refresh({ db_id }) : await fetchDatabaseWithTables({ db_id });
387-
const models = await getAllRelevantModelsForSelectedDb(db_id, forceRefreshModels) ;
363+
export const getRelevantTablesAndDetailsForSelectedDb = async (dbId: number, forceRefreshTables: boolean = false) => {
364+
const jsonResponse = forceRefreshTables ? await fetchDatabaseWithTables.refresh({ db_id: dbId }) : await fetchDatabaseWithTables({ db_id: dbId });
388365
const defaultSchema = getDefaultSchema(jsonResponse);
389366
const tables = await Promise.all(
390-
map(get(jsonResponse, 'tables', []), (table: any) => extractTableInfo(table, false))
367+
map(get(jsonResponse, 'tables', []), (table: any) => extractTableInfo(table, false))
391368
);
392369

393370
return {
394-
...extractDbInfo(jsonResponse, defaultSchema),
395-
tables: tables || [],
371+
...extractDbInfo(jsonResponse, defaultSchema),
372+
tables: tables || []
373+
};
374+
}
375+
376+
export async function getDatabaseTablesAndModelsWithoutFields(db_id: number, forceRefreshModels: boolean = false, forceRefreshTables: boolean = false): Promise<DatabaseInfoWithTablesAndModels> {
377+
const tablesAndDetails = await getRelevantTablesAndDetailsForSelectedDb(db_id, forceRefreshTables);
378+
const models = await getAllRelevantModelsForSelectedDb(db_id, forceRefreshModels);
379+
380+
return {
381+
...tablesAndDetails,
396382
models: models || []
397383
};
398384
}

apps/src/package.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
export { getAppStateConfigs } from "./appStateConfigs";
22
export { applyTableDiffs } from "./common/utils";
33
export { getTableContextYAML, filterTablesByCatalog } from "./metabase/helpers/catalog";
4-
export { getAllCardsAndModels, getTableData, getDatabaseTablesAndModelsWithoutFields, getAllCardsAndModels as getAllCards, getAllFields, getAllFieldsFiltered } from "./metabase/helpers/metabaseAPIHelpers";
4+
export { getAllCardsAndModels, getTableData, getRelevantTablesAndDetailsForSelectedDb, getDatabaseTablesAndModelsWithoutFields, getAllCardsAndModels as getAllCards, getAllFields, getAllFieldsFiltered } from "./metabase/helpers/metabaseAPIHelpers";
55
export { fetchModelInfo } from "./metabase/helpers/metabaseAPI";
66
export { getAllTemplateTagsInQuery, applySQLEdits, type SQLEdits } from "./metabase/helpers/sqlQuery";
77
export { getModelsWithFields, getSelectedAndRelevantModels, modifySqlForMetabaseModels, replaceLLMFriendlyIdentifiersInSqlWithModels } from "./metabase/helpers/metabaseModels";

web/src/helpers/LLM/remote.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,16 +42,14 @@ export async function planActionsRemote({
4242
// Check if analyst mode is enabled
4343
if (currentState.settings.drMode && currentState.settings.analystMode) {
4444
try {
45-
const { cardsHash, dbSchemaHash, fieldsHash, modelFieldsHash, selectedDbId } = await getAllMetadataPromise;
45+
const { cardsHash, dbSchemaHash, fieldsHash, selectedDbId } = await getAllMetadataPromise;
4646
// @ts-ignore
4747
payload.cardsHash = cardsHash;
4848
// @ts-ignore
4949
payload.dbSchemaHash = dbSchemaHash;
5050
// @ts-ignore
5151
payload.fieldsHash = fieldsHash;
5252
// @ts-ignore
53-
payload.modelFieldsHash = modelFieldsHash;
54-
// @ts-ignore
5553
payload.selectedDbId = `${selectedDbId}`;
5654
console.log('[minusx] Added metadata hashes to request for analyst mode');
5755
} catch (error) {

web/src/helpers/metadataProcessor.ts

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { get, isEmpty } from 'lodash';
1212
import { MetadataProcessingResult, MetadataHashInfo, setMetadataHash, setMetadataProcessingCache, clearMetadataProcessingCache } from '../state/settings/reducer';
1313
import { getState } from '../state/store';
1414
import { dispatch } from '../state/dispatch';
15-
import { getAllCardsAndModels, getDatabaseTablesAndModelsWithoutFields, getAllFields } from 'apps'
15+
import { getAllCardsAndModels, getDatabaseTablesAndModelsWithoutFields, getAllFields, getRelevantTablesAndDetailsForSelectedDb } from 'apps'
1616
import { fetchDatabaseFields } from '../../../apps/src/metabase/helpers/metabaseAPI';
1717
import { getSelectedDbId } from '../../../apps/src/metabase/helpers/metabaseStateAPI';
1818
import { getModelsWithFields } from '../../../apps/src/metabase/helpers/metabaseModels';
@@ -292,8 +292,8 @@ export async function processAllMetadata(forceRefresh:boolean = false, currentDB
292292
const processingPromise = (async () => {
293293
try {
294294

295-
const [dbSchema, { cards, tables: referencedTables, modelFields }, allFields] = await Promise.all([
296-
getDatabaseTablesAndModelsWithoutFields(selectedDbId, forceRefresh, forceRefresh),
295+
const [dbSchema, { cards }, allFields] = await Promise.all([
296+
getRelevantTablesAndDetailsForSelectedDb(selectedDbId, forceRefresh),
297297
getAllCardsAndModels(forceRefresh, selectedDbId),
298298
forceRefresh ? fetchDatabaseFields.refresh({ db_id: selectedDbId }) : fetchDatabaseFields({ db_id: selectedDbId })
299299
])
@@ -303,15 +303,13 @@ export async function processAllMetadata(forceRefresh:boolean = false, currentDB
303303

304304
console.log('[minusx] Fields after filtering:', filteredFields.length, 'out of', allFields.length)
305305

306-
console.log("[minusx] modelFields: ", modelFields.length)
307306
// Step 5: Process metadata for all four with filtered data
308307
console.log('[minusx] Processing metadata with filtered data...')
309308

310-
const [cardsHash, dbSchemaHash, fieldsHash, modelFieldsHash] = await Promise.all([
309+
const [cardsHash, dbSchemaHash, fieldsHash] = await Promise.all([
311310
processMetadataWithCaching('cards', async () => cards, selectedDbId),
312311
processMetadataWithCaching('dbSchema', async () => dbSchema, selectedDbId),
313312
processMetadataWithCaching('fields', async () => filteredFields, selectedDbId),
314-
processMetadataWithCaching('modelFields', async () => modelFields, selectedDbId)
315313
])
316314

317315
console.log('[minusx] Coordinated metadata processing complete')
@@ -320,7 +318,6 @@ export async function processAllMetadata(forceRefresh:boolean = false, currentDB
320318
cardsHash,
321319
dbSchemaHash,
322320
fieldsHash,
323-
modelFieldsHash,
324321
selectedDbId
325322
}
326323

web/src/state/settings/reducer.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ export interface MetadataProcessingResult {
99
cardsHash?: string;
1010
dbSchemaHash?: string;
1111
fieldsHash?: string;
12-
modelFieldsHash?: string;
1312
selectedDbId?: number;
1413
}
1514

0 commit comments

Comments
 (0)