{-# LANGUAGE DataKinds #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE TypeApplications #-}
module X where
import Control.Monad (forM_)
import qualified Data.Map.Strict as Map
import qualified Data.Set as Set
import GHC.Generics
main :: IO ()
main :: IO ()
main = do
let depsOf :: String -> Set String
depsOf String
x = Set String -> String -> Map String (Set String) -> Set String
forall k a. Ord k => a -> k -> Map k a -> a
Map.findWithDefault Set String
forall a. Monoid a => a
mempty String
x Map String (Set String)
direct
transitiveDependencies :: String -> Set.Set String
transitiveDependencies :: String -> Set String
transitiveDependencies String
x = Set String -> Set String -> Set String
go (String -> Set String
forall a. a -> Set a
Set.singleton String
x) Set String
forall a. Monoid a => a
mempty
go :: Set.Set String -> Set.Set String -> Set.Set String
go :: Set String -> Set String -> Set String
go Set String
queue Set String
walked =
case Set String -> Maybe (String, Set String)
forall a. Set a -> Maybe (a, Set a)
Set.maxView Set String
queue of
Maybe (String, Set String)
Nothing ->
Set String
walked
Just (String
x, Set String
xs)
| String -> Set String -> Bool
forall a. Ord a => a -> Set a -> Bool
Set.member String
x Set String
walked -> Set String -> Set String -> Set String
go Set String
xs Set String
walked
Just (String
x, Set String
xs) ->
Set String -> Set String -> Set String
go (String -> Set String
depsOf String
x Set String -> Set String -> Set String
forall a. Ord a => Set a -> Set a -> Set a
`Set.union` Set String
xs) (String -> Set String -> Set String
forall a. Ord a => a -> Set a -> Set a
Set.insert String
x Set String
walked)
queryDeps :: Map.Map String (Set.Set String)
queryDeps :: Map String (Set String)
queryDeps = (String -> Set String) -> Set String -> Map String (Set String)
forall k a. (k -> a) -> Set k -> Map k a
Map.fromSet String -> Set String
transitiveDependencies (Set String -> Map String (Set String))
-> Set String -> Map String (Set String)
forall a b. (a -> b) -> a -> b
$ String -> Set String
depsOf String
"Query"
queryNoRecDeps :: Map.Map String (Set.Set String)
queryNoRecDeps :: Map String (Set String)
queryNoRecDeps = (Set String -> Bool)
-> Map String (Set String) -> Map String (Set String)
forall a k. (a -> Bool) -> Map k a -> Map k a
Map.filter (Bool -> Bool
not (Bool -> Bool) -> (Set String -> Bool) -> Set String -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Set String -> Bool
forall a. Ord a => a -> Set a -> Bool
Set.member String
"Query") Map String (Set String)
queryDeps
countDeps :: Map k (Set String) -> Int
countDeps = Set String -> Int
forall a. Set a -> Int
Set.size (Set String -> Int)
-> (Map k (Set String) -> Set String) -> Map k (Set String) -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Set String] -> Set String
forall (f :: * -> *) a. (Foldable f, Ord a) => f (Set a) -> Set a
Set.unions ([Set String] -> Set String)
-> (Map k (Set String) -> [Set String])
-> Map k (Set String)
-> Set String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Map k (Set String) -> [Set String]
forall k a. Map k a -> [a]
Map.elems
commons :: Set String
commons = [Set String] -> Set String
forall (f :: * -> *) a. (Foldable f, Ord a) => f (Set a) -> Set a
Set.unions [Set String -> Set String -> Set String
forall a. Ord a => Set a -> Set a -> Set a
Set.intersection Set String
xs Set String
ys | (String
x, Set String
xs) <- Map String (Set String) -> [(String, Set String)]
forall k a. Map k a -> [(k, a)]
Map.toList Map String (Set String)
queryNoRecDeps, (String
y, Set String
ys) <- Map String (Set String) -> [(String, Set String)]
forall k a. Map k a -> [(k, a)]
Map.toList Map String (Set String)
queryNoRecDeps, String
x String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= String
y]
queryNoRecDepsNoCommons :: Map String (Set String)
queryNoRecDepsNoCommons = (Set String -> Bool)
-> Map String (Set String) -> Map String (Set String)
forall a k. (a -> Bool) -> Map k a -> Map k a
Map.filter (Bool -> Bool
not (Bool -> Bool) -> (Set String -> Bool) -> Set String -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Set String -> Bool
forall a. Set a -> Bool
Set.null) (Map String (Set String) -> Map String (Set String))
-> Map String (Set String) -> Map String (Set String)
forall a b. (a -> b) -> a -> b
$ (Set String -> Set String -> Set String
forall a. Ord a => Set a -> Set a -> Set a
Set.\\ Set String
commons) (Set String -> Set String)
-> Map String (Set String) -> Map String (Set String)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Map String (Set String)
queryNoRecDeps
dropQuery :: String -> String
dropQuery String
s =
case String
s of
String
"" -> String
""
String
"Query" -> String
""
(Char
x : String
xs) -> Char
x Char -> String -> String
forall a. a -> [a] -> [a]
: String -> String
dropQuery String
xs
[(String, Set String)] -> ((String, Set String) -> IO ()) -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ (Map String (Set String) -> [(String, Set String)]
forall k a. Map k a -> [(k, a)]
Map.toList Map String (Set String)
queryNoRecDepsNoCommons) (((String, Set String) -> IO ()) -> IO ())
-> ((String, Set String) -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \(String
k, Set String
ds) -> String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
k String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
" -> " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> [String] -> String
forall a. Show a => a -> String
show (Set String -> [String]
forall a. Set a -> [a]
Set.toList Set String
ds)
(String, Int) -> IO ()
forall a. Show a => a -> IO ()
print (String
"total", Map String (Set String) -> Int
forall {k}. Map k (Set String) -> Int
countDeps Map String (Set String)
queryDeps)
(String, Int) -> IO ()
forall a. Show a => a -> IO ()
print (String
"extractable", Map String (Set String) -> Int
forall {k}. Map k (Set String) -> Int
countDeps Map String (Set String)
queryNoRecDeps)
(String, Int, [String]) -> IO ()
forall a. Show a => a -> IO ()
print (String
"commons", Set String -> Int
forall a. Set a -> Int
Set.size Set String
commons, Set String -> [String]
forall a. Set a -> [a]
Set.toList Set String
commons)
direct :: Map.Map String (Set.Set String)
direct :: Map String (Set String)
direct =
[(String, Set String)] -> Map String (Set String)
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList
[ (String
"Query", [String] -> Set String
forall a. Ord a => [a] -> Set a
Set.fromList [String
"Term", String
"MatchQuery", String
"MultiMatchQuery", String
"BoolQuery", String
"BoostingQuery", String
"CommonTermsQuery", String
"Query", String
"Boost", String
"FunctionScoreQuery", String
"DisMaxQuery", String
"FuzzyLikeThisQuery", String
"FuzzyLikeFieldQuery", String
"FuzzyQuery", String
"HasChildQuery", String
"HasParentQuery", String
"IndicesQuery", String
"MoreLikeThisQuery", String
"MoreLikeThisFieldQuery", String
"NestedQuery", String
"PrefixQuery", String
"QueryStringQuery", String
"SimpleQueryStringQuery", String
"RangeQuery", String
"RegexpQuery", String
"WildcardQuery"]),
(String
"MatchQuery", [String] -> Set String
forall a. Ord a => [a] -> Set a
Set.fromList [String
"QueryString", String
"BooleanOperator", String
"ZeroTermsQuery", String
"CutoffFrequency", String
"MatchQueryType", String
"Analyzer", String
"MaxExpansions", String
"Lenient", String
"Boost", String
"Fuzziness"]),
(String
"MultiMatchQuery", [String] -> Set String
forall a. Ord a => [a] -> Set a
Set.fromList [String
"QueryString", String
"BooleanOperator", String
"ZeroTermsQuery", String
"Tiebreaker", String
"MultiMatchQueryType", String
"CutoffFrequency", String
"Analyzer", String
"MaxExpansions", String
"Lenient"]),
(String
"BoolQuery", [String] -> Set String
forall a. Ord a => [a] -> Set a
Set.fromList [String
"Query", String
"Filter", String
"MinimumMatch", String
"Boost", String
"DisableCoord"]),
(String
"BoostingQuery", [String] -> Set String
forall a. Ord a => [a] -> Set a
Set.fromList [String
"Boost", String
"Query"]),
(String
"CommonTermsQuery", [String] -> Set String
forall a. Ord a => [a] -> Set a
Set.fromList [String
"QueryString", String
"CutoffFrequency", String
"BooleanOperator", String
"BooleanOperator", String
"CommonMinimumMatch", String
"Boost", String
"Analyzer", String
"DisableCoord"]),
(String
"FunctionScoreQuery", [String] -> Set String
forall a. Ord a => [a] -> Set a
Set.fromList [String
"FunctionScoreFunctions", String
"Query", String
"Boost", String
"Boost", String
"BoostMode", String
"Double", String
"ScoreMode"]),
(String
"DisMaxQuery", [String] -> Set String
forall a. Ord a => [a] -> Set a
Set.fromList [String
"Boost", String
"Tiebreaker", String
"Query"]),
(String
"FuzzyLikeThisQuery", [String] -> Set String
forall a. Ord a => [a] -> Set a
Set.fromList [String
"MaxQueryTerms", String
"IgnoreTermFrequency", String
"Fuzziness", String
"PrefixLength", String
"Boost", String
"Analyzer"]),
(String
"FuzzyLikeFieldQuery", [String] -> Set String
forall a. Ord a => [a] -> Set a
Set.fromList [String
"MaxQueryTerms", String
"IgnoreTermFrequency", String
"Fuzziness", String
"PrefixLength", String
"Boost", String
"Analyzer"]),
(String
"FuzzyQuery", [String] -> Set String
forall a. Ord a => [a] -> Set a
Set.fromList [String
"PrefixLength", String
"MaxExpansions", String
"Fuzziness", String
"Boost"]),
(String
"HasChildQuery", [String] -> Set String
forall a. Ord a => [a] -> Set a
Set.fromList [String
"RelationName", String
"Query", String
"ScoreType", String
"IgnoreUnmapped", String
"MinChildren", String
"MaxChildren"]),
(String
"HasParentQuery", [String] -> Set String
forall a. Ord a => [a] -> Set a
Set.fromList [String
"RelationName", String
"Query", String
"AggregateParentScore", String
"IgnoreUnmapped"]),
(String
"IndicesQuery", [String] -> Set String
forall a. Ord a => [a] -> Set a
Set.fromList [String
"Query", String
"IndexName"]),
(String
"MoreLikeThisQuery", [String] -> Set String
forall a. Ord a => [a] -> Set a
Set.fromList [String
"PercentMatch", String
"MinimumTermFrequency", String
"MaxQueryTerms", String
"StopWord", String
"MinDocFrequency", String
"MaxDocFrequency", String
"MinWordLength", String
"MaxWordLength", String
"BoostTerms", String
"Boost", String
"Analyzer"]),
(String
"MoreLikeThisFieldQuery", [String] -> Set String
forall a. Ord a => [a] -> Set a
Set.fromList [String
"PercentMatch", String
"MinimumTermFrequency", String
"MaxQueryTerms", String
"StopWord", String
"MinDocFrequency", String
"MaxDocFrequency", String
"MinWordLength", String
"MaxWordLength", String
"BoostTerms", String
"Boost", String
"Analyzer"]),
(String
"NestedQuery", [String] -> Set String
forall a. Ord a => [a] -> Set a
Set.fromList [String
"QueryPath", String
"ScoreType", String
"Query", String
"InnerHits"]),
(String
"PrefixQuery", [String] -> Set String
forall a. Ord a => [a] -> Set a
Set.fromList [String
"Boost"]),
(String
"QueryStringQuery", [String] -> Set String
forall a. Ord a => [a] -> Set a
Set.fromList [String
"QueryString", String
"BooleanOperator", String
"Analyzer", String
"AllowLeadingWildcard", String
"LowercaseExpanded", String
"EnablePositionIncrements", String
"MaxExpansions", String
"Fuzziness", String
"PrefixLength", String
"PhraseSlop", String
"Boost", String
"AnalyzeWildcard", String
"GeneratePhraseQueries", String
"MinimumMatch", String
"Lenient", String
"Locale"]),
(String
"SimpleQueryStringQuery", [String] -> Set String
forall a. Ord a => [a] -> Set a
Set.fromList [String
"QueryString", String
"FieldOrFields", String
"BooleanOperator", String
"Analyzer", String
"SimpleQueryFlag", String
"LowercaseExpanded", String
"Locale"]),
(String
"RangeQuery", [String] -> Set String
forall a. Ord a => [a] -> Set a
Set.fromList [String
"RangeValue", String
"Boost"]),
(String
"RegexpQuery", [String] -> Set String
forall a. Ord a => [a] -> Set a
Set.fromList [String
"Regexp", String
"RegexpFlags", String
"Boost"]),
(String
"WildcardQuery", [String] -> Set String
forall a. Ord a => [a] -> Set a
Set.fromList [String
"Boost"]),
(String
"CommonMinimumMatch", [String] -> Set String
forall a. Ord a => [a] -> Set a
Set.fromList [String
"MinimumMatchHighLow", String
"MinimumMatch"]),
(String
"Filter", [String] -> Set String
forall a. Ord a => [a] -> Set a
Set.fromList [String
"Query"]),
(String
"FunctionScoreFunctions", [String] -> Set String
forall a. Ord a => [a] -> Set a
Set.fromList [String
"FunctionScoreFunction", String
"ComponentFunctionScoreFunction"]),
(String
"FunctionScoreFunction", [String] -> Set String
forall a. Ord a => [a] -> Set a
Set.fromList [String
"Script", String
"Seed", String
"FieldValueFactor"]),
(String
"RangeValue", [String] -> Set String
forall a. Ord a => [a] -> Set a
Set.fromList [String
"LessThanEqD", String
"LessThanD", String
"GreaterThanEqD", String
"GreaterThanD", String
"LessThanEq", String
"LessThan", String
"GreaterThanEq", String
"GreaterThan"]),
(String
"MinimumMatchHighLow", [String] -> Set String
forall a. Ord a => [a] -> Set a
Set.fromList [String
"MinimumMatch"]),
(String
"FieldValueFactor", [String] -> Set String
forall a. Ord a => [a] -> Set a
Set.fromList [String
"Factor", String
"FactorModifier", String
"FactorMissingFieldValue"]),
(String
"ComponentFunctionScoreFunction", [String] -> Set String
forall a. Ord a => [a] -> Set a
Set.fromList [String
"Filter", String
"FunctionScoreFunction", String
"Weight"])
]