[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-active
Subject:    Re: Review Request 111401: implement ratings in the bodega-server
From:       "Aaron J. Seigo" <aseigo () kde ! org>
Date:       2013-07-25 9:39:33
Message-ID: 20130725093933.30124.98568 () vidsolbach ! de
[Download RAW message or body]

[Attachment #2 (multipart/alternative)]


-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
http://git.reviewboard.kde.org/r/111401/#review36471
-----------------------------------------------------------



server/lib/db/ratings.js
<http://git.reviewboard.kde.org/r/111401/#comment26923>

    addAsset sounds like it is .. well .. adding an asset. this should probably be \
addRatings or even addAssetRatings



server/lib/db/ratings.js
<http://git.reviewboard.kde.org/r/111401/#comment26919>

    may as well move this down after the if statment; no point in making the json if \
there's an error to report immediately after



server/lib/db/ratings.js
<http://git.reviewboard.kde.org/r/111401/#comment26922>

    having looked at the patch, there is a much better way of doing this imho.
    
    first, ct_checkAssociationOfRatingAttributeWithAsset should be a trigger and not \
checked here.  
    next, the delete and the insert should indeed go into a stored procedure and this \
code should call that stored procedure, something like:  
    ct_addAssetRating(personId int, assetId int, ratings int[][])
    
    it can iterate over all the ratings
    it can do the delete and insert, if it fails the \
ct_checkAssociationOfRatingAttributeWithAsset trigger will reject it.  
    the best part of this is that it means just one round trip to the database *and* \
we get a transaction around the whole thing for free.  
    as handling arrays is not particularly obvious in pl/pgsql, here is an example \
you can use:  
    CREATE OR REPLACE FUNCTION test(ratings int[][]) RETURNS VOID AS $$
    DECLARE
        rating  int[];
    BEGIN
        FOREACH rating SLICE 1 IN ARRAY ratings LOOP
            RAISE NOTICE 'ratings are % %', rating[1], rating[2];
        END LOOP;
    END;
    $$ LANGUAGE plpgsql;
    select test(ARRAY[[1, 2], [3, 4]]);
    



server/lib/db/ratings.js
<http://git.reviewboard.kde.org/r/111401/#comment26920>

    when using async, you should pass the error to the callback and handle the error \
in the final function.  
    the reason for this is that with queue, if there is an error there may be \
multiple workers going and if the all error then multiple errors will be reported \
back to the client.  
    with a queue, you can push the error back to the drain (due to the concurrency) \
but you can have an error variable in the out function (addAsset) which they assign \
their error to.  
    then each worker can check if error is set and if it is then don't do any more \
work. in the drain, you can check for this error and report it there.



server/routes.js
<http://git.reviewboard.kde.org/r/111401/#comment26917>

    this should be 'asset/ratings/:assetId'. it is not listing anything: it is adding \
ratings



sql/ratings.sql
<http://git.reviewboard.kde.org/r/111401/#comment26921>

    first: appending "2" to a function name is not a good enough way to name \
functions. what does "2" mean?  
    in this case, i would just use ct_checkAssociationOfRatingAttributeWithAsset as \
the trigger not even bother checking in the client. do the request, and if the \
trigger rejects it, then it fails.  
    this means fewer round trips between the nodejs app and the ratings.


- Aaron J. Seigo


On July 25, 2013, 7:57 a.m., Giorgos Tsiapaliokas wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> http://git.reviewboard.kde.org/r/111401/
> -----------------------------------------------------------
> 
> (Updated July 25, 2013, 7:57 a.m.)
> 
> 
> Review request for Bodega.
> 
> 
> Description
> -------
> 
> This patch implements the ratings feature in the bodega-server.
> 
> I have also attached a screenshot of the apidocs.
> 
> 
> Diffs
> -----
> 
> server/bodegaDbHelper ba740cb 
> server/doc/bodega.json 59c14e3 
> server/lib/bodegadb.js 3be8d81 
> server/lib/db/ratings.js PRE-CREATION 
> server/lib/errors.js 356d7c4 
> server/routes.js 726fc80 
> server/test/ratings.js PRE-CREATION 
> sql/core.plsql 7b92784 
> sql/ratings.sql PRE-CREATION 
> sql/testdata.sql dd15d57 
> 
> Diff: http://git.reviewboard.kde.org/r/111401/diff/
> 
> 
> Testing
> -------
> 
> ./node_modules/.bin/mocha test/ratings.js --reporter spec
> WARNING: Setting up server with no ssl!
> Bodega server listening on localhost:3000 in devel mode
> 
> 
> Ratings
> needs to authorize first
> ? authorize correctly. (107ms)
> List Attributes
> ? it should fail because the asset is invalid 
> ? it should succeed 
> Remove asset rate
> ? it should fail because the asset is invalid 
> ? it should succeed 
> Asset Ratings
> ? it should fail because the asset is invalid 
> ? it should succeed 
> ? it should be empty because there are no ratings for the asset 
> Participant
> ? it should succeed 
> ? it should have no ratings 
> Add asset rate
> ? it should fail because the asset is invalid 
> ? it should succeed 
> 
> 
> 12 passing (219 ms)
> 
> 
> File Attachments
> ----------------
> 
> 
> http://git.reviewboard.kde.org/media/uploaded/files/2013/07/05/bodega-ratings-apidocs.png
>  
> 
> Thanks,
> 
> Giorgos Tsiapaliokas
> 
> 


[Attachment #5 (text/html)]

<html>
 <body>
  <div style="font-family: Verdana, Arial, Helvetica, Sans-Serif;">
   <table bgcolor="#f9f3c9" width="100%" cellpadding="8" style="border: 1px #c9c399 \
solid;">  <tr>
     <td>
      This is an automatically generated e-mail. To reply, visit:
      <a href="http://git.reviewboard.kde.org/r/111401/">http://git.reviewboard.kde.org/r/111401/</a>
  </td>
    </tr>
   </table>
   <br />











<div>




<table width="100%" border="0" bgcolor="white" style="border: 1px solid #C0C0C0; \
border-collapse: collapse; margin: 2px padding: 2px;">  <thead>
  <tr>
   <th colspan="4" bgcolor="#F0F0F0" style="border-bottom: 1px solid #C0C0C0; \
font-size: 9pt; padding: 4px 8px; text-align: left;">  <a \
href="http://git.reviewboard.kde.org/r/111401/diff/4/?file=173253#file173253line118" \
style="color: black; font-weight: bold; text-decoration: \
underline;">server/lib/db/ratings.js</a>  <span style="font-weight: normal;">

     (Diff revision 4)

    </span>
   </th>
  </tr>
 </thead>



 
 

 <tbody>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">118</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "><span \
class="nx">module</span><span class="p">.</span><span class="nx">exports</span><span \
class="p">.</span><span class="nx">addAsset</span> <span class="o">=</span> <span \
class="kd">function</span><span class="p">(</span><span class="nx">db</span><span \
class="p">,</span> <span class="nx">req</span><span class="p">,</span> <span \
class="nx">res</span><span class="p">)</span> <span class="p">{</span></pre></td>  \
</tr>

 </tbody>

</table>

<pre style="margin-left: 2em; white-space: pre-wrap; white-space: -moz-pre-wrap; \
white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">addAsset \
sounds like it is .. well .. adding an asset. this should probably be addRatings or \
even addAssetRatings</pre> </div>
<br />

<div>




<table width="100%" border="0" bgcolor="white" style="border: 1px solid #C0C0C0; \
border-collapse: collapse; margin: 2px padding: 2px;">  <thead>
  <tr>
   <th colspan="4" bgcolor="#F0F0F0" style="border-bottom: 1px solid #C0C0C0; \
font-size: 9pt; padding: 4px 8px; text-align: left;">  <a \
href="http://git.reviewboard.kde.org/r/111401/diff/4/?file=173253#file173253line132" \
style="color: black; font-weight: bold; text-decoration: \
underline;">server/lib/db/ratings.js</a>  <span style="font-weight: normal;">

     (Diff revision 4)

    </span>
   </th>
  </tr>
 </thead>



 
 

 <tbody>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">132</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">    <span \
class="kd">var</span> <span class="nx">json</span> <span class="o">=</span> <span \
class="nx">utils</span><span class="p">.</span><span \
class="nx">standardJson</span><span class="p">(</span><span \
class="nx">req</span><span class="p">);</span></pre></td>  </tr>

 </tbody>

</table>

<pre style="margin-left: 2em; white-space: pre-wrap; white-space: -moz-pre-wrap; \
white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">may as well \
move this down after the if statment; no point in making the json if there&#39;s an \
error to report immediately after</pre> </div>
<br />

<div>




<table width="100%" border="0" bgcolor="white" style="border: 1px solid #C0C0C0; \
border-collapse: collapse; margin: 2px padding: 2px;">  <thead>
  <tr>
   <th colspan="4" bgcolor="#F0F0F0" style="border-bottom: 1px solid #C0C0C0; \
font-size: 9pt; padding: 4px 8px; text-align: left;">  <a \
href="http://git.reviewboard.kde.org/r/111401/diff/4/?file=173253#file173253line145" \
style="color: black; font-weight: bold; text-decoration: \
underline;">server/lib/db/ratings.js</a>  <span style="font-weight: normal;">

     (Diff revision 4)

    </span>
   </th>
  </tr>
 </thead>



 
 

 <tbody>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">145</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">            \
<span class="nx">checkAttributeQuery</span><span class="p">,</span> <span \
class="p">[</span><span class="nx">assetId</span><span class="p">,</span> <span \
class="nx">rating</span><span class="p">.</span><span \
class="nx">attribute</span><span class="p">],</span></pre></td>  </tr>

 </tbody>

</table>

<pre style="margin-left: 2em; white-space: pre-wrap; white-space: -moz-pre-wrap; \
white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">having \
looked at the patch, there is a much better way of doing this imho.

first, ct_checkAssociationOfRatingAttributeWithAsset should be a trigger and not \
checked here.

next, the delete and the insert should indeed go into a stored procedure and this \
code should call that stored procedure, something like:

ct_addAssetRating(personId int, assetId int, ratings int[][])

it can iterate over all the ratings
it can do the delete and insert, if it fails the \
ct_checkAssociationOfRatingAttributeWithAsset trigger will reject it.

the best part of this is that it means just one round trip to the database *and* we \
get a transaction around the whole thing for free.

as handling arrays is not particularly obvious in pl/pgsql, here is an example you \
can use:

CREATE OR REPLACE FUNCTION test(ratings int[][]) RETURNS VOID AS $$
DECLARE
    rating  int[];
BEGIN
    FOREACH rating SLICE 1 IN ARRAY ratings LOOP
        RAISE NOTICE &#39;ratings are % %&#39;, rating[1], rating[2];
    END LOOP;
END;
$$ LANGUAGE plpgsql;
select test(ARRAY[[1, 2], [3, 4]]);
</pre>
</div>
<br />

<div>




<table width="100%" border="0" bgcolor="white" style="border: 1px solid #C0C0C0; \
border-collapse: collapse; margin: 2px padding: 2px;">  <thead>
  <tr>
   <th colspan="4" bgcolor="#F0F0F0" style="border-bottom: 1px solid #C0C0C0; \
font-size: 9pt; padding: 4px 8px; text-align: left;">  <a \
href="http://git.reviewboard.kde.org/r/111401/diff/4/?file=173253#file173253line148" \
style="color: black; font-weight: bold; text-decoration: \
underline;">server/lib/db/ratings.js</a>  <span style="font-weight: normal;">

     (Diff revision 4)

    </span>
   </th>
  </tr>
 </thead>



 
 

 <tbody>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">148</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">              \
<span class="nx">errors</span><span class="p">.</span><span \
class="nx">report</span><span class="p">(</span><span \
class="s1">&#39;Database&#39;</span><span class="p">,</span> <span \
class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span \
class="p">);</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">149</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">              \
<span class="nx">cb</span><span class="p">();</span></pre></td>  </tr>

 </tbody>

</table>

<pre style="margin-left: 2em; white-space: pre-wrap; white-space: -moz-pre-wrap; \
white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">when using \
async, you should pass the error to the callback and handle the error in the final \
function.

the reason for this is that with queue, if there is an error there may be multiple \
workers going and if the all error then multiple errors will be reported back to the \
client.

with a queue, you can push the error back to the drain (due to the concurrency) but \
you can have an error variable in the out function (addAsset) which they assign their \
error to.

then each worker can check if error is set and if it is then don&#39;t do any more \
work. in the drain, you can check for this error and report it there.</pre> </div>
<br />

<div>




<table width="100%" border="0" bgcolor="white" style="border: 1px solid #C0C0C0; \
border-collapse: collapse; margin: 2px padding: 2px;">  <thead>
  <tr>
   <th colspan="4" bgcolor="#F0F0F0" style="border-bottom: 1px solid #C0C0C0; \
font-size: 9pt; padding: 4px 8px; text-align: left;">  <a \
href="http://git.reviewboard.kde.org/r/111401/diff/4/?file=173255#file173255line336" \
style="color: black; font-weight: bold; text-decoration: \
underline;">server/routes.js</a>  <span style="font-weight: normal;">

     (Diff revision 4)

    </span>
   </th>
  </tr>
 </thead>

 <tbody style="background-color: #e4d9cb; padding: 4px 8px; text-align: center;">
  <tr>

   <td colspan="4"><pre style="font-size: 8pt; line-height: 140%; margin: 0; \
">function serverPath(path)</pre></td>

  </tr>
 </tbody>



 
 

 <tbody>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">335</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "><span \
class="nx">app</span><span class="p">.</span><span class="nx">post</span><span \
class="p">(</span><span class="nx">serverPath</span><span class="p">(</span><span \
class="s1">&#39;asset/ratings/list/:assetId&#39;</span><span class="p">),</span> \
<span class="nx">isAuthorized</span><span class="p">,</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">336</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">        <span \
class="kd">function</span><span class="p">(</span><span class="nx">req</span><span \
class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span \
class="p">{</span></pre></td>  </tr>

 </tbody>

</table>

<pre style="margin-left: 2em; white-space: pre-wrap; white-space: -moz-pre-wrap; \
white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">this should \
be &#39;asset/ratings/:assetId&#39;. it is not listing anything: it is adding \
ratings</pre> </div>
<br />

<div>




<table width="100%" border="0" bgcolor="white" style="border: 1px solid #C0C0C0; \
border-collapse: collapse; margin: 2px padding: 2px;">  <thead>
  <tr>
   <th colspan="4" bgcolor="#F0F0F0" style="border-bottom: 1px solid #C0C0C0; \
font-size: 9pt; padding: 4px 8px; text-align: left;">  <a \
href="http://git.reviewboard.kde.org/r/111401/diff/4/?file=173258#file173258line48" \
style="color: black; font-weight: bold; text-decoration: \
underline;">sql/ratings.sql</a>  <span style="font-weight: normal;">

     (Diff revision 4)

    </span>
   </th>
  </tr>
 </thead>



 
 

 <tbody>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">48</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "><span \
class="k">CREATE</span> <span class="k">OR</span> <span class="k">REPLACE</span> \
<span class="k">FUNCTION</span> <span \
class="n">ct_checkAssociationOfRatingAttributeWithAsset</span><span \
class="p">(</span><span class="nb">int</span><span class="p">,</span> <span \
class="nb">int</span><span class="p">)</span> <span class="k">RETURNS</span> <span \
class="n">BOOL</span> <span class="k">AS</span> <span \
class="err">$$</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">49</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "><span \
class="k">DECLARE</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">50</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">    <span \
class="n">assetId</span> <span class="nb">INT</span><span \
class="p">;</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">51</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "><span \
class="k">BEGIN</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">52</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  \
</tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">53</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">    <span \
class="k">SELECT</span> <span class="k">INTO</span> <span class="n">assetId</span> \
<span class="n">asset</span> <span class="k">FROM</span> <span \
class="n">assettags</span> <span class="k">at</span> <span class="k">INNER</span> \
<span class="k">JOIN</span> <span class="n">tags</span> <span class="n">t</span> \
<span class="k">ON</span> <span class="p">(</span><span class="n">t</span><span \
class="p">.</span><span class="n">id</span> <span class="o">=</span> <span \
class="k">at</span><span class="p">.</span><span class="n">tag</span><span \
class="p">)</span> <span class="k">INNER</span> <span class="k">JOIN</span> <span \
class="n">ratingattributes</span> <span class="n">ra</span> <span class="k">ON</span> \
<span class="p">(</span><span class="n">ra</span><span class="p">.</span><span \
class="n">assettype</span> <span class="o">=</span> <span class="n">t</span><span \
class="p">.</s  pan><span class="n">id</span><span class="p">)</span> <span \
class="k">WHERE</span> <span class="k">at</span><span class="p">.</span><span \
class="n">asset</span> <span class="o">=</span> <span class="err">$</span><span \
class="mi">1</span> <span class="k">and</span> <span class="n">ra</span><span \
class="p">.</span><span class="n">id</span> <span class="o">=</span> <span \
class="err">$</span><span class="mi">2</span><span class="p">;</span></pre></td>  \
</tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">54</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  \
</tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">55</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">    <span \
class="n">IF</span> <span class="k">NOT</span> <span class="k">FOUND</span> <span \
class="k">THEN</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">56</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">        <span \
class="k">RETURN</span> <span class="k">FALSE</span><span \
class="p">;</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">57</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">    <span \
class="k">END</span> <span class="n">IF</span><span class="p">;</span></pre></td>  \
</tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">58</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  \
</tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">59</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">    <span \
class="k">RETURN</span> <span class="k">TRUE</span><span \
class="p">;</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">60</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "><span \
class="k">END</span><span class="p">;</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">61</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "><span \
class="err">$$</span> <span class="k">LANGUAGE</span> <span \
class="s1">&#39;plpgsql&#39;</span><span class="p">;</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">62</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  \
</tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">63</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "><span \
class="k">CREATE</span> <span class="k">OR</span> <span class="k">REPLACE</span> \
<span class="k">FUNCTION</span> <span \
class="n">ct_checkAssociationOfRatingAttributeWithAsset2</span><span \
class="p">()</span> <span class="k">RETURNS</span> <span class="k">TRIGGER</span> \
<span class="k">AS</span> <span class="err">$$</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">64</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "><span \
class="k">DECLARE</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">65</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "><span \
class="k">BEGIN</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">66</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">    <span \
class="n">IF</span> <span class="k">NOT</span> <span \
class="n">ct_checkAssociationOfRatingAttributeWithAsset</span><span \
class="p">(</span><span class="k">NEW</span><span class="p">.</span><span \
class="n">asset</span><span class="p">,</span> <span class="k">NEW</span><span \
class="p">.</span><span class="n">attribute</span><span class="p">)</span> <span \
class="k">THEN</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">67</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">        <span \
class="n">RAISE</span> <span class="n">EXCEPTION</span> <span class="s1">&#39;The \
asset can&#39;&#39;t be associated with the rating attribute &#39;</span><span \
class="p">;</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">68</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">    <span \
class="k">END</span> <span class="n">IF</span><span class="p">;</span></pre></td>  \
</tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">69</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  \
</tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">70</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">    <span \
class="k">RETURN</span> <span class="k">NEW</span><span class="p">;</span></pre></td> \
</tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">71</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "><span \
class="k">END</span><span class="p">;</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">72</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "><span \
class="err">$$</span> <span class="k">LANGUAGE</span> <span \
class="s1">&#39;plpgsql&#39;</span><span class="p">;</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">73</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  \
</tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">74</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "><span \
class="k">DROP</span> <span class="k">TRIGGER</span> <span class="n">IF</span> <span \
class="k">EXISTS</span> <span \
class="n">trg_ct_checkAssociationOfRatingAttributeWithAsset</span> <span \
class="k">ON</span> <span class="n">ratings</span><span class="p">;</span></pre></td> \
</tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">75</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "><span \
class="k">CREATE</span> <span class="k">TRIGGER</span> <span \
class="n">trg_ct_checkAssociationOfRatingAttributeWithAsset</span> <span \
class="k">BEFORE</span> <span class="k">INSERT</span> <span class="k">ON</span> <span \
class="n">ratings</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">76</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "><span \
class="k">FOR</span> <span class="k">EACH</span> <span class="k">ROW</span> <span \
class="k">EXECUTE</span> <span class="k">PROCEDURE</span> <span \
class="n">ct_checkAssociationOfRatingAttributeWithAsset2</span><span \
class="p">();</span></pre></td>  </tr>

 </tbody>

</table>

<pre style="margin-left: 2em; white-space: pre-wrap; white-space: -moz-pre-wrap; \
white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">first: \
appending &quot;2&quot; to a function name is not a good enough way to name \
functions. what does &quot;2&quot; mean?

in this case, i would just use ct_checkAssociationOfRatingAttributeWithAsset as the \
trigger not even bother checking in the client. do the request, and if the trigger \
rejects it, then it fails.

this means fewer round trips between the nodejs app and the ratings.</pre>
</div>
<br />



<p>- Aaron J.</p>


<br />
<p>On July 25th, 2013, 7:57 a.m. UTC, Giorgos Tsiapaliokas wrote:</p>








<table bgcolor="#fefadf" width="100%" cellspacing="0" cellpadding="8" \
style="background-image: \
url('http://git.reviewboard.kde.org/static/rb/images/review_request_box_top_bg.ab6f3b1072c9.png'); \
background-position: left top; background-repeat: repeat-x; border: 1px black \
solid;">  <tr>
  <td>

<div>Review request for Bodega.</div>
<div>By Giorgos Tsiapaliokas.</div>


<p style="color: grey;"><i>Updated July 25, 2013, 7:57 a.m.</i></p>






<h1 style="color: #575012; font-size: 10pt; margin-top: 1.5em;">Description </h1>
 <table width="100%" bgcolor="#ffffff" cellspacing="0" cellpadding="10" \
style="border: 1px solid #b8b5a0">  <tr>
  <td>
   <pre style="margin: 0; padding: 0; white-space: pre-wrap; white-space: \
-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: \
break-word;">This patch implements the ratings feature in the bodega-server.

I have also attached a screenshot of the apidocs.</pre>
  </td>
 </tr>
</table>


<h1 style="color: #575012; font-size: 10pt; margin-top: 1.5em;">Testing </h1>
<table width="100%" bgcolor="#ffffff" cellspacing="0" cellpadding="10" style="border: \
1px solid #b8b5a0">  <tr>
  <td>
   <pre style="margin: 0; padding: 0; white-space: pre-wrap; white-space: \
-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: \
                break-word;">./node_modules/.bin/mocha test/ratings.js --reporter \
                spec
WARNING: Setting up server with no ssl!
Bodega server listening on localhost:3000 in devel mode


  Ratings
    needs to authorize first
      ? authorize correctly. (107ms)
    List Attributes
      ? it should fail because the asset is invalid 
      ? it should succeed 
    Remove asset rate
      ? it should fail because the asset is invalid 
      ? it should succeed 
    Asset Ratings
      ? it should fail because the asset is invalid 
      ? it should succeed 
      ? it should be empty because there are no ratings for the asset 
    Participant
      ? it should succeed 
      ? it should have no ratings 
    Add asset rate
      ? it should fail because the asset is invalid 
      ? it should succeed 


  12 passing (219 ms)
</pre>
  </td>
 </tr>
</table>




<h1 style="color: #575012; font-size: 10pt; margin-top: 1.5em;">Diffs</b> </h1>
<ul style="margin-left: 3em; padding-left: 0;">

 <li>server/bodegaDbHelper <span style="color: grey">(ba740cb)</span></li>

 <li>server/doc/bodega.json <span style="color: grey">(59c14e3)</span></li>

 <li>server/lib/bodegadb.js <span style="color: grey">(3be8d81)</span></li>

 <li>server/lib/db/ratings.js <span style="color: grey">(PRE-CREATION)</span></li>

 <li>server/lib/errors.js <span style="color: grey">(356d7c4)</span></li>

 <li>server/routes.js <span style="color: grey">(726fc80)</span></li>

 <li>server/test/ratings.js <span style="color: grey">(PRE-CREATION)</span></li>

 <li>sql/core.plsql <span style="color: grey">(7b92784)</span></li>

 <li>sql/ratings.sql <span style="color: grey">(PRE-CREATION)</span></li>

 <li>sql/testdata.sql <span style="color: grey">(dd15d57)</span></li>

</ul>

<p><a href="http://git.reviewboard.kde.org/r/111401/diff/" style="margin-left: \
3em;">View Diff</a></p>



<h1 style="color: #575012; font-size: 10pt; margin-top: 1.5em;">File Attachments \
</h1>

<ul>

 <li><a href="http://git.reviewboard.kde.org/media/uploaded/files/2013/07/05/bodega-ratings-apidocs.png">bodega-ratings-apidocs.png</a></li>


</ul>





  </td>
 </tr>
</table>








  </div>
 </body>
</html>



_______________________________________________
Active mailing list
Active@kde.org
https://mail.kde.org/mailman/listinfo/active


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic