@@ -273,6 +273,7 @@ module U.Codebase.Sqlite.Queries
273
273
addProjectBranchLastAccessedColumn ,
274
274
addMergeBranchTables ,
275
275
addUpdateBranchTable ,
276
+ addDerivedDependentsByDependencyIndex ,
276
277
277
278
-- ** schema version
278
279
currentSchemaVersion ,
@@ -318,6 +319,7 @@ import Control.Monad.Writer (MonadWriter, runWriterT)
318
319
import Control.Monad.Writer qualified as Writer
319
320
import Data.Aeson qualified as Aeson
320
321
import Data.Aeson.Text qualified as Aeson
322
+ import Data.Bifoldable (bifold )
321
323
import Data.Bitraversable (bitraverse )
322
324
import Data.ByteString.Lazy (LazyByteString )
323
325
import Data.Bytes.Put (runPutS )
@@ -441,7 +443,7 @@ type TextPathSegments = [Text]
441
443
-- * main squeeze
442
444
443
445
currentSchemaVersion :: SchemaVersion
444
- currentSchemaVersion = 20
446
+ currentSchemaVersion = 21
445
447
446
448
runCreateSql :: Transaction ()
447
449
runCreateSql =
@@ -519,6 +521,10 @@ addUpdateBranchTable :: Transaction ()
519
521
addUpdateBranchTable =
520
522
executeStatements $ (embedProjectStringFile " sql/017-add-update-branch-table.sql" )
521
523
524
+ addDerivedDependentsByDependencyIndex :: Transaction ()
525
+ addDerivedDependentsByDependencyIndex =
526
+ executeStatements $ (embedProjectStringFile " sql/018-add-derived-dependents-by-dependency-index.sql" )
527
+
522
528
schemaVersion :: Transaction SchemaVersion
523
529
schemaVersion =
524
530
queryOneCol
@@ -1969,13 +1975,13 @@ getDirectDependentsWithinScope scope query = do
1969
1975
-- | `getTransitiveDependentsWithinScope scope query` returns all transitive dependents of `query` that are in `scope`
1970
1976
-- (not including `query` itself).
1971
1977
getTransitiveDependentsWithinScope ::
1972
- Set S.Reference. Id ->
1978
+ DefnsF Set S. TermReferenceId S. TypeReferenceId ->
1973
1979
Set S. Reference ->
1974
1980
Transaction (DefnsF Set S. TermReferenceId S. TypeReferenceId )
1975
1981
getTransitiveDependentsWithinScope scope query = do
1976
1982
-- Populate a temporary table with all of the references in `scope`
1977
1983
let scopeTableName = [sql | dependents_search_scope |]
1978
- createTemporaryTableOfReferenceIds scopeTableName scope
1984
+ createTemporaryTableOfReferenceIds scopeTableName (bifold scope)
1979
1985
1980
1986
-- Populate a temporary table with all of the references in `query`
1981
1987
let queryTableName = [sql | dependencies_query |]
@@ -2002,29 +2008,33 @@ getTransitiveDependentsWithinScope scope query = do
2002
2008
result0 :: [S.Reference. Id :. Only ObjectType ] <-
2003
2009
queryListRow
2004
2010
[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
2026
2035
)
2027
- SELECT * FROM transitive_dependents
2036
+ SELECT *
2037
+ FROM transitive_dependents t
2028
2038
|]
2029
2039
2030
2040
execute [sql | DROP TABLE $scopeTableName |]
@@ -2034,8 +2044,8 @@ getTransitiveDependentsWithinScope scope query = do
2034
2044
let result1 =
2035
2045
List. foldl'
2036
2046
( \ 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
2039
2049
_ -> deps -- impossible; could error here
2040
2050
)
2041
2051
(Defns Set. empty Set. empty)
0 commit comments