PostgreSQL/開発

概要

bitmapset_image.png

定義

変数,エイリアス

 サンプル 

// ワードの変数名
typedef uint32 bitmapword;		/* must be an unsigned type */
// ワード(符号あり),LSB算出に使われる
typedef int32 signedbitmapword; /* must be the matching signed type */

マクロ

BITS_PER_BITMAPWORD

 サンプル 

#define BITS_PER_BITMAPWORD 32

ワードサイズ

列挙型

BMS_Comparison

定数名説明
BMS_EQUAL等しい
BMS_SUBSET11番目最初のセットが2番目のセットのサブセットである
BMS_SUBSET2番目最初のセットが1番目のセットのサブセットである
BMS_DIFFERENT異なるビットマップセットである

BMS_Membership

BMS_EMPTY_SET空のセット
BMS_SINGLETONシングルトンセットか,メンバーが1つ
BMS_MULTIPLE複数セット,メンバーが複数

 サンプル 

void test_bitmapset()
{
    Bitmapset *bm = bms_make_singleton(1);
    bms_singleton_member(bm); // 1
    // 要素は1つ
    elog(NOTICE, "%d", bms_membership(bm) == BMS_SINGLETON); // NOTICE:  1
    bm = bms_add_member(bm, 2);
    // 複数の要素あり
    elog(NOTICE, "%d", bms_membership(bm) == BMS_MULTIPLE); // NOTICE:  1
    bm  = bms_del_member(bm, 1);
    bm  = bms_del_member(bm, 2);
    // 要素は空
    elog(NOTICE, "%d", bms_membership(bm) == BMS_EMPTY_SET); // NOTICE:  1
    elog(NOTICE, "%d", bms_is_empty(bm)); // NOTICE:  1
}

構造体

Bitmapset

番号データ型フィールド説明
1intnwordswordの数
2bitmapwordwords[]ビットマップ,サイズは自動拡張される

関数

bms_copy

// 引数1:コピー対象のビットマップセットのポインタ
// 戻り値:コピーされたビットマップセットのポインタ
extern Bitmapset *bms_copy(const Bitmapset *a);

bms_equal

// 引数1:比較する対象のビットマップセットのポインタ
// 引数2:比較する対象のビットマップセットのポインタ
// 戻り値:true:等しい,false:等しくない
extern bool bms_equal(const Bitmapset *a, const Bitmapset *b);

bms_make_singleton

// 引数1:ビットマップセットに格納する初期数値
// 戻り値:ビットマップセットのポインタ
extern Bitmapset *bms_make_singleton(int x);

 サンプル 

Bitmapset *bm = bms_make_singleton(1);

bms_free

// 引数1:対象のビットマップセットのポインタ
extern void bms_free(Bitmapset *a);

bms_union

// 引数1:対象のビットマップセットのポインタ
// 引数2:対象のビットマップセットのポインタ
// 戻り値:和集合のビットマップセットのポインタ
//         aがNULLの場合,bのコピー
//         bがNULLの場合は,aのコピー
extern Bitmapset *bms_union(const Bitmapset *a, const Bitmapset *b);

bms_intersect

void test_bitmapset_union()
{
    Bitmapset *bm1 = bms_make_singleton(0);
    bm1 = bms_add_member(bm1, 1);
    bm1 = bms_add_member(bm1, 12);

    Bitmapset *bm2 = bms_make_singleton(1);
    bm2 = bms_add_member(bm2, 3);
    bm2 = bms_add_member(bm2, 5);
    bm2 = bms_add_member(bm2, 32);

    Bitmapset *new_bm = bms_union(bm1, bm2);

    int result = -1;
    while ((result = bms_first_member(bm1)) >= 0) {
        elog(INFO, "bm1 member: %d", result);
    }

    result = -1;
    while ((result = bms_first_member(bm2)) >= 0) {
        elog(INFO, "bm2 member: %d", result);
    }

    result = -1;
    while ((result = bms_first_member(new_bm)) >= 0) {
        elog(INFO, "new_bm member: %d", result);
    }
}

