<div dir="ltr">どちらも妥当で、意図したとおりの動作だと思います!<div>コメントの方が実態と異なっていると思います!</div></div><div class="gmail_extra"><br><div class="gmail_quote">2015-04-23 12:18 GMT+09:00 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>
森さん、grn_patでの有効なノードの確認方法について教えてくだ<br>
さい。<br>
<br>
知りたいことは次の2つです。<br>
<br>
  * 有効な子ノードが親ノードのcheckと同じケースはありえるの<br>
    か(実際にあるんで、それが意図したものなのかを知りたい)<br>
<br>
  * 有効な子ノードのcheckが0のケースはありえるのか<br>
    (こっちも実際にあるんで、それが意図したものなのかを知り<br>
    たい)<br>
<br>
詳細は次の通りです。<br>
<br>
森さんに直してもらった_grn_pat_del()の問題の再現に使ったデー<br>
タでは、grn_p(ctx, pat)(patの中身を読みやすい形で表示する関<br>
数)が期待通りに動かないことがわかりました。具体的には<br>
<br>
  1. grn_pat_add(&quot;2&quot;)<br>
  2. grn_pat_add(&quot;1&quot;)<br>
  3. grn_pat_add(&quot;3&quot;)<br>
<br>
とした状態で&quot;3&quot;のノードの中身を表示しません。実際の表示は次<br>
のようになっています。<br>
<br>
#&lt;table:pat names key:ShortText value:(nil) size:3 columns:[] default_tokenizer:(nil) normalizer:(nil) keys:[&quot;1&quot;, &quot;2&quot;, &quot;3&quot;] subrec:none nodes:{<br>
2(&quot;1&quot;){0,6,0}[00110001]<br>
  L:2<br>
  R:1(&quot;2&quot;){0,7,0}[00110010]<br>
    L:1<br>
    R:3<br>
}&gt;<br>
<br>
解説すると、<br>
<br>
--<br>
2(&quot;1&quot;){0,6,0}[00110001]<br>
  L:2<br>
  R:1(&quot;2&quot;){0,7,0}[00110010]<br>
    L:1<br>
    R:3<br>
