tankaixiong

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

支持sql和cqn查询
示例
SQLpublic 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    }}
注意:
sql 查询时,SQLParser必须注册字段registerAttribute注册的字段只能是引用类型(包装类),不然为报错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    }}

 

分类:

java

技术点:

相关文章:

  • 2021-05-23
  • 2021-07-13
  • 2021-11-12
  • 2021-10-07
  • 2021-05-14
  • 2021-09-07
  • 2021-10-23
  • 2021-11-27
猜你喜欢
  • 2021-07-29
  • 2022-02-28
  • 2018-07-11
  • 2021-11-04
  • 2021-10-24
  • 2021-10-07
  • 2021-07-16
相关资源
相似解决方案