[Senna-dev 982] sen_pat_suffix_search() without SIS

Back to archive index

Kouhei Sutou kou****@cozmi*****
2008年 7月 29日 (火) 09:18:27 JST


須藤です。

SEN_PAT_WITH_SISを指定していないsen_patに対する
sen_pat_suffix_search()では検索キーに対して後方部分一
致(?)したキーがヒットしないのですが、これはそうい
うものなのでしょうか?suffix_searchとなっていたので、
SEN_PAT_WITH_SISを指定していなくても頑張るのかと
思ってしまいました。

↓のプログラムの実行例です。

  key: ナ: 9

  key: セ: 9

  key: セナ: 0
  セナ

  key: ナセナ: 9

実験プログラム
  #include <stdio.h>
  #include <string.h>

  #include <pat.h>
  #include <hash.h>

  static sen_id
  add(sen_ctx *context, sen_pat *pat, const char *key)
  {
    sen_table_search_flags flags;

    flags = SEN_TABLE_ADD;
    return sen_pat_lookup(context, pat, key, strlen(key), NULL, &flags);
  }

  #define BUFFER_SIZE 4096

  static void
  dump(sen_ctx *context, sen_pat *pat, const char *key)
  {
    sen_id id;
    sen_hash *hash;
    sen_hash_cursor *cursor;
    sen_rc rc;

    hash = sen_hash_create(context, NULL, sizeof(sen_id),
                           0, SEN_HASH_TINY, sen_enc_utf8);
    rc = sen_pat_suffix_search(context, pat, key, strlen(key), hash);

    printf("key: %s: %d\n", key, rc);

    cursor = sen_hash_cursor_open(context, hash,
                                  NULL, 0, NULL, 0,
                                  SEN_CURSOR_DESCENDING);
    id = sen_hash_cursor_next(context, cursor);
    while (id != SEN_ID_NIL) {
      sen_id *pat_id;
      void *hash_key;
      char key[BUFFER_SIZE];
      int size;

      sen_hash_cursor_get_key(context, cursor, &hash_key);
      pat_id = hash_key;
      size = sen_pat_get_key(context, pat, *pat_id, key, sizeof(key));
      key[size] = '\0';
      printf("%s\n", key);
      id = sen_hash_cursor_next(context, cursor);
    }

    printf("\n");

    sen_hash_cursor_close(context, cursor);
    sen_hash_close(context, hash);
  }

  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_PAT_WITH_SIS, */
                         sen_enc_utf8);

    add(context, pat, "セナ");
    add(context, pat, "ナセナセ");
    add(context, pat, "Senna");
    add(context, pat, "セナ + Ruby");
    add(context, pat, "セナセナ");

    dump(context, pat, "ナ");
    dump(context, pat, "セ");
    dump(context, pat, "セナ");
    dump(context, pat, "ナセナ");

    sen_pat_close(context, pat);
    sen_ctx_close(context);

    sen_fin();

    return 0;
  }




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