Skip to content

Commit 73ff441

Browse files
committed
Fix up sandbox caching on doc eval
1 parent f55642f commit 73ff441

File tree

1 file changed

+38
-32
lines changed
  • share-api/src/Share/Postgres/Definitions

1 file changed

+38
-32
lines changed

share-api/src/Share/Postgres/Definitions/Queries.hs

Lines changed: 38 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -800,28 +800,54 @@ _localizeTermAndType tm typ = do
800800
-- variable names.
801801
saveCachedEvalResult :: forall m. (QueryM m) => CodebaseEnv -> Reference.Id -> V2.Term Symbol -> m ()
802802
saveCachedEvalResult (CodebaseEnv {codebaseOwner}) (Reference.Id resultHash compI) term = do
803-
evalResultId <- ensureEvalResult
804-
(alreadySaved :: Bool) <-
805-
queryExpect1Col
803+
(mayEvalResultId, sandboxedAlreadySaved) <-
804+
queryExpect1Row @(Maybe EvalResultId, Bool)
806805
[sql|
807-
SELECT EXISTS (
808-
SELECT FROM sandboxed_eval_result
809-
WHERE user_id = #{codebaseOwner}
810-
AND eval_result_id = #{evalResultId}
806+
SELECT er.id, ser.id IS NOT NULL AS already_saved
807+
FROM component_hashes ch
808+
JOIN eval_results er ON er.component_hash_id = ch.id
809+
AND er.component_index = #{pgComponentIndex compI}
810+
LEFT JOIN sandboxed_eval_result ser
811+
ON ser.eval_result_id = er.id
812+
WHERE ch.base32 = #{ComponentHash resultHash}
813+
AND ser.user_id = #{codebaseOwner}
811814
)
812815
|]
813-
when (not alreadySaved) $ doSave evalResultId
816+
if sandboxedAlreadySaved
817+
then pure ()
818+
else do
819+
(localIds, dbTerm) <- localizeTerm term
820+
case (mayEvalResultId) of
821+
Just existingId -> do
822+
saveSandboxed dbTerm existingId
823+
Nothing -> do
824+
evalResultId <- ensureEvalResult localIds
825+
saveSandboxed dbTerm evalResultId
814826
where
815-
doSave :: EvalResultId -> m ()
816-
doSave evalResultId = do
817-
(LocalIds.LocalIds {textLookup, defnLookup}, dbTerm) <- localizeTerm term
827+
saveSandboxed :: TermFormat.Term -> EvalResultId -> m ()
828+
saveSandboxed dbTerm evalResultId = do
818829
resultBytesId <- ensureBytesIdsOf id (evalResultTermToByteString $ EvalResultTerm dbTerm)
819830
execute_
820831
[sql|
821832
INSERT INTO sandboxed_eval_result (user_id, eval_result_id, result_bytes_id)
822833
VALUES (#{codebaseOwner}, #{evalResultId}, #{resultBytesId})
823834
|]
824835

836+
-- Ensure there's a row for this eval result, returning whether it already exists.
837+
ensureEvalResult :: PgLocalIds -> m EvalResultId
838+
ensureEvalResult LocalIds.LocalIds {textLookup, defnLookup} = do
839+
resultHashId <- HashQ.ensureComponentHashIdsOf id (ComponentHash resultHash)
840+
let compIndex = pgComponentIndex compI
841+
evalResultId <-
842+
queryExpect1Col @EvalResultId
843+
[sql|
844+
WITH values(component_hash_id, component_index) AS (
845+
SELECT * FROM (VALUES (#{resultHashId}, #{compIndex})) AS t(component_hash_id, component_index)
846+
) INSERT INTO eval_results (component_hash_id, component_index)
847+
VALUES (#{resultHashId}, #{compIndex})
848+
RETURNING component_hash_id, component_index, id
849+
|]
850+
825851
let textLocals = zip [0 :: Int32 ..] (Vector.toList textLookup)
826852
whenNonEmpty textLocals $
827853
execute_
@@ -844,27 +870,7 @@ saveCachedEvalResult (CodebaseEnv {codebaseOwner}) (Reference.Id resultHash comp
844870
SELECT #{evalResultId}, values.local_index, values.hash_id
845871
FROM values
846872
|]
847-
-- Ensure there's a row for this eval result, returning whether it already exists.
848-
ensureEvalResult :: m EvalResultId
849-
ensureEvalResult = do
850-
resultHashId <- HashQ.ensureComponentHashIdsOf id (ComponentHash resultHash)
851-
let compIndex = pgComponentIndex compI
852-
queryExpect1Col @EvalResultId
853-
[sql|
854-
WITH values(component_hash_id, component_index) AS (
855-
SELECT * FROM (VALUES (#{resultHashId}, #{compIndex})) AS t(component_hash_id, component_index)
856-
), inserted(component_hash_id, component_index, id) AS (
857-
INSERT INTO eval_results (component_hash_id, component_index)
858-
VALUES (#{resultHashId}, #{compIndex})
859-
ON CONFLICT DO NOTHING
860-
RETURNING component_hash_id, component_index, id
861-
) SELECT COALESCE(inserted.id, result.id)
862-
FROM values val
863-
LEFT JOIN eval_results result
864-
ON val.component_hash_id = result.component_hash_id AND val.component_index = result.component_index
865-
LEFT JOIN inserted
866-
ON inserted.component_hash_id = val.component_hash_id AND inserted.component_index = val.component_index
867-
|]
873+
pure evalResultId
868874

869875
-- | Encode and save a term component to the database. See 'saveEncodedTermComponent' for a more
870876
-- efficient version if you've already got an encoded term component available.

0 commit comments

Comments
 (0)