@@ -465,6 +465,39 @@ func (r *PostgresRepository) GetMetadataFields(ctx context.Context) ([]MetadataF
465465
466466 UNION ALL
467467
468+ SELECT
469+ key as path,
470+ key as field,
471+ value,
472+ jsonb_typeof(value) as type,
473+ 1 as depth,
474+ ARRAY[key] as path_parts,
475+ ARRAY[jsonb_typeof(value)] as types
476+ FROM glossary_terms,
477+ jsonb_each(metadata)
478+ WHERE metadata IS NOT NULL
479+ AND metadata != '{}'::jsonb
480+ AND jsonb_typeof(metadata) = 'object'
481+ AND deleted_at IS NULL
482+
483+ UNION ALL
484+
485+ SELECT
486+ key as path,
487+ key as field,
488+ value,
489+ jsonb_typeof(value) as type,
490+ 1 as depth,
491+ ARRAY[key] as path_parts,
492+ ARRAY[jsonb_typeof(value)] as types
493+ FROM teams,
494+ jsonb_each(metadata)
495+ WHERE metadata IS NOT NULL
496+ AND metadata != '{}'::jsonb
497+ AND jsonb_typeof(metadata) = 'object'
498+
499+ UNION ALL
500+
468501 SELECT
469502 mk.path || '.' || e.key,
470503 e.key,
@@ -497,8 +530,16 @@ func (r *PostgresRepository) GetMetadataFieldsWithContext(ctx context.Context, q
497530 SELECT id FROM assets
498531 WHERE search_text @@ websearch_to_tsquery('english', $1) AND is_stub = FALSE
499532 ),
533+ matching_glossary AS (
534+ SELECT id FROM glossary_terms
535+ WHERE search_text @@ websearch_to_tsquery('english', $1) AND deleted_at IS NULL
536+ ),
537+ matching_teams AS (
538+ SELECT id FROM teams
539+ WHERE search_text @@ websearch_to_tsquery('english', $1)
540+ ),
500541 metadata_stats AS (
501- SELECT
542+ SELECT
502543 key as field,
503544 jsonb_typeof(value) as type,
504545 COUNT(*) as count,
@@ -508,15 +549,42 @@ func (r *PostgresRepository) GetMetadataFieldsWithContext(ctx context.Context, q
508549 jsonb_each(metadata)
509550 WHERE metadata != '{}'::jsonb
510551 GROUP BY key, jsonb_typeof(value)
552+
553+ UNION ALL
554+
555+ SELECT
556+ key as field,
557+ jsonb_typeof(value) as type,
558+ COUNT(*) as count,
559+ MODE() WITHIN GROUP (ORDER BY value) as example
560+ FROM glossary_terms g
561+ JOIN matching_glossary mg ON g.id = mg.id,
562+ jsonb_each(metadata)
563+ WHERE metadata != '{}'::jsonb
564+ GROUP BY key, jsonb_typeof(value)
565+
566+ UNION ALL
567+
568+ SELECT
569+ key as field,
570+ jsonb_typeof(value) as type,
571+ COUNT(*) as count,
572+ MODE() WITHIN GROUP (ORDER BY value) as example
573+ FROM teams t
574+ JOIN matching_teams mt ON t.id = mt.id,
575+ jsonb_each(metadata)
576+ WHERE metadata != '{}'::jsonb
577+ GROUP BY key, jsonb_typeof(value)
511578 )
512- SELECT
579+ SELECT
513580 field,
514581 type,
515- count,
516- example,
582+ SUM(count)::bigint as count,
583+ (array_agg(example ORDER BY count DESC))[1] as example,
517584 ARRAY[field] as path_parts,
518585 ARRAY[type] as types
519586 FROM metadata_stats
587+ GROUP BY field, type
520588 ORDER BY count DESC, field ASC`
521589
522590 return r .scanMetadataFields (ctx , query , queryContext .Query )
@@ -615,16 +683,30 @@ func (r *PostgresRepository) GetMetadataValues(ctx context.Context, field string
615683 return r .scanMetadataValues (ctx , query , prefix , limit )
616684
617685 default :
618- // Regular metadata field query
619686 pathArray := strings .Split (field , "." )
620687 query := `
621- WITH RECURSIVE MetadataValues AS (
688+ WITH MetadataValues AS (
622689 SELECT
623- a.id,
624- jsonb_extract_path(a.metadata, VARIADIC $1::text[]) as value,
625- 1 as level
690+ a.id::text,
691+ jsonb_extract_path(a.metadata, VARIADIC $1::text[]) as value
626692 FROM assets a
627693 WHERE jsonb_typeof(jsonb_extract_path(a.metadata, VARIADIC $1::text[])) != 'null' AND is_stub = FALSE
694+
695+ UNION ALL
696+
697+ SELECT
698+ g.id::text,
699+ jsonb_extract_path(g.metadata, VARIADIC $1::text[]) as value
700+ FROM glossary_terms g
701+ WHERE jsonb_typeof(jsonb_extract_path(g.metadata, VARIADIC $1::text[])) != 'null' AND deleted_at IS NULL
702+
703+ UNION ALL
704+
705+ SELECT
706+ t.id::text,
707+ jsonb_extract_path(t.metadata, VARIADIC $1::text[]) as value
708+ FROM teams t
709+ WHERE jsonb_typeof(jsonb_extract_path(t.metadata, VARIADIC $1::text[])) != 'null'
628710 )
629711 SELECT
630712 value::text,
@@ -725,21 +807,50 @@ func (r *PostgresRepository) GetMetadataValuesWithContext(ctx context.Context, f
725807 return r .scanMetadataValues (ctx , query , queryContext .Query , prefix , limit )
726808
727809 default :
728- // Regular metadata field query
729810 query := `
730811 WITH matching_assets AS (
731812 SELECT id FROM assets
732813 WHERE search_text @@ websearch_to_tsquery('english', $1) AND is_stub = FALSE
733814 ),
815+ matching_glossary AS (
816+ SELECT id FROM glossary_terms
817+ WHERE search_text @@ websearch_to_tsquery('english', $1) AND deleted_at IS NULL
818+ ),
819+ matching_teams AS (
820+ SELECT id FROM teams
821+ WHERE search_text @@ websearch_to_tsquery('english', $1)
822+ ),
734823 MetadataValues AS (
735824 SELECT
736- a.id,
825+ a.id::text ,
737826 je.key,
738827 je.value
739828 FROM assets a
740829 JOIN matching_assets ma ON a.id = ma.id
741830 CROSS JOIN LATERAL jsonb_each(a.metadata) AS je
742831 WHERE a.metadata IS NOT NULL
832+
833+ UNION ALL
834+
835+ SELECT
836+ g.id::text,
837+ je.key,
838+ je.value
839+ FROM glossary_terms g
840+ JOIN matching_glossary mg ON g.id = mg.id
841+ CROSS JOIN LATERAL jsonb_each(g.metadata) AS je
842+ WHERE g.metadata IS NOT NULL
843+
844+ UNION ALL
845+
846+ SELECT
847+ t.id::text,
848+ je.key,
849+ je.value
850+ FROM teams t
851+ JOIN matching_teams mt ON t.id = mt.id
852+ CROSS JOIN LATERAL jsonb_each(t.metadata) AS je
853+ WHERE t.metadata IS NOT NULL
743854 )
744855 SELECT
745856 value::text,
0 commit comments