/* Output is the following:
------------------------------
INFO:  bm1 member: 0
INFO:  bm1 member: 1
INFO:  bm1 member: 12
INFO:  bm2 member: 1
INFO:  bm2 member: 3
INFO:  bm2 member: 5
INFO:  bm2 member: 32
INFO:  new_bm member: 0
INFO:  new_bm member: 1
INFO:  new_bm member: 3
INFO:  new_bm member: 5
INFO:  new_bm member: 12
INFO:  new_bm member: 32
*/

bms_difference

// 引数1:対象のビットマップセットのポインタ
// 引数2:対象のビットマップセットのポインタ
// 戻り値:積集合のビットマップセットのポインタ
//         aまたはbがNULLの場合,NULL
extern Bitmapset *bms_intersect(const Bitmapset *a, const Bitmapset *b);

bms_is_subset

// 引数1:差集合のベースとなる対象のビットマップセットのポインタ
// 引数2:差集合を計算する対象のビットマップセットのポインタ
// 戻り値:差集合のビットマップセットのポインタ
//         aがNULLの場合,NULL
//         bがNULLの場合,aのコピー
extern Bitmapset *bms_difference(const Bitmapset *a, const Bitmapset *b);

bms_subset_compare

// 引数1:ベースとなる対象のビットマップセットのポインタ
// 引数2:サブセット計算対象のビットマップセットのポインタ
// 戻り値:true:サブセットである,false:サブセットでない
//         aがNULLの場合,true
//         bがNULLの場合,bms_is_empty(a)
extern bool bms_is_subset(const Bitmapset *a, const Bitmapset *b);

bms_is_member

// 引数1:比較対象のビットマップセットのポインタ
// 引数2:比較対象のビットマップセットのポインタ
// 戻り値:関連を示す列挙定数
extern BMS_Comparison bms_subset_compare(const Bitmapset *a, const Bitmapset *b);

 サンプル 

void test_bitmapset_subset()
{
    Bitmapset *bma = bms_make_singleton(0);
    bma = bms_add_member(bma, 1);
    bma = bms_add_member(bma, 12);

    Bitmapset *bmb = bms_make_singleton(0);
    bmb = bms_add_member(bmb, 1);
    bmb = bms_add_member(bmb, 12);
    bmb = bms_add_member(bmb, 16);
    bmb = bms_add_member(bmb, 32);

    elog(NOTICE, "Is a subset of b ? -> %d", bms_is_subset(bma, bmb)); // a ⊆ b
    elog(NOTICE, "Is b subset of a ? -> %d", bms_is_subset(bmb, bma)); // b ⊆ a

    BMS_Comparison relship = bms_subset_compare(bma, bmb);
    switch (relship) {
    case BMS_EQUAL:
        elog(NOTICE, "a = b");
        break;
    case BMS_SUBSET1:
        elog(NOTICE, "a ⊆ b");
        break;
    case BMS_SUBSET2:
        elog(NOTICE, "b ⊆ a");
        break;
    case BMS_DIFFERENT:
        elog(NOTICE, "a != b");
        break;
    default:
        elog(NOTICE, "not arrive here");
        break;
    } 
}

/* Output is the following:
------------------------------
NOTICE:  Is a subset of b ? -> 1
NOTICE:  Is b subset of a ? -> 0
NOTICE:  a ⊆ b
*/

bms_overlap

// 引数1:チェックしたい整数
// 引数2:対象のビットマップセットのポインタ
// 戻り値:true:メンバーである,false:メンバーでない
//         xが負数の場合は,エラー
//         aがNULLの場合は,false
extern bool bms_is_member(int x, const Bitmapset *a);

bms_nonempty_difference

Bitmapset *bm = bms_make_singleton(1);
elog(NOTICE, "%u", bms_is_member(1, bm)); // NOTICE:  1

bms_singleton_member

// 引数1:対象のビットマップセットのポインタ
// 引数2:対象のビットマップセットのポインタ
// 戻り値:true:オーバーラップあり,false:オーバーラップなし
//         aまたはbがNULLの場合,false
extern bool bms_overlap(const Bitmapset *a, const Bitmapset *b);

 サンプル 

