@@ -800,28 +800,54 @@ _localizeTermAndType tm typ = do
800800-- variable names.
801801saveCachedEvalResult :: forall m . (QueryM m ) => CodebaseEnv -> Reference. Id -> V2. Term Symbol -> m ()
802802saveCachedEvalResult (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