Skip to content

Commit b7742dc

Browse files
committed
Add Name Search Scope direcives to endpoints
1 parent f1a3783 commit b7742dc

File tree

13 files changed

+77
-51
lines changed

13 files changed

+77
-51
lines changed

sql/2025-09-17_optional_transitive_names.sql

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
-- Add an additional argument for whether to include dependencies or transitive dependencies.
2-
CREATE OR REPLACE FUNCTION term_names_for_ref_within_namespace(
2+
CREATE FUNCTION term_names_for_ref(
33
arg_bh_id integer,
44
arg_namespace_prefix text,
55
arg_reversed_name_prefix text,
@@ -8,8 +8,8 @@ CREATE OR REPLACE FUNCTION term_names_for_ref_within_namespace(
88
arg_referent_component_hash_id integer,
99
arg_referent_component_index bigint,
1010
arg_referent_constructor_index bigint,
11-
arg_include_dependencies boolean DEFAULT true,
12-
arg_include_transitive_dependencies boolean DEFAULT true
11+
arg_include_dependencies boolean,
12+
arg_include_transitive_dependencies boolean
1313
) RETURNS TABLE (
1414
reversed_name text,
1515
suffixified_name text
@@ -100,16 +100,16 @@ END;
100100
$$ LANGUAGE plpgsql STABLE;
101101

102102

103-
CREATE OR REPLACE FUNCTION type_names_for_ref_within_namespace(
103+
CREATE FUNCTION type_names_for_ref(
104104
arg_bh_id integer,
105105
arg_namespace_prefix text,
106106
arg_reversed_name_prefix text,
107107
arg_should_suffixify boolean,
108108
arg_reference_builtin text,
109109
arg_reference_component_hash_id integer,
110110
arg_reference_component_index bigint,
111-
arg_include_dependencies boolean DEFAULT true,
112-
arg_include_transitive_dependencies boolean DEFAULT true
111+
arg_include_dependencies boolean,
112+
arg_include_transitive_dependencies boolean
113113
) RETURNS TABLE (
114114
reversed_name text,
115115
suffixified_name text

src/Share/BackgroundJobs/Search/DefinitionSync.hs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import Share.Postgres qualified as PG
3030
import Share.Postgres.Cursors qualified as Cursors
3131
import Share.Postgres.IDs (BranchHashId)
3232
import Share.Postgres.NameLookups.Ops qualified as NLOps
33+
import Share.Postgres.NameLookups.Queries (NameSearchScope (..))
3334
import Share.Postgres.NamesPerspective.Ops qualified as NPOps
3435
import Share.Postgres.NamesPerspective.Types (NamesPerspective (..))
3536
import Share.Postgres.Notifications qualified as Notif
@@ -243,7 +244,7 @@ syncTerms codebase namesPerspective rootBranchHashId termsCursor = do
243244

244245
-- It's much more efficient to build only one PPE per batch.
245246
let allDeps = setOf (folded . folding tokens . folded . to LD.TypeReference) refDocs
246-
pped <- PG.timeTransaction "Build PPED" $ PPEPostgres.ppedForReferences namesPerspective allDeps
247+
pped <- PG.timeTransaction "Build PPED" $ PPEPostgres.ppedForReferences TransitiveDependencies namesPerspective allDeps
247248
let ppe = PPED.unsuffixifiedPPE pped
248249
let namedDocs :: [DefinitionDocument Name (Name, ShortHash)]
249250
namedDocs =
@@ -426,7 +427,7 @@ syncTypes codebase codeCache namesPerspective rootBranchHashId typesCursor = do
426427
}
427428
-- It's much more efficient to build only one PPE per batch.
428429
let allDeps = setOf (folded . folding tokens . folded . to LD.TypeReference) defDocuments
429-
pped <- PPEPostgres.ppedForReferences namesPerspective allDeps
430+
pped <- PPEPostgres.ppedForReferences TransitiveDependencies namesPerspective allDeps
430431
let ppe = PPED.unsuffixifiedPPE pped
431432
let namedDocs :: V.Vector (DefinitionDocument Name (Name, ShortHash))
432433
namedDocs =

src/Share/Names/Postgres.hs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import Data.Set qualified as Set
77
import Share.Postgres qualified as PG
88
import Share.Postgres.NameLookups.Conversions qualified as CV
99
import Share.Postgres.NameLookups.Ops qualified as NameLookupOps
10-
import Share.Postgres.NameLookups.Queries (ShouldSuffixify (NoSuffixify))
10+
import Share.Postgres.NameLookups.Queries (NameSearchScope, ShouldSuffixify (NoSuffixify))
1111
import Share.Postgres.NameLookups.Types qualified as NameLookups
1212
import Share.Postgres.NamesPerspective.Types (NamesPerspective)
1313
import Share.Postgres.Refs.Types
@@ -19,8 +19,8 @@ import Unison.Names qualified as Names
1919
import Unison.Reference qualified as V1
2020
import Unison.Referent qualified as V1
2121

22-
namesForReferences :: forall m. (PG.QueryM m) => NamesPerspective m -> Set LabeledDependency -> m Names
23-
namesForReferences namesPerspective refs = do
22+
namesForReferences :: forall m. (PG.QueryM m) => NameSearchScope -> NamesPerspective m -> Set LabeledDependency -> m Names
23+
namesForReferences namesScope namesPerspective refs = do
2424
(pgRefTerms, pgRefTypes) <-
2525
Set.toList refs
2626
& CV.labeledDependencies1ToPG
@@ -38,7 +38,7 @@ namesForReferences namesPerspective refs = do
3838
& asListOf trav %%~ \refs -> do
3939
let pgRefs = snd <$> refs
4040
typeNames :: [[(NameLookups.ReversedName, NameLookups.ReversedName)]] <-
41-
NameLookupOps.typeNamesForRefsWithinNamespaceOf namesPerspective Nothing NoSuffixify traversed pgRefs
41+
NameLookupOps.typeNamesForRefsWithinNamespaceOf namesPerspective Nothing NoSuffixify namesScope traversed pgRefs
4242
pure $ do
4343
((ref, _pgRef), names) <- zip refs typeNames
4444
pure $ do
@@ -51,7 +51,7 @@ namesForReferences namesPerspective refs = do
5151
& asListOf trav %%~ \refs -> do
5252
let pgRefs = snd <$> refs
5353
termNames :: [[(NameLookups.ReversedName, NameLookups.ReversedName)]] <-
54-
NameLookupOps.termNamesForRefsWithinNamespaceOf namesPerspective Nothing NoSuffixify traversed pgRefs
54+
NameLookupOps.termNamesForRefsWithinNamespaceOf namesPerspective Nothing NoSuffixify namesScope traversed pgRefs
5555
pure $ do
5656
((ref, _pgRef), names) <- zip refs termNames
5757
pure $ do

src/Share/NamespaceDiffs.hs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ import Share.Postgres qualified as PG
5353
import Share.Postgres.Definitions.Queries qualified as DefnsQ
5454
import Share.Postgres.IDs (BranchHashId)
5555
import Share.Postgres.NameLookups.Ops qualified as NL
56+
import Share.Postgres.NameLookups.Queries (NameSearchScope (TransitiveDependencies))
5657
import Share.Postgres.NameLookups.Types (NameLookupReceipt)
5758
import Share.Postgres.NameLookups.Types qualified as NL
5859
import Share.Postgres.NamesPerspective.Ops qualified as NPOps
@@ -298,7 +299,7 @@ computeThreeWayNamespaceDiff codebaseEnvs2 aliceCodeCache bobCodeCache branchHas
298299
traverse NPOps.namesPerspectiveForRoot branchHashIds
299300
names <-
300301
PG.transactionSpan "load names" mempty do
301-
sequence (PGNames.namesForReferences <$> perspectives <*> ThreeWay.toTwoOrThreeWay dependencies)
302+
sequence (PGNames.namesForReferences TransitiveDependencies <$> perspectives <*> ThreeWay.toTwoOrThreeWay dependencies)
302303
pure (TwoOrThreeWay.toThreeWay Names.empty names)
303304

304305
Merge.makeDiffblob

src/Share/Postgres/NameLookups/Ops.hs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,20 +74,20 @@ fuzzySearchDefinitions includeDependencies namesPerspective@NamesPerspective {re
7474

7575
-- | Get the list of (fqn, suffixified) names for a given Referent.
7676
-- If 'shouldSuffixify' is 'NoSuffixify', the suffixified name will be the same as the fqn.
77-
termNamesForRefsWithinNamespaceOf :: (PG.QueryM m) => NamesPerspective m -> Maybe ReversedName -> ShouldSuffixify -> Traversal s t PGReferent [(ReversedName, ReversedName)] -> s -> m t
78-
termNamesForRefsWithinNamespaceOf namesPerspective maySuffix shouldSuffixify trav s = do
77+
termNamesForRefsWithinNamespaceOf :: (PG.QueryM m) => NamesPerspective m -> Maybe ReversedName -> ShouldSuffixify -> Q.NameSearchScope -> Traversal s t PGReferent [(ReversedName, ReversedName)] -> s -> m t
78+
termNamesForRefsWithinNamespaceOf namesPerspective maySuffix shouldSuffixify nameScope trav s = do
7979
s
8080
& asListOf trav %%~ \refs -> do
81-
NameLookupQ.termNamesForRefsWithinNamespaceOf namesPerspective maySuffix shouldSuffixify traversed refs
81+
NameLookupQ.termNamesForRefsWithinNamespaceOf namesPerspective maySuffix shouldSuffixify nameScope traversed refs
8282
<&> (fmap . fmap) \(NameWithSuffix {reversedName, suffixifiedName}) -> (reversedName, suffixifiedName)
8383

8484
-- | Get the list of (fqn, suffixified) names for a given Reference.
8585
-- If 'shouldSuffixify' is 'NoSuffixify', the suffixified name will be the same as the fqn.
86-
typeNamesForRefsWithinNamespaceOf :: (PG.QueryM m) => NamesPerspective m -> Maybe ReversedName -> ShouldSuffixify -> Traversal s t PGReference [(ReversedName, ReversedName)] -> s -> m t
87-
typeNamesForRefsWithinNamespaceOf namesPerspective maySuffix shouldSuffixify trav s = do
86+
typeNamesForRefsWithinNamespaceOf :: (PG.QueryM m) => NamesPerspective m -> Maybe ReversedName -> ShouldSuffixify -> Q.NameSearchScope -> Traversal s t PGReference [(ReversedName, ReversedName)] -> s -> m t
87+
typeNamesForRefsWithinNamespaceOf namesPerspective maySuffix shouldSuffixify nameScope trav s = do
8888
s
8989
& asListOf trav %%~ \refs -> do
90-
NameLookupQ.typeNamesForRefsWithinNamespaceOf namesPerspective maySuffix shouldSuffixify traversed refs
90+
NameLookupQ.typeNamesForRefsWithinNamespaceOf namesPerspective maySuffix shouldSuffixify nameScope traversed refs
9191
<&> (fmap . fmap) \(NameWithSuffix {reversedName, suffixifiedName}) -> (reversedName, suffixifiedName)
9292

9393
termRefsForExactNamesOf :: (PG.QueryM m) => NamesPerspective m -> Traversal s t ReversedName [NamedRef V1.Referent] -> s -> m t

src/Share/Postgres/NameLookups/Queries.hs

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
module Share.Postgres.NameLookups.Queries
55
( termNamesForRefsWithinNamespaceOf,
66
typeNamesForRefsWithinNamespaceOf,
7+
NameSearchScope (..),
78
ShouldSuffixify (..),
89
termRefsForExactNamesOf,
910
typeRefsForExactNamesOf,
@@ -52,13 +53,19 @@ import Unison.Util.Monoid qualified as Monoid
5253

5354
data ShouldSuffixify = Suffixify | NoSuffixify
5455

56+
data NameSearchScope
57+
= ProjectDefinitions
58+
| Dependencies
59+
| TransitiveDependencies
60+
deriving (Show, Eq, Ord)
61+
5562
-- | Get the list of term names and suffixifications for a given Referent within a given root namespace perspective.
5663
-- Considers one level of dependencies, but not transitive dependencies.
5764
--
5865
-- If NoSuffixify is provided, the suffixified name will be the same as the fqn.
5966
termNamesForRefsWithinNamespaceOf ::
60-
(PG.QueryM m) => NamesPerspective m -> Maybe ReversedName -> ShouldSuffixify -> Traversal s t PGReferent [NameWithSuffix] -> s -> m t
61-
termNamesForRefsWithinNamespaceOf np maySuffix shouldSuffixify trav s = do
67+
(PG.QueryM m) => NamesPerspective m -> Maybe ReversedName -> ShouldSuffixify -> NameSearchScope -> Traversal s t PGReferent [NameWithSuffix] -> s -> m t
68+
termNamesForRefsWithinNamespaceOf np maySuffix shouldSuffixify nameScope trav s = do
6269
s & asListOf trav \refs -> do
6370
let refsTable :: [(Int32, Maybe Text, Maybe ComponentHashId, Maybe Int64, Maybe Int64)]
6471
refsTable =
@@ -74,22 +81,28 @@ termNamesForRefsWithinNamespaceOf np maySuffix shouldSuffixify trav s = do
7481
-- Need COALESCE because array_agg will return NULL rather than the empty array
7582
-- if there are no results.
7683
SELECT COALESCE(array_agg((names.reversed_name, names.suffixified_name) ORDER BY length(names.reversed_name) ASC), '{}')
77-
FROM term_names_for_ref_within_namespace(
84+
FROM term_names_for_ref(
7885
#{bhId},
7986
#{namespacePrefix},
8087
#{reversedNamePrefix},
8188
#{shouldSuffixifyArg},
8289
refs.referent_builtin,
8390
refs.referent_component_hash_id,
8491
refs.referent_component_index,
85-
refs.referent_constructor_index
92+
refs.referent_constructor_index,
93+
#{includeDependencies},
94+
#{includeTransitiveDependencies}
8695
) AS names(reversed_name, suffixified_name)
8796
) AS ref_names
8897
FROM refs
8998
ORDER BY refs.ord ASC
9099
|]
91100
<&> over (traversed . traversed . field @"reversedName") (qualifyNameToPerspective np)
92101
where
102+
(includeDependencies, includeTransitiveDependencies) = case nameScope of
103+
ProjectDefinitions -> (False, False)
104+
Dependencies -> (True, False)
105+
TransitiveDependencies -> (True, True)
93106
-- Look in the current mount.
94107
bhId = perspectiveCurrentMountBranchHashId np
95108
shouldSuffixifyArg = case shouldSuffixify of
@@ -104,8 +117,8 @@ termNamesForRefsWithinNamespaceOf np maySuffix shouldSuffixify trav s = do
104117
-- Considers one level of dependencies, but not transitive dependencies.
105118
--
106119
-- If NoSuffixify is provided, the suffixified name will be the same as the fqn.
107-
typeNamesForRefsWithinNamespaceOf :: (PG.QueryM m) => NamesPerspective m -> Maybe ReversedName -> ShouldSuffixify -> Traversal s t PGReference [NameWithSuffix] -> s -> m t
108-
typeNamesForRefsWithinNamespaceOf np maySuffix shouldSuffixify trav s = do
120+
typeNamesForRefsWithinNamespaceOf :: (PG.QueryM m) => NamesPerspective m -> Maybe ReversedName -> ShouldSuffixify -> NameSearchScope -> Traversal s t PGReference [NameWithSuffix] -> s -> m t
121+
typeNamesForRefsWithinNamespaceOf np maySuffix shouldSuffixify nameScope trav s = do
109122
s & asListOf trav \refs -> do
110123
let refsTable :: [(Int32, Maybe Text, Maybe ComponentHashId, Maybe Int64)]
111124
refsTable =
@@ -121,21 +134,27 @@ typeNamesForRefsWithinNamespaceOf np maySuffix shouldSuffixify trav s = do
121134
-- Need COALESCE because array_agg will return NULL rather than the empty array
122135
-- if there are no results.
123136
SELECT COALESCE(array_agg((names.reversed_name, names.suffixified_name) ORDER BY length(names.reversed_name) ASC), '{}')
124-
FROM type_names_for_ref_within_namespace(
137+
FROM type_names_for_ref(
125138
#{bhId},
126139
#{namespacePrefix},
127140
#{reversedNamePrefix},
128141
#{shouldSuffixifyArg},
129142
refs.reference_builtin,
130143
refs.reference_component_hash_id,
131-
refs.reference_component_index
144+
refs.reference_component_index,
145+
#{includeDependencies},
146+
#{includeTransitiveDependencies}
132147
) AS names(reversed_name, suffixified_name)
133148
) AS ref_names
134149
FROM refs
135150
ORDER BY refs.ord ASC
136151
|]
137152
<&> over (traversed . traversed . field @"reversedName") (qualifyNameToPerspective np)
138153
where
154+
(includeDependencies, includeTransitiveDependencies) = case nameScope of
155+
ProjectDefinitions -> (False, False)
156+
Dependencies -> (True, False)
157+
TransitiveDependencies -> (True, True)
139158
bhId = perspectiveCurrentMountBranchHashId np
140159
shouldSuffixifyArg = case shouldSuffixify of
141160
Suffixify -> True

src/Share/PrettyPrintEnvDecl/Postgres.hs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import Data.Set qualified as Set
77
import Share.Postgres qualified as PG
88
import Share.Postgres.NameLookups.Conversions qualified as CV
99
import Share.Postgres.NameLookups.Ops qualified as NameLookupOps
10-
import Share.Postgres.NameLookups.Queries (ShouldSuffixify (..))
10+
import Share.Postgres.NameLookups.Queries (NameSearchScope, ShouldSuffixify (..))
1111
import Share.Postgres.NameLookups.Types qualified as NameLookups
1212
import Share.Postgres.NamesPerspective.Types (NamesPerspective)
1313
import Share.Postgres.Refs.Types
@@ -20,8 +20,8 @@ import Unison.PrettyPrintEnvDecl qualified as PPED
2020
import Unison.Reference qualified as V1
2121
import Unison.Referent qualified as V1
2222

23-
ppedForReferences :: forall m. (PG.QueryM m) => NamesPerspective m -> Set LabeledDependency -> m PPED.PrettyPrintEnvDecl
24-
ppedForReferences namesPerspective refs = do
23+
ppedForReferences :: forall m. (PG.QueryM m) => NameSearchScope -> NamesPerspective m -> Set LabeledDependency -> m PPED.PrettyPrintEnvDecl
24+
ppedForReferences nameScope namesPerspective refs = do
2525
(pgRefTerms, pgRefTypes) <-
2626
Set.toList refs
2727
& CV.labeledDependencies1ToPG
@@ -38,7 +38,7 @@ ppedForReferences namesPerspective refs = do
3838
& asListOf trav %%~ \refs -> do
3939
let pgRefs = snd <$> refs
4040
termNames :: [[(NameLookups.ReversedName, NameLookups.ReversedName)]] <-
41-
NameLookupOps.termNamesForRefsWithinNamespaceOf namesPerspective Nothing Suffixify traversed pgRefs
41+
NameLookupOps.termNamesForRefsWithinNamespaceOf namesPerspective Nothing Suffixify nameScope traversed pgRefs
4242
pure $ do
4343
((ref, _pgRef), names) <- zip refs termNames
4444
pure $ do
@@ -50,7 +50,7 @@ ppedForReferences namesPerspective refs = do
5050
& asListOf trav %%~ \refs -> do
5151
let pgRefs = snd <$> refs
5252
typeNames :: [[(NameLookups.ReversedName, NameLookups.ReversedName)]] <-
53-
NameLookupOps.typeNamesForRefsWithinNamespaceOf namesPerspective Nothing Suffixify traversed pgRefs
53+
NameLookupOps.typeNamesForRefsWithinNamespaceOf namesPerspective Nothing Suffixify nameScope traversed pgRefs
5454
pure $ do
5555
((ref, _pgRef), names) <- zip refs typeNames
5656
pure $ do

src/Share/Web/Share/Diffs/Impl.hs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import Share.Postgres.Causal.Queries qualified as CausalQ
2323
import Share.Postgres.Contributions.Queries qualified as ContributionQ
2424
import Share.Postgres.Hashes.Queries qualified as HashQ
2525
import Share.Postgres.IDs (BranchHash, BranchHashId, CausalId)
26+
import Share.Postgres.NameLookups.Queries (NameSearchScope (TransitiveDependencies))
2627
import Share.Postgres.NameLookups.Types (NameLookupReceipt)
2728
import Share.Postgres.NamesPerspective.Ops qualified as NLOps
2829
import Share.Postgres.NamesPerspective.Types (NamesPerspective (..))
@@ -294,7 +295,7 @@ getTermDefinitionsOf codebase rt namesPerspective trav s = do
294295
Definitions.termDefinitionByNamesOf codebase ppedBuilder namesPerspective renderWidth rt includeDocs traversed names
295296
where
296297
includeDocs = False
297-
ppedBuilder deps = PPEPostgres.ppedForReferences namesPerspective deps
298+
ppedBuilder deps = PPEPostgres.ppedForReferences TransitiveDependencies namesPerspective deps
298299
renderWidth :: Width
299300
renderWidth = 80
300301

@@ -336,7 +337,7 @@ expectTermDefinitionsByNamedRefsOf codebase rt namesPerspective toReferent trav
336337
(map (\name -> (name, toReferent name)) names)
337338
where
338339
includeDocs = False
339-
ppedBuilder deps = PPEPostgres.ppedForReferences namesPerspective deps
340+
ppedBuilder deps = PPEPostgres.ppedForReferences TransitiveDependencies namesPerspective deps
340341
renderWidth :: Width
341342
renderWidth = 80
342343

@@ -371,7 +372,7 @@ getTypeDefinitionsOf codebase rt namesPerspective trav s = do
371372
Definitions.typeDefinitionsByNamesOf codebase ppedBuilder namesPerspective renderWidth rt includeDocs traversed names
372373
where
373374
includeDocs = False
374-
ppedBuilder = PPEPostgres.ppedForReferences namesPerspective
375+
ppedBuilder = PPEPostgres.ppedForReferences TransitiveDependencies namesPerspective
375376
renderWidth :: Width
376377
renderWidth = 80
377378

@@ -398,7 +399,7 @@ expectTypeDefinitionsByNamedRefsOf codebase rt namesPerspective toReference trav
398399
(map (\name -> (name, toReference name)) names)
399400
where
400401
includeDocs = False
401-
ppedBuilder = PPEPostgres.ppedForReferences namesPerspective
402+
ppedBuilder = PPEPostgres.ppedForReferences TransitiveDependencies namesPerspective
402403
renderWidth :: Width
403404
renderWidth = 80
404405

0 commit comments

Comments
 (0)