Skip to content

Commit 97f3c52

Browse files
authored
Merge pull request #134 from unisoncomputing/narrow
feat: more efficient diffs
2 parents 8a56c15 + ee68692 commit 97f3c52

File tree

20 files changed

+811
-1276
lines changed

20 files changed

+811
-1276
lines changed

.github/workflows/ci.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ jobs:
238238
239239
# Install ucm
240240
mkdir ucm
241-
curl -L https://github.com/unisonweb/unison/releases/download/release%2F0.5.44/ucm-linux-x64.tar.gz | tar -xz -C ucm
241+
curl -L https://github.com/unisonweb/unison/releases/download/release%2F0.5.45/ucm-linux-x64.tar.gz | tar -xz -C ucm
242242
export PATH=$PWD/ucm:$PATH
243243
244244
# Start share and it's dependencies in the background

src/Share/Backend.hs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ import Data.Map qualified as Map
4141
import Data.Set qualified as Set
4242
import Share.Codebase qualified as Codebase
4343
import Share.Codebase.CodeCache qualified as CC
44-
import Share.Codebase.Types (CodebaseRuntime (CodebaseRuntime, cachedEvalResult))
44+
import Share.Codebase.Types (CodeCache, CodebaseRuntime (CodebaseRuntime, cachedEvalResult))
4545
import Share.Postgres (QueryM)
4646
import Share.Postgres qualified as PG
4747
import Share.Postgres.Causal.Conversions (namespaceStatsPgToV2)
@@ -69,7 +69,7 @@ import Unison.NameSegment.Internal (NameSegment (..))
6969
import Unison.Parser.Ann (Ann)
7070
import Unison.PrettyPrintEnv qualified as PPE
7171
import Unison.PrettyPrintEnvDecl qualified as PPED
72-
import Unison.Reference (Reference)
72+
import Unison.Reference (Reference, TermReference, TypeReference)
7373
import Unison.Reference qualified as Reference
7474
import Unison.Referent qualified as Referent
7575
import Unison.Runtime.IOSource qualified as DD
@@ -248,8 +248,13 @@ getTypeTagsOf trav s = do
248248
Just CT.Data -> Data
249249
Just CT.Effect -> Ability
250250

251-
displayTermsOf :: (QueryM m) => Codebase.CodebaseEnv -> Traversal s t Reference (DisplayObject (Type Symbol Ann) (V1.Term Symbol Ann)) -> s -> m t
252-
displayTermsOf codebase trav s =
251+
displayTermsOf ::
252+
(QueryM m) =>
253+
CodeCache scope ->
254+
Traversal s t TermReference (DisplayObject (Type Symbol Ann) (V1.Term Symbol Ann)) ->
255+
s ->
256+
m t
257+
displayTermsOf codeCache trav s =
253258
s
254259
& asListOfDeduped trav %%~ \refs -> do
255260
let partitionedRefs =
@@ -261,7 +266,7 @@ displayTermsOf codebase trav s =
261266
Nothing -> Left $ MissingObject $ Reference.toShortHash ref
262267
Just typ -> Left $ BuiltinObject (mempty <$ typ)
263268
Reference.DerivedId rid -> Right rid
264-
r <- Codebase.expectTermsByRefIdsOf codebase (traversed . _Right) partitionedRefs
269+
r <- CC.expectTermsAndTypesByRefIdsOf codeCache (traversed . _Right) partitionedRefs
265270
r
266271
& traversed
267272
%~ \case
@@ -272,15 +277,15 @@ displayTermsOf codebase trav s =
272277
Left obj -> obj
273278
& pure
274279

