aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app/Main.hs49
1 files changed, 30 insertions, 19 deletions
diff --git a/app/Main.hs b/app/Main.hs
index c0e6d11..493a807 100644
--- a/app/Main.hs
+++ b/app/Main.hs
@@ -27,19 +27,21 @@ debug s x = trace (printf "%s: %s" s (show x)) x
main :: IO ()
main = do
setCurrentDirectory "./data"
- putStrLn "> SELECT . FROM c"
- query' $ Select [Unqualified "."] "c" [] []
+ putStrLn "> SELECT * FROM c"
+ query' $ Select All "c" [] []
- putStrLn "\n> SELECT id FROM c"
- query' $ Select [Unqualified "id"] "c" [] []
+ putStrLn "\n> SELECT * FROM j"
+ query' $ Select All "j" [] []
putStrLn "\n> SELECT c.id, j.id, is_j FROM c LEFT JOIN j ON j.id == c.j_id"
query' $
Select
- [ Qualified "c" "id",
- Qualified "j" "id",
- Unqualified "is_j"
- ]
+ ( Only
+ [ Qualified "c" "id",
+ Qualified "j" "id",
+ Unqualified "is_j"
+ ]
+ )
"c"
[ LeftJoin
"j"
@@ -51,9 +53,11 @@ main = do
putStrLn "\n> SELECT c.id, j.id FROM c RIGHT JOIN j ON j.id == c.j_id"
query' $
Select
- [ Qualified "c" "id",
- Qualified "j" "id"
- ]
+ ( Only
+ [ Qualified "c" "id",
+ Qualified "j" "id"
+ ]
+ )
"c"
[ RightJoin
"j"
@@ -65,9 +69,11 @@ main = do
putStrLn "\n> SELECT c.id, j.id FROM c FULL JOIN j ON j.id == c.j_id"
query' $
Select
- [ Qualified "c" "id",
- Qualified "j" "id"
- ]
+ ( Only
+ [ Qualified "c" "id",
+ Qualified "j" "id"
+ ]
+ )
"c"
[ FullJoin
"j"
@@ -77,7 +83,12 @@ main = do
[]
data Query
- = Select [Field] Collection [Join FilePath] Where
+ = Select FieldSelector Collection [Join FilePath] Where
+ deriving (Show)
+
+data FieldSelector
+ = All
+ | Only [Field]
deriving (Show)
data Field
@@ -179,8 +190,10 @@ decodeFile :: J.FromJSON a => FilePath -> IO a
decodeFile =
fmap (fromMaybe (throw DecodeException)) . J.decodeFileStrict
-select :: [Field] -> [Record J.Value] -> J.Value
-select fs vs =
+select :: FieldSelector -> [Record J.Value] -> J.Value
+select All vs =
+ join' (map (\(Record _ v) -> v) vs)
+select (Only fs) vs =
mergeUnsafe (join' (map ((\(Record _ v) -> v) . select' fs) vs)) v0
where
v0 =
@@ -188,13 +201,11 @@ select fs vs =
mapMaybe
( \f -> case f of
Qualified c k -> Just $ J.Object $ JM.singleton (JK.fromText (T.pack c <> "." <> k)) J.Null
- Unqualified "." -> Nothing
Unqualified k -> Just $ J.Object $ JM.singleton (JK.fromText k) J.Null
)
fs
select' :: [Field] -> Record J.Value -> Record J.Value
-select' [Unqualified "."] v = v
select' fs (Record c (J.Object kvs)) =
Record c . J.Object $
JM.fromList . mapMaybe match . JM.toList $