<div dir="ltr">村上です。<br><br>動的カラム機能すごくいいですね!<br><br>ソースを読んで、rank()関数とドリルダウンでも動的カラム<br>を作れるように挑戦したいと思います。<br><br><br></div><div class="gmail_extra"><br><div class="gmail_quote">2016年5月6日 11:52 Kouhei Sutou <span dir="ltr">&lt;<a href="mailto:kou****@clear*****" target="_blank">kou****@clear*****</a>&gt;</span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">須藤です。<br>
<br>
In &lt;<a href="mailto:CANM%2BHhcjeYcFPO%2Bw0Ujv_m10j9****@mail*****">CANM+HhcjeYcFPO+w0Ujv_m10j9****@mail*****</a>&gt;<br>
  &quot;[groonga-dev,04023] ドリルダウン結果の任意のkeyの順位を取得したい&quot; on Fri, 29 Apr 2016 18:12:32 +0900,<br>
<span class="">  Naoya Murakami &lt;<a href="mailto:visio****@gmail*****">visio****@gmail*****</a>&gt; wrote:<br>
<br>
&gt; Groongaでドリルダウン結果の任意のkeyの順位を取得できるようにしたいと<br>
&gt; 考えています。<br>
&gt;<br>
&gt; たとえば、<br>
&gt;<br>
&gt; _key, _nrecs<br>
&gt; 東京, 5000<br>
&gt; 神奈川, 3000<br>
&gt; 兵庫, 300<br>
&gt;<br>
&gt; というドリルダウン結果がある場合、兵庫が3番目であることを知りたいです。<br>
&gt;<br>
&gt; 数が少ない場合は全部だせばいいのですが、1万件とかになると全部<br>
&gt; 吐き出すのはやりたくないです。<br>
&gt;<br>
&gt; そこで、以下のような実装案を考えてみました。<br>
&gt;<br>
&gt; 1. グループ結果に順位を割り当てる<br>
&gt; --drilldown[label].calc_type RANK<br>
&gt;<br>
&gt; 2. ドリルダウン結果をfilterする<br>
&gt; --drilldown[label].filter &#39;_key == &quot;タグA&quot;&#39;<br>
&gt;<br>
&gt; RANKをわざわざ割り当てるのは、filter後でもグループ結果時点の順位を<br>
&gt; 得るためです。<br>
&gt; (filterしない場合は_idでランクはわかりますが、filterすると変わるので。)<br>
<br>
</span>なるほど。いわゆるウィンドウ関数が欲しいということですね。<br>
<br>
ウィンドウ関数をcalc_typeで実現するのはキビシイです。というのは、<br>
calc_typeを計算するときは前後のレコードの情報を知らないからです。RANK<br>
を実現するためには、該当レコードが何番目か?という情報が必要ですが、前<br>
後のレコードの情報を知らないとソートできないので計算できないのです。ま<br>
た、_nsubrecsでソートするためにはドリルダウンがすべて終わっている必要<br>
がありますが、calc_typeはドリルダウンしながら計算するのでこの時点では<br>
必要な情報が足りません。<br>
<br>
ということで、別のアプローチが必要になります。<br>
<br>
masterに <a href="https://github.com/groonga/groonga/issues/461" rel="noreferrer" target="_blank">https://github.com/groonga/groonga/issues/461</a> で説明している<br>
動的カラム作成機能を入れました。これと同じような感じで、<br>
<br>
  --drilldown[label].column[rank].stage initial \<br>
  --drilldown[label].column[rank].type UInt32 \<br>
  --drilldown[label].column[rank].flags COLUMN_SCALAR \<br>
  --drilldown[label].column[rank].value &#39;rank()&#39; \<br>
  --drilldown[label].column[rank].sortby _nsubrecs<br>
<br>
とできるようにするのはどうかなぁと思いました。<br>
<br>
で、ここで定義したrankはoutput_columnsで使えます。<br>
<br>
  --drilldown[label].output_columns &#39;_key, _nsubrecs, rank&#39;<br>
<br>
ーーdrilldown[label].filterはよいと思います。<br>
<br>
<br>
--<br>
須藤 功平 &lt;<a href="mailto:kou****@clear*****">kou****@clear*****</a>&gt;<br>
株式会社クリアコード &lt;<a href="http://www.clear-code.com/" rel="noreferrer" target="_blank">http://www.clear-code.com/</a>&gt;<br>
<br>
Groongaベースの全文検索システムを総合サポート:<br>
  <a href="http://groonga.org/ja/support/" rel="noreferrer" target="_blank">http://groonga.org/ja/support/</a><br>
パッチ採用 - プログラミングが楽しい人向けの採用プロセス:<br>
  <a href="http://www.clear-code.com/recruitment/" rel="noreferrer" target="_blank">http://www.clear-code.com/recruitment/</a><br>
リーダブルコードワークショップ:<br>
  <a href="http://www.clear-code.com/services/code-reader/readable-code-workshop.html" rel="noreferrer" target="_blank">http://www.clear-code.com/services/code-reader/readable-code-workshop.html</a><br>
<br>
_______________________________________________<br>
groonga-dev mailing list<br>
<a href="mailto:groon****@lists*****">groon****@lists*****</a><br>
<a href="http://lists.osdn.me/mailman/listinfo/groonga-dev" rel="noreferrer" target="_blank">http://lists.osdn.me/mailman/listinfo/groonga-dev</a><br>
</blockquote></div><br></div>