275-
displayTypesOf :: (QueryM m) => Codebase.CodebaseEnv -> Traversal s t Reference (DisplayObject () (DD.Decl Symbol Ann)) -> s -> m t
276-
displayTypesOf codebase trav s =
280+
displayTypesOf :: (QueryM m) => CodeCache scope -> Traversal s t TypeReference (DisplayObject () (DD.Decl Symbol Ann)) -> s -> m t
281+
displayTypesOf codeCache trav s =
277282
s
278283
& asListOf trav %%~ \refs -> do
279284
let partitionedRefs =
280285
refs <&> \case
281286
Reference.Builtin _ -> Left (BuiltinObject ())
282287
Reference.DerivedId rid -> Right rid
283-
Codebase.expectTypeDeclarationsByRefIdsOf codebase (traversed . _Right) partitionedRefs
288+
CC.expectTypeDeclsByRefIdsOf codeCache (traversed . _Right) partitionedRefs
284289
<&> fmap \case
285290
Left obj -> obj
286291
Right decl -> (UserObject decl)

src/Share/BackgroundJobs/Search/DefinitionSync.hs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ import Share.BackgroundJobs.Monad (Background)
2222
import Share.BackgroundJobs.Search.DefinitionSync.Types (Arity (..), DefinitionDocument (..), DefnSearchToken (..), Occurrence, OccurrenceKind (..), TermOrTypeSummary (..), TermOrTypeTag (..), VarId (..))
2323
import Share.BackgroundJobs.Workers (newWorker)
2424
import Share.Codebase qualified as Codebase
25+
import Share.Codebase.CodeCache qualified as CodeCache
26+
import Share.Codebase.Types (CodeCache)
2527
import Share.IDs (ReleaseId, UserId)
2628
import Share.Metrics qualified as Metrics
2729
import Share.Postgres qualified as PG
@@ -165,12 +167,13 @@ syncRoot authZReceipt (mayReleaseId, rootBranchHashId, codebaseOwner) = do
165167
let nlReceipt = nameLookupReceipt namesPerspective
166168
let codebaseLoc = Codebase.codebaseLocationForProjectRelease codebaseOwner
167169
let codebase = Codebase.codebaseEnv authZReceipt codebaseLoc
168-
termsCursor <- NLOps.projectTermsWithinRoot nlReceipt rootBranchHashId
170+
CodeCache.withCodeCache codebase \codeCache -> do
171+
termsCursor <- NLOps.projectTermsWithinRoot nlReceipt rootBranchHashId
169172

170-
termErrs <- syncTerms codebase namesPerspective rootBranchHashId termsCursor
171-
typesCursor <- NLOps.projectTypesWithinRoot nlReceipt rootBranchHashId
172-
typeErrs <- syncTypes codebase namesPerspective rootBranchHashId typesCursor
173-
pure (termErrs <> typeErrs)
173+
termErrs <- syncTerms codebase namesPerspective rootBranchHashId termsCursor
174+
typesCursor <- NLOps.projectTypesWithinRoot nlReceipt rootBranchHashId
175+
typeErrs <- syncTypes codebase codeCache namesPerspective rootBranchHashId typesCursor
176+
pure (termErrs <> typeErrs)
174177
True -> pure mempty
175178
-- Copy relevant index rows into the global search index as well
176179
for mayReleaseId (syncRelease rootBranchHashId)
@@ -377,11 +380,12 @@ typeSigTokens typ =
377380
syncTypes ::
378381
(PG.QueryM m) =>
379382
Codebase.CodebaseEnv ->
383+
CodeCache scope ->
380384
NamesPerspective m ->
381385
BranchHashId ->
382386
Cursors.PGCursor (Name, TypeReference) ->
383387
m ([DefnIndexingFailure], [Text])
384-
syncTypes codebase namesPerspective rootBranchHashId typesCursor = do
388+
syncTypes codebase codeCache namesPerspective rootBranchHashId typesCursor = do
385389
Cursors.foldBatched typesCursor defnBatchSize \types -> do
386390
let nonLibTypes =
387391
types
@@ -408,7 +412,7 @@ syncTypes codebase namesPerspective rootBranchHashId typesCursor = do
408412
<&> V.unzip3
409413
let basicTokens = Data.zipWith2 fqns refs \fqn ref -> Set.fromList [NameToken fqn, HashToken $ Reference.toShortHash ref]
410414
let allTokens = Data.zipWith2 declTokens basicTokens Set.union
411-
typeSummaries <- Summary.typeSummariesForReferencesOf codebase Nothing traversed (Data.zip2 refs (Just <$> fqns))
415+
typeSummaries <- Summary.typeSummariesForReferencesOf codeCache Nothing traversed (Data.zip2 refs (Just <$> fqns))
412416
let defDocuments = Data.zipWith5 refs fqns typeSummaries allTokens arities $ \ref fqn typeSummary tokens arity ->
413417
let sh = Reference.toShortHash ref
414418
in DefinitionDocument

