[Senna-dev 970] sen_pat_cursor_open()

Back to archive index

Kouhei Sutou kou****@cozmi*****
2008年 7月 17日 (木) 15:59:03 JST


須藤です。

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 メーリングリストの案内
Back to archive index