<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"><<a href="mailto:kou****@clear*****" target="_blank">kou****@clear*****</a>></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("2")<br>
2. grn_pat_add("1")<br>
3. grn_pat_add("3")<br>
<br>
とした状態で"3"のノードの中身を表示しません。実際の表示は次<br>
のようになっています。<br>
<br>
#<table:pat names key:ShortText value:(nil) size:3 columns:[] default_tokenizer:(nil) normalizer:(nil) keys:["1", "2", "3"] subrec:none nodes:{<br>
2("1"){0,6,0}[00110001]<br>
L:2<br>
R:1("2"){0,7,0}[00110010]<br>
L:1<br>
R:3<br>
}><br>
<br>
解説すると、<br>
<br>
--<br>
2("1"){0,6,0}[00110001]<br>
L:2<br>
R:1("2"){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("1"){0,6,0}[00110001]<br>
L:2<br>
R:1("2"){0,7,0}[00110010]<br>
L:1<br>
R:3 ←が「R:3("3"){...}[...]」となってほしい!!<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 > check) {<br>
<br>
というように、そのノードのキーを表示するかどうかを判断してい<br>
ます。<br>
<br>
が、この条件だと「"3"」のノードを有効なノードと判断できませ<br>
ん。<br>
<br>
というのは、このケースでは↓というように「"2"」のノードと<br>
「"3"」のノードのcheckが同じ値(14)になっているからです。<br>
<br>
--<br>
2("1"){0,6,0}[00110001]<br>
L:2<br>
R:1("2"){0,7,0}[00110010]<br>
L:1<br>
R:3("3"){0,7,0}[00110011]<br>
--<br>
<br>
これは妥当なケース(意図した動作)なんでしょうか?(質問1)<br>
<br>
妥当なケースならgrn_pat_inspect_node()でもこのケースに対応し<br>
ようと思っています。<br>
<br>
で、もうひとつのケースは<br>
<br>
1. grn_pat_add("2")<br>
2. grn_pat_add("1")<br>
3. grn_pat_add("3")<br>
<br>
の後に<br>
<br>
4. grn_pat_del("2")<br>
<br>
をした状態のケースです。<br>
<br>
この状態ではpatの中身は次のようになっています。<br>
<br>
--<br>
2("1"){0,6,0}[00110001]<br>
L:2<br>
R:3("3"){0,0,0}[00110011]<br>
--<br>
<br>
気になるところは「"3"」のノードのcheckが0なことです。<br>
<br>
これは妥当なケース(意図した動作)なんでしょうか?(質問2)<br>
<br>
妥当なケースならgrn_pat_inspect_node()でもこのケースに対応し<br>
ようと思っています。<br>
<br>
ちなみに、<br>
<br>
1. grn_pat_add("1")<br>
2. grn_pat_add("3")<br>
<br>
とすると次のようになり、checkは14になります。<br>
<br>
--<br>
2("1"){0,6,0}[00110001]<br>
L:2<br>
R:1("3"){0,7,0}[00110011]<br>
L:0<br>
R:1("3"){0,7,0}[00110011]<br>
--<br>
<br>
<br>
<br>
--<br>
須藤 功平 <<a href="mailto:kou****@clear*****">kou****@clear*****</a>><br>
株式会社クリアコード <<a href="http://www.clear-code.com/" target="_blank">http://www.clear-code.com/</a>><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>