src/Share/Codebase.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ module Share.Codebase
77
( shorthashLength,
88
CodebaseEnv,
99
codebaseOwner,
10+
CodebaseError (..),
1011
CodebaseRuntime (..),
1112
codebaseEnv,
1213
codebaseForProjectBranch,

src/Share/Codebase/CodeCache.hs

Lines changed: 57 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ module Share.Codebase.CodeCache
66
termsForRefsOf,
77
typesOfReferentsOf,
88
getTermsAndTypesByRefIdsOf,
9+
expectTermsAndTypesByRefIdsOf,
910
getTypeDeclsByRefIdsOf,
11+
expectTypeDeclsByRefIdsOf,
1012
getTypeDeclsByRefsOf,
1113
cacheTermAndTypes,
1214
cacheDecls,
@@ -34,6 +36,7 @@ import Unison.DataDeclaration qualified as V1
3436
import Unison.DataDeclaration.ConstructorId qualified as V1Decl
3537
import Unison.Hash (Hash)
3638
import Unison.Parser.Ann
39+
import Unison.Reference (TermReferenceId, TypeReferenceId)
3740
import Unison.Reference qualified as Reference
3841
import Unison.Referent qualified as V1Referent
3942
import Unison.Runtime.IOSource qualified as IOSource
@@ -43,6 +46,9 @@ import Unison.Term qualified as V1
4346
import Unison.Type qualified as Type
4447
import Unison.Type qualified as V1
4548

49+
type TermAndType =
50+
(V1.Term Symbol Ann, V1.Type Symbol Ann)
51+
4652
withCodeCache :: (QueryM m) => CodebaseEnv -> (forall s. CodeCache s -> m r) -> m r
4753
withCodeCache codeCacheCodebaseEnv action = do
4854
codeCacheVar <- PG.transactionUnsafeIO (newTVarIO (CodeCacheData Map.empty Map.empty))
@@ -52,30 +58,24 @@ withCodeCache codeCacheCodebaseEnv action = do
5258
readCodeCache :: (QueryM m) => CodeCache s -> m CodeCacheData
5359
readCodeCache CodeCache {codeCacheVar} = PG.transactionUnsafeIO (readTVarIO codeCacheVar)
5460

55-
cacheTermAndTypes ::
56-
(QueryM m) =>
57-
CodeCache s ->
58-
[(Reference.Id, (V1.Term Symbol Ann, V1.Type Symbol Ann))] ->
59-
m ()
61+
cacheTermAndTypes :: (QueryM m) => CodeCache s -> Map TermReferenceId TermAndType -> m ()
6062
cacheTermAndTypes CodeCache {codeCacheVar} termAndTypes = do
6163
PG.transactionUnsafeIO do
6264
atomically do
6365
modifyTVar' codeCacheVar \CodeCacheData {termCache, ..} ->
64-
let newTermMap = Map.fromList termAndTypes
65-
termCache' = Map.union termCache newTermMap
66+
let !termCache' = Map.union termCache termAndTypes
6667
in CodeCacheData {termCache = termCache', ..}
6768

6869
cacheDecls ::
6970
(QueryM m) =>
7071
CodeCache s ->
71-
[(Reference.Id, V1.Decl Symbol Ann)] ->
72+
Map TypeReferenceId (V1.Decl Symbol Ann) ->
7273
m ()
7374
cacheDecls CodeCache {codeCacheVar} decls = do
7475
PG.transactionUnsafeIO do
7576
atomically do
7677
modifyTVar' codeCacheVar \CodeCacheData {typeCache, ..} ->
77-
let newDeclsMap = Map.fromList decls
78-
typeCache' = Map.union typeCache newDeclsMap
78+
let !typeCache' = Map.union typeCache decls
7979
in CodeCacheData {typeCache = typeCache', ..}
8080

8181
builtinsCodeLookup :: (Monad m) => CL.CodeLookup Symbol m Ann
@@ -97,7 +97,7 @@ toCodeLookup codeCache = do
9797
getTermsAndTypesByRefIdsOf ::
9898
(QueryM m) =>
9999
CodeCache scope ->
100-
Traversal s t Reference.Id (Maybe (V1.Term Symbol Ann, V1.Type Symbol Ann)) ->
100+
Traversal s t TermReferenceId (Maybe TermAndType) ->
101101
s ->
102102
m t
103103
getTermsAndTypesByRefIdsOf codeCache@(CodeCache {codeCacheCodebaseEnv}) trav s = do
@@ -123,19 +123,34 @@ getTermsAndTypesByRefIdsOf codeCache@(CodeCache {codeCacheCodebaseEnv}) trav s =
123123
Nothing -> (mempty, Nothing)
124124
Right tt -> (mempty, Just tt)
125125

126-
cacheTermAndTypes codeCache cacheable
127-
pure $ hydrated'
128-
where
129-
findBuiltinTT :: Reference.Id -> Maybe (V1.Term Symbol Ann, V1.Type Symbol Ann)
130-
findBuiltinTT refId = do
131-
tm <- runIdentity $ CL.getTerm builtinsCodeLookup refId
132-
typ <- runIdentity $ CL.getTypeOfTerm builtinsCodeLookup refId
133-
pure (tm, typ)
126+
cacheTermAndTypes codeCache (Map.fromList cacheable)
127+
pure hydrated'
128+
129+
-- | Like 'getTermsAndTypesByRefIdsOf', but throws an unrecoverable error when the term isn't in the database.
130+
expectTermsAndTypesByRefIdsOf ::
131+
forall m scope s t.
132+
(QueryM m) =>
133+
CodeCache scope ->
134+
Traversal s t TermReferenceId TermAndType ->
135+
s ->
136+
m t
137+
expectTermsAndTypesByRefIdsOf codeCache trav =
138+
asListOf trav %%~ \refs -> do
139+
termsAndTypes <- getTermsAndTypesByRefIdsOf codeCache traverse refs
140+
for (zip refs termsAndTypes) \case
141+
(_, Just tt) -> pure tt
142+
(ref, Nothing) -> PG.unrecoverableError (Codebase.MissingTerm ref)
143+
144+
findBuiltinTT :: TermReferenceId -> Maybe TermAndType
145+
findBuiltinTT refId = do
146+
tm <- runIdentity $ CL.getTerm builtinsCodeLookup refId
147+
typ <- runIdentity $ CL.getTypeOfTerm builtinsCodeLookup refId
148+
pure (tm, typ)
134149

135150
getTypeDeclsByRefIdsOf ::
136151
(QueryM m) =>
137152
CodeCache scope ->
138-
Traversal s t Reference.Id (Maybe (V1.Decl Symbol Ann)) ->
153+
Traversal s t TypeReferenceId (Maybe (V1.Decl Symbol Ann)) ->
139154
s ->
140155
m t
141156
getTypeDeclsByRefIdsOf codeCache@(CodeCache {codeCacheCodebaseEnv}) trav s = do
@@ -161,12 +176,25 @@ getTypeDeclsByRefIdsOf codeCache@(CodeCache {codeCacheCodebaseEnv}) trav s = do
161176
Nothing -> (mempty, Nothing)
162177
Right decl -> (mempty, Just decl)
163178

164-
cacheDecls codeCache cacheable
165-
pure $ hydrated'
166-
where
167-
findBuiltinDecl :: Reference.Id -> Maybe (V1.Decl Symbol Ann)
168-
findBuiltinDecl refId = do
169-
runIdentity $ CL.getTypeDeclaration builtinsCodeLookup refId
179+
cacheDecls codeCache (Map.fromList cacheable)
180+
pure hydrated'
181+
182+
expectTypeDeclsByRefIdsOf ::
183+
(QueryM m) =>
184+
CodeCache scope ->
185+
Traversal s t TypeReferenceId (V1.Decl Symbol Ann) ->
186+
s ->
187+
m t
188+
expectTypeDeclsByRefIdsOf codeCache trav =
189+
asListOf trav %%~ \refs -> do
190+
decls <- getTypeDeclsByRefIdsOf codeCache traverse refs
191+
for (zip refs decls) \case
192+
(_, Just decl) -> pure decl
193+
(ref, Nothing) -> PG.unrecoverableError (Codebase.MissingDecl ref)
194+
195+
findBuiltinDecl :: Reference.Id -> Maybe (V1.Decl Symbol Ann)
196+
findBuiltinDecl refId = do
197+
runIdentity $ CL.getTypeDeclaration builtinsCodeLookup refId
170198

171199
getTypeDeclsByRefsOf ::
172200
(QueryM m) =>
@@ -196,7 +224,7 @@ termsForRefsOf codeCache trav s = do
196224
s
197225
& asListOf trav %%~ \refs ->
198226
do
199-
let trav :: Traversal Reference (Maybe (V1.Term Symbol ())) Reference.Id (Maybe (V1.Term Symbol Ann, V1.Type Symbol Ann))
227+
let trav :: Traversal Reference (Maybe (V1.Term Symbol ())) Reference.Id (Maybe TermAndType)
200228
trav f = \case
201229
-- Builtins are their own terms
202230
ref@(Reference.Builtin _) -> pure (Just (Term.ref () ref))
@@ -241,7 +269,7 @@ typesOfReferentsOf codeCache trav s = do
241269
[ Either
242270
(V1.Type Symbol ())
243271
( Either
244-
(Maybe (V1.Term Symbol Ann, V1.Type Symbol Ann))
272+
(Maybe TermAndType)
245273
(Reference.Id' Hash, V1Decl.ConstructorId)
246274
)
247275
] <-
@@ -250,7 +278,7 @@ typesOfReferentsOf codeCache trav s = do
250278
[ Either
251279
(V1.Type Symbol ())
252280
( Either
253-
(Maybe (V1.Term Symbol Ann, V1.Type Symbol Ann))
281+
(Maybe TermAndType)
254282
(Maybe (V1.Decl Symbol Ann), V1Decl.ConstructorId)
255283
)
256284
] <-

src/Share/Codebase/Types.hs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import Unison.Codebase.Runtime qualified as Rt
2121
import Unison.DataDeclaration qualified as V1
2222
import Unison.NameSegment.Internal (NameSegment (..))
2323
import Unison.Parser.Ann (Ann)
24+
import Unison.Reference (TermReferenceId, TypeReferenceId)
2425
import Unison.Reference qualified as Reference
2526
import Unison.Symbol (Symbol)
2627
import Unison.Term qualified as V1
@@ -31,18 +32,21 @@ publicRoot :: Path.Path
3132
publicRoot = Path.singleton (NameSegment "public")
3233

3334
-- | The scope of a given codebase transaction.
35+
--
36+
-- If two @CodebaseEnv@ are equal, they correspond to the same codebase.
3437
data CodebaseEnv = CodebaseEnv
3538
{ codebaseOwner :: UserId
3639
}
40+
deriving stock (Eq)
3741

3842
data CodeCache scope = CodeCache
3943
{ codeCacheCodebaseEnv :: CodebaseEnv,
4044
codeCacheVar :: TVar CodeCacheData
4145
}
4246

4347
data CodeCacheData = CodeCacheData
44-
{ termCache :: Map Reference.Id (V1.Term Symbol Ann, V1.Type Symbol Ann),
45-
typeCache :: Map Reference.Id (V1.Decl Symbol Ann)
48+
{ termCache :: Map TermReferenceId (V1.Term Symbol Ann, V1.Type Symbol Ann),
49+
typeCache :: Map TypeReferenceId (V1.Decl Symbol Ann)
4650
}
4751

4852
-- | The runtime environment for a codebase transaction.

0 commit comments

Comments
 (0)