mirror of
https://github.com/khibino/haskell-relational-record.git
synced 2024-09-17 11:58:26 +03:00
Add some signatures. Formatting.
This commit is contained in:
parent
a39049520f
commit
c8d18a7153
@ -250,18 +250,20 @@ birthdayHeiseiDesc <span class="fu">=</span> aggregateRelation <span class="fu"
|
||||
<span class="kw">WHERE</span> (T1.day >= <span class="dt">DATE</span> <span class="st">'1989-01-08'</span>)
|
||||
<span class="kw">GROUP</span> <span class="kw">BY</span> T1.day <span class="kw">ORDER</span> <span class="kw">BY</span> <span class="fu">COUNT</span> (T0.name) <span class="kw">DESC</span></code></pre>
|
||||
</div>
|
||||
<div id="others-features" class="titleslide slide section level1"><h1>Others Features</h1></div><div id="placeholder" class="slide section level2">
|
||||
<div id="other-features" class="titleslide slide section level1"><h1>Other Features</h1></div><div id="placeholder" class="slide section level2">
|
||||
<h1>Placeholder</h1>
|
||||
<pre class="sourceCode haskell"><code class="sourceCode haskell"><span class="ot">specifyPerson ::</span> <span class="dt">Relation</span> <span class="dt">String</span> (<span class="dt">Person</span>, <span class="dt">Birthday</span>)
|
||||
specifyPerson <span class="fu">=</span> relation' <span class="fu">$</span> <span class="kw">do</span>
|
||||
pb <span class="ot"><-</span> query personAndBirthday <span class="co">-- Re-use predefined</span>
|
||||
(ph, ()) <span class="ot"><-</span> placeholder (\ph' <span class="ot">-></span> wheres <span class="fu">$</span> pb <span class="fu">!</span> fst' <span class="fu">!</span> Person.name' <span class="fu">.=.</span> ph')
|
||||
(ph, ()) <span class="ot"><-</span> placeholder
|
||||
(\ph' <span class="ot">-></span> wheres <span class="fu">$</span> pb <span class="fu">!</span> fst' <span class="fu">!</span> Person.name' <span class="fu">.=.</span> ph')
|
||||
return (ph, pb)</code></pre>
|
||||
<p>Specify person name using placeholder.</p>
|
||||
<pre class="sourceCode sql"><code class="sourceCode sql"><span class="kw">SELECT</span> <span class="kw">ALL</span> T2.f0 <span class="kw">AS</span> f0, T2.f1 <span class="kw">AS</span> f1, T2.f2 <span class="kw">AS</span> f2,
|
||||
T2.f3 <span class="kw">AS</span> f3, T2.f4 <span class="kw">AS</span> f4
|
||||
<span class="kw">FROM</span> (<span class="kw">SELECT</span> <span class="kw">ALL</span> T0.name <span class="kw">AS</span> f0, T0.age <span class="kw">AS</span> f1, T0.address <span class="kw">AS</span> f2,
|
||||
T1.name <span class="kw">AS</span> f3, T1.day <span class="kw">AS</span> f4
|
||||
<span class="kw">FROM</span> (<span class="kw">SELECT</span> <span class="kw">ALL</span>
|
||||
T0.name <span class="kw">AS</span> f0, T0.age <span class="kw">AS</span> f1, T0.address <span class="kw">AS</span> f2,
|
||||
T1.name <span class="kw">AS</span> f3, T1.day <span class="kw">AS</span> f4
|
||||
<span class="kw">FROM</span> PUBLIC.person T0 <span class="kw">INNER</span> <span class="kw">JOIN</span>
|
||||
PUBLIC.birthday T1
|
||||
<span class="kw">ON</span> (T0.name = T1.name)) T2
|
||||
@ -285,7 +287,8 @@ personAndBirthdayT <span class="fu">=</span> relation <span class="fu">$</span>
|
||||
p <span class="ot"><-</span> query person
|
||||
b <span class="ot"><-</span> query birthday
|
||||
wheres <span class="fu">$</span> p <span class="fu">!</span> Person.name' <span class="fu">.=.</span> b <span class="fu">!</span> Birthday.name'
|
||||
return <span class="fu">$</span> <span class="dt">PersonAndBirthday</span> <span class="fu">|$|</span> p <span class="fu">|*|</span> b <span class="co">-- Build record phantom type</span>
|
||||
<span class="co">-- Build record phantom type</span>
|
||||
return <span class="fu">$</span> <span class="dt">PersonAndBirthday</span> <span class="fu">|$|</span> p <span class="fu">|*|</span> b
|
||||
|
||||
<span class="ot">(|$|) ::</span> <span class="dt">ProductConstructor</span> (a <span class="ot">-></span> b)
|
||||
<span class="ot">=></span> (a <span class="ot">-></span> b) <span class="ot">-></span> <span class="dt">Projection</span> c a <span class="ot">-></span> <span class="dt">Projection</span> c b
|
||||
@ -305,16 +308,19 @@ uncurryPB <span class="fu">=</span> <span class="dt">PersonAndBirthday</span> <
|
||||
<h1>Record Mapping - Placeholder</h1>
|
||||
<p>Placeholder can be map to record.</p>
|
||||
<pre class="sourceCode haskell"><code class="sourceCode haskell">placeholder3 f <span class="fu">=</span>
|
||||
placeholder (\p0 <span class="ot">-></span> placeholder (\p1 <span class="ot">-></span> placeholder (\p2 <span class="ot">-></span> f p0 p1 p2)))
|
||||
placeholder (\p0 <span class="ot">-></span> placeholder
|
||||
(\p1 <span class="ot">-></span> placeholder (\p2 <span class="ot">-></span> f p0 p1 p2)))
|
||||
|
||||
<span class="ot">personAndBirthdayP2 ::</span> <span class="dt">Relation</span> ((<span class="dt">String</span>, <span class="dt">Int32</span>), <span class="dt">String</span>) <span class="dt">PersonAndBirthday</span>
|
||||
<span class="ot">personAndBirthdayP2 ::</span> <span class="dt">Relation</span> ((<span class="dt">String</span>, <span class="dt">Int32</span>), <span class="dt">String</span>)
|
||||
<span class="dt">PersonAndBirthday</span>
|
||||
personAndBirthdayP2 <span class="fu">=</span> relation' <span class="fu">$</span> <span class="kw">do</span>
|
||||
p <span class="ot"><-</span> query person
|
||||
b <span class="ot"><-</span> query birthday
|
||||
(ph0, (ph1, (ph2, ()))) <span class="ot"><-</span>
|
||||
placeholder3 (\ph0' ph1' ph2' <span class="ot">-></span>
|
||||
wheres <span class="fu">$</span>
|
||||
(<span class="dt">Person</span> <span class="fu">|$|</span> p <span class="fu">!</span> Person.name' <span class="fu">|*|</span> p <span class="fu">!</span> Person.age' <span class="fu">|*|</span> p <span class="fu">!</span> Person.address')
|
||||
(<span class="dt">Person</span> <span class="fu">|$|</span> p <span class="fu">!</span> Person.name'
|
||||
<span class="fu">|*|</span> p <span class="fu">!</span> Person.age' <span class="fu">|*|</span> p <span class="fu">!</span> Person.address')
|
||||
<span class="fu">.=.</span>
|
||||
(<span class="dt">Person</span> <span class="fu">|$|</span> ph0' <span class="fu">|*|</span> ph1' <span class="fu">|*|</span> ph2') )
|
||||
return <span class="fu">$</span> (ph0 <span class="fu">><</span> ph1 <span class="fu">><</span> ph2, <span class="dt">PersonAndBirthday</span> <span class="fu">|$|</span> p <span class="fu">|*|</span> b)</code></pre>
|
||||
@ -345,12 +351,27 @@ ageRankOfFamilies <span class="fu">=</span> relation <span class="fu">$</span>
|
||||
my <span class="fu">!</span> age'</code></pre>
|
||||
</div><div id="discussion" class="slide section level2">
|
||||
<h1>Discussion</h1>
|
||||
</div><div id="exists-operator" class="slide section level2">
|
||||
</div>
|
||||
<div id="others" class="titleslide slide section level1"><h1>Others</h1></div><div id="exists-operator" class="slide section level2">
|
||||
<h1>exists operator</h1>
|
||||
</div><div id="scalar-query" class="slide section level2">
|
||||
<h1>Scalar Query</h1>
|
||||
<pre class="sourceCode haskell"><code class="sourceCode haskell"><span class="ot">exists ::</span> (<span class="dt">SqlProjectable</span> p, <span class="dt">ProjectableShowSql</span> p)
|
||||
<span class="ot">=></span> <span class="dt">ListProjection</span> (<span class="dt">Projection</span> <span class="dt">Exists</span>) r <span class="ot">-></span> p (<span class="dt">Maybe</span> <span class="dt">Bool</span>)
|
||||
|
||||
<span class="ot">values ::</span> (<span class="dt">ShowConstantTermsSQL</span> t, <span class="dt">SqlProjectable</span> p)
|
||||
<span class="ot">=></span> [t] <span class="ot">-></span> <span class="dt">ListProjection</span> p t
|
||||
|
||||
<span class="ot">queryList ::</span> <span class="dt">MonadQualify</span> <span class="dt">ConfigureQuery</span> m
|
||||
<span class="ot">=></span> <span class="dt">Relation</span> () r
|
||||
<span class="ot">-></span> m (<span class="dt">ListProjection</span> (<span class="dt">Projection</span> c) r)</code></pre>
|
||||
</div><div id="in-operator" class="slide section level2">
|
||||
<h1>in' operator</h1>
|
||||
<pre class="sourceCode haskell"><code class="sourceCode haskell"><span class="ot">in' ::</span> (<span class="dt">SqlProjectable</span> p, <span class="dt">ProjectableShowSql</span> p)
|
||||
<span class="ot">=></span> p t <span class="ot">-></span> <span class="dt">ListProjection</span> p t <span class="ot">-></span> p (<span class="dt">Maybe</span> <span class="dt">Bool</span>)</code></pre>
|
||||
</div><div id="scalar-query" class="slide section level2">
|
||||
<h1>Scalar Query</h1>
|
||||
<pre class="sourceCode haskell"><code class="sourceCode haskell"><span class="ot">queryScalar ::</span> (<span class="dt">MonadQualify</span> <span class="dt">ConfigureQuery</span> m, <span class="dt">ScalarDegree</span> r)
|
||||
<span class="ot">=></span> <span class="dt">UniqueRelation</span> () c r
|
||||
<span class="ot">-></span> m (<span class="dt">Projection</span> c (<span class="dt">Maybe</span> r))</code></pre>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
@ -301,7 +301,7 @@ SELECT ALL T1.day AS f0, COUNT (T0.name) AS f1
|
||||
~~~~~
|
||||
|
||||
|
||||
Others Features
|
||||
Other Features
|
||||
=====
|
||||
|
||||
Placeholder
|
||||
@ -311,7 +311,8 @@ Placeholder
|
||||
specifyPerson :: Relation String (Person, Birthday)
|
||||
specifyPerson = relation' $ do
|
||||
pb <- query personAndBirthday -- Re-use predefined
|
||||
(ph, ()) <- placeholder (\ph' -> wheres $ pb ! fst' ! Person.name' .=. ph')
|
||||
(ph, ()) <- placeholder
|
||||
(\ph' -> wheres $ pb ! fst' ! Person.name' .=. ph')
|
||||
return (ph, pb)
|
||||
~~~~~
|
||||
|
||||
@ -320,8 +321,9 @@ Specify person name using placeholder.
|
||||
~~~~~ {.sql}
|
||||
SELECT ALL T2.f0 AS f0, T2.f1 AS f1, T2.f2 AS f2,
|
||||
T2.f3 AS f3, T2.f4 AS f4
|
||||
FROM (SELECT ALL T0.name AS f0, T0.age AS f1, T0.address AS f2,
|
||||
T1.name AS f3, T1.day AS f4
|
||||
FROM (SELECT ALL
|
||||
T0.name AS f0, T0.age AS f1, T0.address AS f2,
|
||||
T1.name AS f3, T1.day AS f4
|
||||
FROM PUBLIC.person T0 INNER JOIN
|
||||
PUBLIC.birthday T1
|
||||
ON (T0.name = T1.name)) T2
|
||||
@ -355,7 +357,8 @@ personAndBirthdayT = relation $ do
|
||||
p <- query person
|
||||
b <- query birthday
|
||||
wheres $ p ! Person.name' .=. b ! Birthday.name'
|
||||
return $ PersonAndBirthday |$| p |*| b -- Build record phantom type
|
||||
-- Build record phantom type
|
||||
return $ PersonAndBirthday |$| p |*| b
|
||||
|
||||
(|$|) :: ProductConstructor (a -> b)
|
||||
=> (a -> b) -> Projection c a -> Projection c b
|
||||
@ -385,16 +388,19 @@ Placeholder can be map to record.
|
||||
|
||||
~~~~~ {.haskell}
|
||||
placeholder3 f =
|
||||
placeholder (\p0 -> placeholder (\p1 -> placeholder (\p2 -> f p0 p1 p2)))
|
||||
placeholder (\p0 -> placeholder
|
||||
(\p1 -> placeholder (\p2 -> f p0 p1 p2)))
|
||||
|
||||
personAndBirthdayP2 :: Relation ((String, Int32), String) PersonAndBirthday
|
||||
personAndBirthdayP2 :: Relation ((String, Int32), String)
|
||||
PersonAndBirthday
|
||||
personAndBirthdayP2 = relation' $ do
|
||||
p <- query person
|
||||
b <- query birthday
|
||||
(ph0, (ph1, (ph2, ()))) <-
|
||||
placeholder3 (\ph0' ph1' ph2' ->
|
||||
wheres $
|
||||
(Person |$| p ! Person.name' |*| p ! Person.age' |*| p ! Person.address')
|
||||
(Person |$| p ! Person.name'
|
||||
|*| p ! Person.age' |*| p ! Person.address')
|
||||
.=.
|
||||
(Person |$| ph0' |*| ph1' |*| ph2') )
|
||||
return $ (ph0 >< ph1 >< ph2, PersonAndBirthday |$| p |*| b)
|
||||
@ -439,11 +445,37 @@ ageRankOfFamilies = relation $ do
|
||||
Discussion
|
||||
-----
|
||||
|
||||
Others
|
||||
=====
|
||||
|
||||
exists operator
|
||||
-----
|
||||
|
||||
~~~~~ {.haskell}
|
||||
exists :: (SqlProjectable p, ProjectableShowSql p)
|
||||
=> ListProjection (Projection Exists) r -> p (Maybe Bool)
|
||||
|
||||
values :: (ShowConstantTermsSQL t, SqlProjectable p)
|
||||
=> [t] -> ListProjection p t
|
||||
|
||||
queryList :: MonadQualify ConfigureQuery m
|
||||
=> Relation () r
|
||||
-> m (ListProjection (Projection c) r)
|
||||
~~~~~
|
||||
|
||||
in' operator
|
||||
-----
|
||||
|
||||
~~~~~ {.haskell}
|
||||
in' :: (SqlProjectable p, ProjectableShowSql p)
|
||||
=> p t -> ListProjection p t -> p (Maybe Bool)
|
||||
~~~~~
|
||||
|
||||
Scalar Query
|
||||
-----
|
||||
|
||||
in' operator
|
||||
-----
|
||||
~~~~~ {.haskell}
|
||||
queryScalar :: (MonadQualify ConfigureQuery m, ScalarDegree r)
|
||||
=> UniqueRelation () c r
|
||||
-> m (Projection c (Maybe r))
|
||||
~~~~~
|
||||
|
Loading…
Reference in New Issue
Block a user