Table Store可以在服務端對讀取的結果再進行一次過濾,以便減少網路上傳輸的資料量。
過濾器是一個樹形結構,內節點為邏輯運算(CompositeColumnCondition),分葉節點為比較判斷(SingleColumnCondition)。
-
CompositeColumnCondition支援與、或、非。其中與和或可以掛載兩個或更多子節點,非只能掛載一個子節點。
-
SingleColumnCondition支援全部6種比較條件(等於、不等於、大於、小於、大於等於、小於等於)。
-
每個SingleColumnCondition對象支援一列(可以是主鍵列)和一個常量比較。不支援兩列相比較,也不支援兩個常量相比較。
-
SingleColumnCondition的latestVersionOnly參數控制多個版本的列值如何參與比較,預設為true。
-
若為true,則只有版本範圍內的最新版本列值參與比較(僅僅是參與比較,如果是過濾器認可該行,其他版本的列值依舊會返回)。
-
若為false,則任意一個列值滿足條件,該節點即認為true。
-
-
SingleColumnCondition的passIfMissing參數控制列值缺失時該節點應當視作何值,預設false。
過濾器作用於其他條件式篩選的結果上。所以,如果過濾器中有某一列,而指定列讀取中未指定該列,或版本範圍內該列沒有列值,則過濾器都認為該列缺失。
樣本
以下樣本從全表中過濾出主鍵列pkey大於1並且屬性列attr等於A的行。
RangeQueryCriterion query;
query.mutableTable() = kTableName;
query.mutableMaxVersions().reset(1);
{
PrimaryKey& start = query.mutableInclusiveStart();
start.append() = PrimaryKeyColumn(
"pkey",
PrimaryKeyValue::toInfMin());
}
{
PrimaryKey& end = query.mutableExclusiveEnd();
end.append() = PrimaryKeyColumn(
"pkey",
PrimaryKeyValue::toInfMax());
}
{
// set filter
shared_ptr<ColumnCondition> pkeyCond(
new SingleColumnCondition(
"pkey",
SingleColumnCondition::kLarger,
AttributeValue::toInteger(1)));
shared_ptr<ColumnCondition> attrCond(
new SingleColumnCondition(
"attr",
SingleColumnCondition::kEqual,
AttributeValue::toStr("A")));
shared_ptr<CompositeColumnCondition> top(new CompositeColumnCondition());
top->mutableOp() = CompositeColumnCondition::kAnd;
top->mutableChildren().append() = pkeyCond;
top->mutableChildren().append() = attrCond;
query.mutableFilter() = top;
}