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;
}