Add some signatures. Formatting.

This commit is contained in:
Kei Hibino 2014-12-24 18:14:02 +09:00
parent a39049520f
commit c8d18a7153
2 changed files with 74 additions and 21 deletions

View File

@ -250,18 +250,20 @@ birthdayHeiseiDesc <span class="fu">=</span> aggregateRelation <span class="fu"
<span class="kw">WHERE</span> (T1.day &gt;= <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">&lt;-</span> query personAndBirthday <span class="co">-- Re-use predefined</span>
(ph, ()) <span class="ot">&lt;-</span> placeholder (\ph' <span class="ot">-&gt;</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">&lt;-</span> placeholder
(\ph' <span class="ot">-&gt;</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">&lt;-</span> query person
b <span class="ot">&lt;-</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">-&gt;</span> b)
<span class="ot">=&gt;</span> (a <span class="ot">-&gt;</span> b) <span class="ot">-&gt;</span> <span class="dt">Projection</span> c a <span class="ot">-&gt;</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">-&gt;</span> placeholder (\p1 <span class="ot">-&gt;</span> placeholder (\p2 <span class="ot">-&gt;</span> f p0 p1 p2)))
placeholder (\p0 <span class="ot">-&gt;</span> placeholder
(\p1 <span class="ot">-&gt;</span> placeholder (\p2 <span class="ot">-&gt;</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">&lt;-</span> query person
b <span class="ot">&lt;-</span> query birthday
(ph0, (ph1, (ph2, ()))) <span class="ot">&lt;-</span>
placeholder3 (\ph0' ph1' ph2' <span class="ot">-&gt;</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">&gt;&lt;</span> ph1 <span class="fu">&gt;&lt;</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">=&gt;</span> <span class="dt">ListProjection</span> (<span class="dt">Projection</span> <span class="dt">Exists</span>) r <span class="ot">-&gt;</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">=&gt;</span> [t] <span class="ot">-&gt;</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">=&gt;</span> <span class="dt">Relation</span> () r
<span class="ot">-&gt;</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">=&gt;</span> p t <span class="ot">-&gt;</span> <span class="dt">ListProjection</span> p t <span class="ot">-&gt;</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">=&gt;</span> <span class="dt">UniqueRelation</span> () c r
<span class="ot">-&gt;</span> m (<span class="dt">Projection</span> c (<span class="dt">Maybe</span> r))</code></pre>
</div>
</div>
</body>

View File

@ -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))
~~~~~