[Senna-dev 971] Re: sen_pat_cursor_open()

Back to archive index

morita morit****@razil*****
2008年 7月 17日 (木) 16:39:54 JST


森です。

ご指摘ありがとうございます。
ここらへんは動作実績が全くなくて僕も心許なく思っていた箇所でした。
調査します。

あと、近々pat.c, hash.cのいくつかの関数のシグネチャが(db.c同様)変更になると思います。
お手数かけますがよろしくお願いします。

Kouhei Sutou さんは書きました:
> 須藤です。
> 
> sen_pat_cursorの動作について教えてください。
> 
> メールの最後に付けたプログラムを動かすと以下のような出力になります。
> 
>   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
> 
>   min: セナセナ; max: (null); direction: ASCENDING; GT: FALSE; LT: FALSE
>   セナ
>   セナ + Ruby
>   セナセナ
>   ナセナセ
> 
>   min: セナ; max: セナセナ; direction: ASCENDING; GT: FALSE; LT: FALSE
>   セナ
>   セナ + Ruby
>   セナセナ
>   ナセナセ
> 
>   min: セナ; max: (null); direction: ASCENDING; GT: TRUE; LT: FALSE
>   セナ
>   セナ + Ruby
>   セナセナ
>   ナセナセ
> 
> 1番目のと2番目の出力は分かるのですが、それ以降の場合の動作がよくわかりません。
> 
> 3番目はこうなるのかと思いました。
> 
>   min: セナセナ; max: (null); direction: ASCENDING; GT: FALSE; LT: FALSE
>   セナセナ
>   ナセナセ
> 
> 4番目はこうなるのかと思いました。
> 
>   min: セナ; max: セナセナ; direction: ASCENDING; GT: FALSE; LT: FALSE
>   セナ
>   セナ + Ruby
>   セナセナ
> 
> 5番目はこうなるのかと思いました。
> 
>   min: セナ; max: (null); direction: ASCENDING; GT: TRUE; LT: FALSE
>   セナ + Ruby
>   セナセナ
>   ナセナセ
> 
> もしかして、使い方をまったく間違えていたりしますか。。。?
> 
> 
> #include <stdio.h>
> #include <string.h>
> 
> #include <pat.h>
> 
> static void
> add(sen_pat *pat, const char *key)
> {
>   sen_table_search_flags flags;
> 
>   flags = SEN_TABLE_ADD;
>   sen_pat_lookup(pat, key, strlen(key) + 1, NULL, &flags);
> }
> 
> #define BUFFER_SIZE 4096
> 
> static void
> dump(sen_pat *pat, sen_ctx *context, 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(pat, context,
>                                min, min ? strlen(min) + 1 : 0,
>                                max, max ? strlen(max) + 1 : 0,
>                                flags);
> 
>   id = sen_pat_cursor_next(cursor);
>   while (id != SEN_ID_NIL) {
>     char buffer[BUFFER_SIZE];
>     sen_pat_get_key(pat, id, buffer, BUFFER_SIZE - 1);
>     printf("%s\n", buffer);
>     id = sen_pat_cursor_next(cursor);
>   }
> 
>   printf("\n");
> 
>   sen_pat_cursor_close(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(pat, "セナ");
>   add(pat, "ナセナセ");
>   add(pat, "Senna");
>   add(pat, "セナ + Ruby");
>   add(pat, "セナセナ");
> 
>   dump(pat, context, NULL, NULL, SEN_PAT_ASCENDING);
>   dump(pat, context, "セナ", NULL, SEN_PAT_ASCENDING);
>   dump(pat, context, NULL, "セナセナ", SEN_PAT_ASCENDING);
>   dump(pat, context, "セナセナ", NULL, SEN_PAT_ASCENDING);
>   dump(pat, context, "セナ", "セナセナ", SEN_PAT_ASCENDING);
>   dump(pat, context, "セナ", NULL, SEN_PAT_ASCENDING | SEN_PAT_GT);
> 
>   sen_pat_close(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