CQengine高效能記憶體資料快取查詢框架

itank發表於2020-05-20

CQengine可實現高效能記憶體資料快取查詢

 

CQEngine 需要設定欄位對應的屬性以方便訪問與查詢

主要有屬性連結

  • SimpleAttribute(不能為空)

  • SimpleNullableAttribute(可以為空)

  • MultiValueAttribute(集合型別欄位,不為空)

  • MultiValueNullableAttribute(集合型別的欄位,可以為空)

另外SimpleAttribute下有幾個重要的子類

OrderControlAttribute : 排序相關

ReflectiveAttribute : 動態反射建立Attribute ,效能沒有直接在類中定義好

SelfAttribute:集合裡中查詢元素, 如["a","b","c"] 中查詢b

自動生成實體類的 Attribute

cqengine 查詢物件,根據欄位查詢,生成索引都需要用到SimpleAttribute,為每個實體的欄位建 SimpleAttribute比較費力,所以cqengine 預設提供了自動生成屬性程式碼
String code = AttributeSourceGenerator.generateAttributesForPastingIntoTargetClass(clazz);//傳入實體類的CLASS,生成實體類下的所有屬性對應的SimpleAttribute
如下:
public static final SimpleAttribute<Car, String> MODEL = new SimpleAttribute<Car, String>("model") {
public String getValue(Car car, QueryOptions queryOptions) { return car.model; }
};

AttributeSourceGenerator 生成原始碼
AttributeBytecodeGenerator 執行時通過反射讀取欄位並反映建立Attribute物件新增到CLASS中

 

 

支援sql和cqn查詢

示例連結

SQL

public static void main(String[] args) {
    SQLParser<Car> parser = SQLParser.forPojoWithAttributes(Car.class, createAttributes(Car.class));
    IndexedCollection<Car> cars = new ConcurrentIndexedCollection<Car>();
    cars.addAll(CarFactory.createCollectionOfCars(10));
 
    ResultSet<Car> results = parser.retrieve(cars, "SELECT * FROM cars WHERE (" +
                                    "(manufacturer = 'Ford' OR manufacturer = 'Honda') " +
                                    "AND price <= 5000.0 " +
                                    "AND color NOT IN ('GREEN', 'WHITE')) " +
                                    "ORDER BY manufacturer DESC, price ASC");
    for (Car car : results) {
        System.out.println(car); // Prints: Honda Accord, Ford Fusion, Ford Focus
    }
}

注意:

  1. sql 查詢時,SQLParser必須註冊欄位registerAttribute
  2. 註冊的欄位只能是引用型別(包裝類),不然為報錯

CQN


public static void main(String[] args) {
    CQNParser<Car> parser = CQNParser.forPojoWithAttributes(Car.class, createAttributes(Car.class));
    IndexedCollection<Car> cars = new ConcurrentIndexedCollection<Car>();
    cars.addAll(CarFactory.createCollectionOfCars(10));
 
    ResultSet<Car> results = parser.retrieve(cars,
                                    "and(" +
                                        "or(equal(\"manufacturer\", \"Ford\"), equal(\"manufacturer\", \"Honda\")), " +
                                        "lessThanOrEqualTo(\"price\", 5000.0), " +
                                        "not(in(\"color\", GREEN, WHITE))" +
                                    ")");
    for (Car car : results) {
        System.out.println(car); // Prints: Ford Focus, Ford Fusion, Honda Accord
    }
}

支援索引

支援的索引型別有:
HashIndex,NavigableIndex,RadixTreeIndex,ReversedRadixTreeIndex,InvertedRadixTreeIndex,SuffixTreeIndex

HashIndex:
索引依賴ConcurrentHashMap ,適用於Equal 來比較。一般適用於欄位為字串,列舉。

NavigableIndex:
依賴ConcurrentSkipListMap,適用於Equal,LessThan,GreaterThan,Between;一般適用於欄位為數字型別。

RadixTreeIndex:
依賴ConcurrentRadixTree,適用於Equal,StringStartsWith ;一般適用於欄位為字串需要StartsWith模糊匹配。

ReversedRadixTreeIndex:
依賴ConcurrentReversedRadixTree,適用於Equal,StringEndsWith;一般適用於欄位為符串需要EndsWith模糊匹配。

InvertedRadixTreeIndex:
依賴ConcurrentInvertedRadixTree,適用於Equal,StringIsContainedIn;一般適用於欄位為字串是否包含XX字元char

SuffixTreeIndex:
依賴ConcurrentSuffixTree,適用於Equal,StringEndsWith,StringContains ; 一般適用於欄位為需要 in(a,b,c....),容器是否包含字串string。

 

相關文章