@@ -273,6 +273,7 @@ module U.Codebase.Sqlite.Queries
273273 addProjectBranchLastAccessedColumn ,
274274 addMergeBranchTables ,
275275 addUpdateBranchTable ,
276+ addDerivedDependentsByDependencyIndex ,
276277
277278 -- ** schema version
278279 currentSchemaVersion ,
@@ -318,6 +319,7 @@ import Control.Monad.Writer (MonadWriter, runWriterT)
318319import Control.Monad.Writer qualified as Writer
319320import Data.Aeson qualified as Aeson
320321import Data.Aeson.Text qualified as Aeson
322+ import Data.Bifoldable (bifold )
321323import Data.Bitraversable (bitraverse )
322324import Data.ByteString.Lazy (LazyByteString )
323325import Data.Bytes.Put (runPutS )
@@ -441,7 +443,7 @@ type TextPathSegments = [Text]
441443-- * main squeeze
442444
443445currentSchemaVersion :: SchemaVersion
444- currentSchemaVersion = 20
446+ currentSchemaVersion = 21
445447
446448runCreateSql :: Transaction ()
447449runCreateSql =
@@ -519,6 +521,10 @@ addUpdateBranchTable :: Transaction ()
519521addUpdateBranchTable =
520522 executeStatements $ (embedProjectStringFile " sql/017-add-update-branch-table.sql" )
521523
524+ addDerivedDependentsByDependencyIndex :: Transaction ()
525+ addDerivedDependentsByDependencyIndex =
526+ executeStatements $ (embedProjectStringFile " sql/018-add-derived-dependents-by-dependency-index.sql" )
527+
522528schemaVersion :: Transaction SchemaVersion
523529schemaVersion =
524530 queryOneCol
@@ -1969,13 +1975,13 @@ getDirectDependentsWithinScope scope query = do
19691975-- | `getTransitiveDependentsWithinScope scope query` returns all transitive dependents of `query` that are in `scope`
19701976-- (not including `query` itself).
19711977getTransitiveDependentsWithinScope ::
1972- Set S.Reference. Id ->
1978+ DefnsF Set S. TermReferenceId S. TypeReferenceId ->
19731979 Set S. Reference ->
19741980 Transaction (DefnsF Set S. TermReferenceId S. TypeReferenceId )
19751981getTransitiveDependentsWithinScope scope query = do
19761982 -- Populate a temporary table with all of the references in `scope`
19771983 let scopeTableName = [sql | dependents_search_scope |]
1978- createTemporaryTableOfReferenceIds scopeTableName scope
1984+ createTemporaryTableOfReferenceIds scopeTableName (bifold scope)
19791985
19801986 -- Populate a temporary table with all of the references in `query`
19811987 let queryTableName = [sql | dependencies_query |]
@@ -2002,29 +2008,33 @@ getTransitiveDependentsWithinScope scope query = do
20022008 result0 :: [S.Reference. Id :. Only ObjectType ] <-
20032009 queryListRow
20042010 [sql |
2005- WITH RECURSIVE transitive_dependents (dependent_object_id, dependent_component_index, type_id) AS (
2006- SELECT d.dependent_object_id, d.dependent_component_index, object.type_id
2007- FROM dependents_index d
2008- JOIN object ON d.dependent_object_id = object.id
2009- JOIN $queryTableName q
2010- ON q.builtin IS d.dependency_builtin
2011- AND q.object_id IS d.dependency_object_id
2012- AND q.component_index IS d.dependency_component_index
2013- JOIN $scopeTableName s
2014- ON s.object_id = d.dependent_object_id
2015- AND s.component_index = d.dependent_component_index
2016-
2017- UNION SELECT d.dependent_object_id, d.dependent_component_index, object.type_id
2018- FROM dependents_index d
2019- JOIN object ON d.dependent_object_id = object.id
2020- JOIN transitive_dependents t
2021- ON t.dependent_object_id = d.dependency_object_id
2022- AND t.dependent_component_index = d.dependency_component_index
2023- JOIN $scopeTableName s
2024- ON s.object_id = d.dependent_object_id
2025- AND s.component_index = d.dependent_component_index
2011+ WITH RECURSIVE
2012+ dependents_index_in_scope AS (
2013+ SELECT *
2014+ FROM dependents_index
2015+ WHERE (dependent_object_id, dependent_component_index) IN (
2016+ SELECT object_id, component_index
2017+ FROM $scopeTableName
2018+ )
2019+ ),
2020+ transitive_dependents (object_id, component_index, type_id) AS (
2021+ SELECT d.dependent_object_id, d.dependent_component_index, o.type_id
2022+ FROM $queryTableName q
2023+ JOIN dependents_index_in_scope d
2024+ ON d.dependency_builtin IS q.builtin
2025+ AND d.dependency_object_id IS q.object_id
2026+ AND d.dependency_component_index IS q.component_index
2027+ JOIN object o ON d.dependent_object_id = o.id
2028+ UNION
2029+ SELECT d.dependent_object_id, d.dependent_component_index, o.type_id
2030+ FROM transitive_dependents t
2031+ JOIN dependents_index_in_scope d
2032+ ON t.object_id = d.dependency_object_id
2033+ AND t.component_index = d.dependency_component_index
2034+ JOIN object o ON d.dependent_object_id = o.id
20262035 )
2027- SELECT * FROM transitive_dependents
2036+ SELECT *
2037+ FROM transitive_dependents t
20282038 |]
20292039
20302040 execute [sql | DROP TABLE $scopeTableName |]
@@ -2034,8 +2044,8 @@ getTransitiveDependentsWithinScope scope query = do
20342044 let result1 =
20352045 List. foldl'
20362046 ( \ deps -> \ case
2037- dep :. Only TermComponent -> Defns ( Set. insert dep deps. terms) deps. types
2038- dep :. Only DeclComponent -> Defns deps . terms ( Set. insert dep deps. types)
2047+ dep :. Only TermComponent -> let ! terms = Set. insert dep deps. terms in Defns terms deps. types
2048+ dep :. Only DeclComponent -> let ! types = Set. insert dep deps. types in Defns deps . terms types
20392049 _ -> deps -- impossible; could error here
20402050 )
20412051 (Defns Set. empty Set. empty)
0 commit comments