[Senna-dev 975] Re: 範囲がないときのカーソルの挙動

Back to archive index

morita morit****@razil*****
2008年 7月 23日 (水) 07:47:50 JST


森です。

確かに現状、そんな動きになっていますね。
何も選択されないのが望ましいので対応を検討します。

Kouhei Sutou さんは書きました:
> 須藤です。
> 
> カーソルの動きが修正されたのを確認しました。
> ありがとうございます。
> 
> カーソルの動きについてもう一点質問があります。
> それは、min/maxが指定されて、その間にひとつもエントリがない
> 場合の動きです。最後につけたプログラムの出力は以下の通りに
> なります。
> 
>   min: (null); max: (null); direction: ASCENDING; GT: FALSE; LT: FALSE
>   Senna
>   セナ
>   セナ + Ruby
>   セナセナ
>   ナセナセ
> 
>   min: セナ; max: (null); direction: ASCENDING; GT: FALSE; LT: FALSE
>   セナ
>   セナ + Ruby
>   セナセナ
>   ナセナセ
> 
>   min: (null); max: セナセナ; direction: ASCENDING; GT: FALSE; LT: FALSE
>   Senna
>   セナ
>   セナ + Ruby
>   セナセナ
> 
>   min: セナセナ; max: (null); direction: ASCENDING; GT: FALSE; LT: FALSE
>   セナセナ
>   ナセナセ
> 
>   min: セナ; max: セナセナ; direction: ASCENDING; GT: FALSE; LT: FALSE
>   セナ
>   セナ + Ruby
>   セナセナ
> 
>   min: セナセナ; max: セナ; direction: ASCENDING; GT: FALSE; LT: FALSE
>   セナセナ
>   ナセナセ
> 
> ↑の最後の出力がmin/max中にひとつもエントリがない場合です。
> 現在はmaxが無視されるような動作になっていますが、この動作は
> 意図的でしょうか?何も選択されないのかと予想したら違う動作に
> なったので質問してみました。
> 
> ちなみに、ascendingでもdescendingでも同じような動きになります。
> 
> 
>   #include <stdio.h>
>   #include <string.h>
> 
>   #include <pat.h>
> 
>   static void
>   add(sen_ctx *context, sen_pat *pat, const char *key)
>   {
>     sen_table_search_flags flags;
> 
>     flags = SEN_TABLE_ADD;
>     sen_pat_lookup(context, pat, key, strlen(key) + 1, NULL, &flags);
>   }
> 
>   #define BUFFER_SIZE 4096
> 
>   static void
>   dump(sen_ctx *context, sen_pat *pat, const char *min, const char
> *max, int flags)
>   {
>     sen_id id;
>     sen_pat_cursor *cursor;
> 
>     printf("min: %s; max: %s; direction: %s; GT: %s; LT: %s\n",
>            min ? min : "(null)",
>            max ? max : "(null)",
>            flags & SEN_PAT_ASCENDING ? "ASCENDING" : "DESCENDING",
>            flags & SEN_PAT_GT ? "TRUE" : "FALSE",
>            flags & SEN_PAT_LT ? "TRUE" : "FALSE");
> 
>     cursor = sen_pat_cursor_open(context, pat,
>                                  min, min ? strlen(min) + 1 : 0,
>                                  max, max ? strlen(max) + 1 : 0,
>                                  flags);
> 
>     id = sen_pat_cursor_next(context, cursor);
>     while (id != SEN_ID_NIL) {
>       char buffer[BUFFER_SIZE];
>       sen_pat_get_key(context, pat, id, buffer, BUFFER_SIZE - 1);
>       printf("%s\n", buffer);
>       id = sen_pat_cursor_next(context, cursor);
>     }
> 
>     printf("\n");
> 
>     sen_pat_cursor_close(context, cursor);
>   }
> 
>   int
>   main(int argc, char **argv)
>   {
>     sen_ctx *context;
>     sen_pat *pat;
> 
>     sen_init();
> 
>     context = sen_ctx_open(NULL, SEN_CTX_USEQL);
>     pat = sen_pat_create(context, "/tmp/xxx", 128, 64, 0, sen_enc_utf8);
> 
>     add(context, pat, "セナ");
>     add(context, pat, "ナセナセ");
>     add(context, pat, "Senna");
>     add(context, pat, "セナ + Ruby");
>     add(context, pat, "セナセナ");
> 
>     dump(context, pat, NULL, NULL, SEN_PAT_ASCENDING);
>     dump(context, pat, "セナ", NULL, SEN_PAT_ASCENDING);
>     dump(context, pat, NULL, "セナセナ", SEN_PAT_ASCENDING);
>     dump(context, pat, "セナセナ", NULL, SEN_PAT_ASCENDING);
>     dump(context, pat, "セナ", "セナセナ", SEN_PAT_ASCENDING);
>     dump(context, pat, "セナセナ", "セナ", SEN_PAT_ASCENDING);
> 
>     sen_pat_close(context, pat);
>     sen_ctx_close(context);
> 
>     sen_fin();
> 
>     return 0;
>   }
> 
> _______________________________________________
> Senna-dev mailing list
> Senna****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/senna-dev
> バグ報告方法:http://qwik.jp/senna/bug_report.html
> 




Senna-dev メーリングリストの案内
Back to archive index