void test_bitmapset_overlap()
{
    Bitmapset *bma = bms_make_singleton(0);
    bma = bms_add_member(bma, 1);
    bma = bms_add_member(bma, 12);

    Bitmapset *bmb = bms_make_singleton(0);
    bmb = bms_add_member(bmb, 1);
    bmb = bms_add_member(bmb, 12);
    bmb = bms_add_member(bmb, 16);
    bmb = bms_add_member(bmb, 32);

    // 1, 12 are overlaps
    elog(NOTICE, "Is there a overlap between bma and bmb ? %d", bms_overlap(bma, bmb));
}

/* Output is the following:
------------------------------
NOTICE:  Is there a overlap between bma and bmb ? 1
*/

bms_get_singleton_member

// 引数1:対象のビットマップセットのポインタ
// 引数2:対象のビットマップセットのポインタ
// 戻り値:true:差分あり,false:差分なし
//         aがNULLの場合は,false
//         bがNULLに場合は,!bms_is_empty(a)の結果
extern bool bms_nonempty_difference(const Bitmapset *a, const Bitmapset *b);

 サンプル 

void test_bitmapset_nonempty_difference()
{
    Bitmapset *bma = bms_make_singleton(0);
    bma = bms_add_member(bma, 1);
    bma = bms_add_member(bma, 12);
    bma = bms_add_member(bma, 16);

    Bitmapset *bmb = bms_make_singleton(0);
    bmb = bms_add_member(bmb, 1);
    bmb = bms_add_member(bmb, 12);
    bmb = bms_add_member(bmb, 16);
    bmb = bms_add_member(bmb, 32);

    // 32 is nonempty_difference
    elog(NOTICE, "Is there a diffrence between bmb and bmb ? %d", bms_nonempty_difference(bmb, bma));
}

/* Output is the following:
------------------------------
NOTICE:  Is there a diffrence between bmb and bmb ? 1
*/

bms_num_members

// 引数1:対象のビットマップセットのポインタ
// 戻り値:シングルトンメンバの値
//         aがNULLの場合,エラー
//         aがemptyの場合,エラー
extern int bms_singleton_member(const Bitmapset *a);

 サンプル 

Bitmapset *bm = bms_make_singleton(31);
elog(NOTICE, "%d", bms_singleton_member(bm)); // NOTICE:  31

bms_membership

// 引数1:対象のビットマップセットのポインタ
// 引数2:シングルトンメンバを書き込むポインタ
// 戻り値:true:取得OK,false:失敗
//         aがemtpyの場合,false 
extern bool bms_get_singleton_member(const Bitmapset *a, int *member);

bms_is_empty

void test_bitmapset()
{
    Bitmapset *bm = bms_make_singleton(31);
    int x = -1;
    if (bms_get_singleton_member(bm, &x)) {
        elog(NOTICE, "x = %d", x); // NOTICE:  31
    }
}

bms_add_member

// 引数1:対象のビットマップセットのポインタ
// 戻り値:要素数
//         aがNULLの場合,0
extern int bms_num_members(const Bitmapset *a);

 参考  bms_add_member() - on doxygen.postgresql.org

 サンプル 

void test_bitmapset()
{
    Bitmapset *bm = bms_make_singleton(0);

    for (int i = 1; i <= 10; i++) {
        bm = bms_add_member(bm, i);
    }
    // nwords is extended from 1 to 2
    bm = bms_add_member(bm, 32);

    // count members of set over words
    elog(NOTICE, "num = %d", bms_num_members(bm)); // NOTICE:  num = 12
}

bms_del_member

// 引数1:対象のビットマップセットのポインタ
// 戻り値:メンバーシップの列挙定数
extern BMS_Membership bms_membership(const Bitmapset *a);

bms_add_members

// 引数1:対象のビットマップセットのポインタ
// 戻り値:true:空,false:空でない
//         aがNULLの場合,true
extern bool bms_is_empty(const Bitmapset *a);

bms_int_members

// 引数1:対象のビットマップセットのポインタ
// 引数2:ビットマップセットに加える要素
// 戻り値:ビットマップセットのポインタ
//         xが負数の場合,エラー
//         aがNULLの場合,bms_make_singleton(x)
extern Bitmapset *bms_add_member(Bitmapset *a, int x);