--<br>
<br>
のところがpatの中身です。<br>
「L:」が付いているのはpat_node::lrの[0]の方で<br>
「R:」が付いているのはpat_node::lrの[1]の方です。<br>
一番上の「L:」も「R:」も付いていないやつは最初のノードです。<br>
<br>
「L:」、「R:」の右側にある数字はPAT_AT()したときに使った<br>
grn_idです。<br>
<br>
キーがあると判断したところでは<br>
<br>
  (#{キー}){#{checkの中身}}[#{キーのバイト列}]<br>
<br>
というフォーマットでpat_nodeの中身を表示しています。<br>
<br>
なお、<br>
<br>
  {#{checkの中身}}<br>
<br>
は<br>
<br>
  {#{nth_byte},#{nth_bit},#{terminated}}<br>
<br>
というように16ビットに詰め込んだ情報を分割して表示しています。<br>
<br>
で、これを<br>
<br>
--<br>
2(&quot;1&quot;){0,6,0}[00110001]<br>
  L:2<br>
  R:1(&quot;2&quot;){0,7,0}[00110010]<br>
    L:1<br>
    R:3 ←が「R:3(&quot;3&quot;){...}[...]」となってほしい!!<br>
--<br>
<br>
というようにしたいです。<br>
<br>
grn_p(ctx, pat)の実装(grn_pat_inspect_node())では、<br>
<br>
  <a href="https://github.com/groonga/groonga/blob/master/lib/pat.c#L50-L51" target="_blank">https://github.com/groonga/groonga/blob/master/lib/pat.c#L50-L51</a><br>
<br>
の<br>
<br>
typedef struct {<br>
  grn_id lr[2];<br>
  /*<br>
  ...<br>
  The both available nodes has larger check value rather<br>
  than the current node.<br>
  ...<br>
  */<br>
  ...;<br>
} pat_node;<br>
<br>
というコメントを信じてcheckの値を使って<br>
<br>
  <a href="https://github.com/groonga/groonga/blob/master/lib/pat.c#L2370" target="_blank">https://github.com/groonga/groonga/blob/master/lib/pat.c#L2370</a><br>
<br>
  if (c &gt; check) {<br>
<br>
というように、そのノードのキーを表示するかどうかを判断してい<br>
ます。<br>
<br>
が、この条件だと「&quot;3&quot;」のノードを有効なノードと判断できませ<br>
ん。<br>
<br>
というのは、このケースでは↓というように「&quot;2&quot;」のノードと<br>
「&quot;3&quot;」のノードのcheckが同じ値(14)になっているからです。<br>
<br>
--<br>
2(&quot;1&quot;){0,6,0}[00110001]<br>
  L:2<br>
  R:1(&quot;2&quot;){0,7,0}[00110010]<br>
    L:1<br>
    R:3(&quot;3&quot;){0,7,0}[00110011]<br>
--<br>
<br>
これは妥当なケース(意図した動作)なんでしょうか?(質問1)<br>
<br>
妥当なケースならgrn_pat_inspect_node()でもこのケースに対応し<br>
ようと思っています。<br>
<br>
で、もうひとつのケースは<br>
<br>
  1. grn_pat_add(&quot;2&quot;)<br>
  2. grn_pat_add(&quot;1&quot;)<br>
  3. grn_pat_add(&quot;3&quot;)<br>
<br>
の後に<br>
<br>
  4. grn_pat_del(&quot;2&quot;)<br>
<br>
をした状態のケースです。<br>
<br>
この状態ではpatの中身は次のようになっています。<br>
<br>
--<br>
2(&quot;1&quot;){0,6,0}[00110001]<br>
  L:2<br>
  R:3(&quot;3&quot;){0,0,0}[00110011]<br>
--<br>
<br>
気になるところは「&quot;3&quot;」のノードのcheckが0なことです。<br>
<br>
これは妥当なケース(意図した動作)なんでしょうか?(質問2)<br>
<br>
妥当なケースならgrn_pat_inspect_node()でもこのケースに対応し<br>
ようと思っています。<br>
<br>
ちなみに、<br>
<br>
  1. grn_pat_add(&quot;1&quot;)<br>
  2. grn_pat_add(&quot;3&quot;)<br>
<br>
とすると次のようになり、checkは14になります。<br>
<br>
--<br>
2(&quot;1&quot;){0,6,0}[00110001]<br>
  L:2<br>
  R:1(&quot;3&quot;){0,7,0}[00110011]<br>
    L:0<br>
    R:1(&quot;3&quot;){0,7,0}[00110011]<br>
--<br>
<br>
<br>
<br>
--<br>
須藤 功平 &lt;<a href="mailto:kou****@clear*****">kou****@clear*****</a>&gt;<br>
株式会社クリアコード &lt;<a href="http://www.clear-code.com/" target="_blank">http://www.clear-code.com/</a>&gt;<br>
<br>
Groongaベースの全文検索システムを総合サポート:<br>
  <a href="http://groonga.org/ja/support/" target="_blank">http://groonga.org/ja/support/</a><br>
パッチ採用 - プログラミングが楽しい人向けの採用プロセス:<br>
  <a href="http://www.clear-code.com/recruitment/" target="_blank">http://www.clear-code.com/recruitment/</a><br>
コードリーダー育成支援 - 自然とリーダブルコードを書くチームへ:<br>
  <a href="http://www.clear-code.com/services/code-reader/" target="_blank">http://www.clear-code.com/services/code-reader/</a><br>
<br>
_______________________________________________<br>
groonga-dev mailing list<br>
<a href="mailto:groon****@lists*****">groon****@lists*****</a><br>
<a href="http://lists.sourceforge.jp/mailman/listinfo/groonga-dev" target="_blank">http://lists.sourceforge.jp/mailman/listinfo/groonga-dev</a><br>
</blockquote></div><br></div>