55 * from metabaseAPI.ts and state functions from metabaseStateAPI.ts.
66 */
77
8- import _ , { map , get , isEmpty , flatMap , filter , sortBy , reverse , pick , omit } from 'lodash' ;
8+ import _ , { map , get , isEmpty , flatMap , filter , sortBy , reverse , pick , omit , partition } from 'lodash' ;
99import { getTablesFromSqlRegex , TableAndSchema } from './parseSql' ;
1010import { handlePromise , deterministicSample } from '../../common/utils' ;
1111import { getCurrentUserInfo , getSelectedDbId } from './metabaseStateAPI' ;
@@ -189,7 +189,16 @@ export async function getDatabases() {
189189 return await fetchDatabases ( { } ) as DatabaseResponse ;
190190}
191191
192- export async function getAllCards ( forceRefresh = false ) {
192+ type ResultMetadataElm = {
193+ display_name : string ;
194+ source : string ;
195+ name : string ;
196+ base_type : string ;
197+ semantic_type : string ;
198+ field_ref : [ string , string , { "base-type" : string } ] ;
199+ } ;
200+
201+ export async function getAllCardsAndModels ( forceRefresh = false ) {
193202 const cards = await handlePromise (
194203 forceRefresh ? fetchCards . refresh ( { } ) : fetchCards ( { } ) ,
195204 "[minusx] Error getting all cards" ,
@@ -207,18 +216,18 @@ export async function getAllCards(forceRefresh = false) {
207216 console . log ( '[minusx] getAllCards - Total cards:' , cards ) ;
208217
209218 // Filter cards by database_id and last_used_at (last 3 months only)
210- const filteredCards = filter ( cards , ( card ) => {
219+ const filteredCardsAndModels = filter ( cards , ( card ) => {
211220 const lastUsedAt = get ( card , 'last_used_at' ) ;
212221 const databaseId = get ( card , 'database_id' ) ;
213222
214223 // Filter by selected database and last 3 months
215224 const matchesDatabase = selectedDbId ? databaseId === selectedDbId : true ;
216225 const isRecent = lastUsedAt && lastUsedAt > cutoffDate ;
217- const isModel = get ( card , 'type' ) === 'model' ;
218226
219- return matchesDatabase && isRecent && ! isModel ;
227+ return matchesDatabase && isRecent ;
220228 } ) ;
221-
229+ // split into cards and models
230+ const [ filteredCards , filteredModels ] = partition ( filteredCardsAndModels , ( card ) => get ( card , 'type' ) !== 'model' ) ;
222231 // Sort by view_count descending
223232 // if length > 1000, limit to 1000
224233 const sortedCards = reverse ( sortBy ( filteredCards , 'view_count' ) ) ;
@@ -261,7 +270,25 @@ export async function getAllCards(forceRefresh = false) {
261270
262271 return cleanCard ;
263272 } ) ;
264-
273+
274+ const processedModelFields = filteredModels . flatMap ( ( model ) => {
275+ const result_metadata = get ( model , 'result_metadata' , [ ] )
276+ if ( result_metadata == null ) {
277+ console . warn ( "[minusx] model has no result_metadata: " , model )
278+ return [ ]
279+ }
280+ const columns = result_metadata . map ( ( column : ResultMetadataElm ) => {
281+ return {
282+ id : get ( column , 'name' ) ,
283+ name : get ( column , 'name' ) ,
284+ type : get ( column , 'base_type' ) ,
285+ model_id : get ( model , 'id' ) ,
286+ model_name : get ( model , 'name' )
287+ }
288+ } )
289+ return columns
290+ } )
291+
265292 console . log ( 'Processed cards:' , processedCards ) ;
266293 const tables : Record < string , TableAndSchema > = { } ;
267294 _ . forEach ( processedCards , ( card ) => {
@@ -279,11 +306,11 @@ export async function getAllCards(forceRefresh = false) {
279306 const relevantTables = _ . chain ( tables ) . values ( ) . sortBy ( 'count' ) . reverse ( ) . value ( ) ;
280307 console . log ( 'Tables from cards:' , relevantTables ) ;
281308
282- return { cards : processedCards , tables : relevantTables } ;
309+ return { cards : processedCards , tables : relevantTables , modelFields : processedModelFields } ;
283310}
284311
285312export async function getAllCardsLegacy ( ) {
286- const result = await getAllCards ( ) ;
313+ const result = await getAllCardsAndModels ( ) ;
287314 return result . cards ;
288315}
289316
0 commit comments