bms_del_members

Bitmapset *bm = bms_make_singleton(0);
bm = bms_add_member(bm, 32);

bms_join

// 引数1:対象のビットマップセットのポインタ
// 引数2:削除する要素
// 戻り値:ビットマップセットのポインタ
//         xが負数の場合,エラー
//         aがNULLの場合,NULL
extern Bitmapset *bms_del_member(Bitmapset *a, int x);

 参考  bms_join() - on doxygen.postgresql.org

 サンプル 

// 引数1:対象のビットマップセットのポインタ
// 引数2:対象のビットマップセットのポインタ
// 戻り値:和集合演算されたビットマップセットのポインタ
//         aがNULLの場合,bms_copy(a)
//         bがNULLの場合,a
//         nwordsが大きい方に統合される,aは再利用される
extern Bitmapset *bms_add_members(Bitmapset *a, const Bitmapset *b);

bms_first_member

// 引数1:対象のビットマップセットのポインタ
// 引数2:対象のビットマップセットのポインタ
// 戻り値:積集合演算されたビットマップセットのポインタ
//         aがNULLの場合,NULL
//         bがNULLの場合,pfree(a)してNULL,aは再利用される
extern Bitmapset *bms_int_members(Bitmapset *a, const Bitmapset *b);

 参考  bms_first_member() - on doxygen.postgresql.org

 サンプル 

// 引数1:対象のビットマップセット1のポインタ
// 引数2:対象のビットマップセット2のポインタ
// 戻り値:和集合演算されたビットマップセットのポインタ
//         aがNULLの場合,b
//         bがNULLの場合,a
//         aもbも再利用される
extern Bitmapset *bms_join(Bitmapset *a, Bitmapset *b);

bms_next_member

void test_bitmapset_join()
{
    Bitmapset *bm1 = bms_make_singleton(1);
    Bitmapset *bm2 = bms_make_singleton(4);

//    Bitmapset *bm3 = bms_join(bm, bm2);
    // bms_joinでは,引数で指定したビットマップセットを再利用する(変更される)
    Bitmapset *bm3 = bms_join(bms_copy(bm1), bms_copy(bm2));
    int result = -1;

    result = -1;
    elog(INFO, "%s", "***** bm3 *****");
    while ((result = bms_first_member(bm3)) >= 0) {
        elog(INFO, "member: %d", result);
    }

    result = -1;
    elog(INFO, "%s", "***** bm1 *****");
    while ((result = bms_first_member(bm1)) >= 0) {
        elog(INFO, "member: %d", result);
    }

    result = -1;
    elog(INFO, "%s", "***** bm2 *****");
    while ((result = bms_first_member(bm2)) >= 0) {
        elog(INFO, "member: %d", result);
    }
}

/* Output is the following:
------------------------------
INFO:  ***** bm3 *****
INFO:  member: 1
INFO:  member: 4
INFO:  ***** bm1 *****
INFO:  member: 1
INFO:  ***** bm2 *****
INFO:  member: 4
*/

bms_hash_value

// 引数1:対象のビットマップセットのポインタ
// 戻り値:ビットマップセットの最初の要素
//         aがNULLの場合,-1
//         aがemptyの場合,-1
extern int bms_first_member(Bitmapset *a);

サンプルプログラム

ビットマップセットのビットを表示する

 実験 

void test_bitmapset_iterate()
{
    Bitmapset *bm = bms_make_singleton(0);
    bm = bms_add_member(bm, 0);
    bm = bms_add_member(bm, 1);
    bm = bms_add_member(bm, 2);

    int result = -1;
    while ((result = bms_first_member(bm)) >= 0) {
        elog(INFO, "member: %d", result);
    }

    // members is already removed from bitmapset.
    elog(INFO, "% is member of bm ? %d", 1, bms_is_member(1, bm)); // 削除されているのでfalse
}

/* Output is the following:
--------------------------
INFO:  member: 0
INFO:  member: 1
INFO:  member: 2
INFO:   1s member of bm ? 0
*/

参考・関連

 関連

コメント



トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
目次
ダブルクリックで閉じるTOP | 閉じる
GO TO TOP