1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mirrors-cqengine

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
AutoGenerateAttributes.md 14 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 28.11.2024 02:48 973f548

CQEngine предоставляет два метода для автоматического создания атрибутов: байт-код или исходный код.

AttributeBytecodeGenerator

В следующем примере используется AttributeBytecodeGenerator для автоматического создания байт-кода атрибута, а затем использует созданный атрибут в запросе во время выполнения.

package com.googlecode.cqengine.examples.codegen;

import com.googlecode.cqengine.ConcurrentIndexedCollection;
import com.googlecode.cqengine.IndexedCollection;
import com.googlecode.cqengine.attribute.SimpleAttribute;
import com.googlecode.cqengine.codegen.AttributeBytecodeGenerator;
import com.googlecode.cqengine.resultset.ResultSet;
import com.googlecode.cqengine.testutil.Car;
import com.googlecode.cqengine.testutil.CarFactory;
import static com.googlecode.cqengine.query.QueryFactory.equal;

/**
 * Демонстрирует, как автоматически генерировать байт-код для атрибутов CQEngine, которые обращаются к полям в данном классе, и которые затем можно использовать непосредственно во время выполнения.
 *
 * @author Niall Gallagher
 */
public class GenerateAttributeByteCode {

    public static void main(String[] args) throws Exception {
        // Генерируем атрибут из байт-кода для чтения поля Car.model...
        Class<? extends SimpleAttribute<Car, String>> carModelAttributeClass = AttributeBytecodeGenerator.generateSimpleAttributeForField(Car.class, String.class, "model", "model");
        SimpleAttribute<Car, String> MODEL = carModelAttributeClass.newInstance();

        // Создаём коллекцию из 10 объектов Car (Ford Focus, Honda Civic и т. д.)...
        IndexedCollection<Car> cars = new ConcurrentIndexedCollection<Car>();
        cars.addAll(CarFactory.createCollectionOfCars(10));

        // Получаем автомобили, поле Car.model которых равно «Civic» (т. е. Honda Civic)...
        ResultSet<Car> results = cars.retrieve(equal(MODEL, "Civic"));
        for (Car car : results) {
            System.out.println(car);
        }
        // ...выводит:
        // Car{carId=3, manufacturer='Honda', model='Civic', color=WHITE, doors=5, price=4000.0, features=[grade b]}
    }
}

AttributeSourceGenerator

CQEngine также предоставляет AttributeSourceGenerator, который, учитывая любой целевой класс, может автоматически создавать исходный код для атрибутов CQEngine, обращающихся к полям целевого класса.

Исходный код для атрибутов может быть сгенерирован либо для копирования и вставки в целевой класс, либо атрибуты могут быть созданы в отдельном сопутствующем классе.

Приведённые ниже примеры генерируют атрибуты для класса Car. Обратите внимание, что некоторые поля являются примитивами, а другие — объектами, массивами или списками. Тип поля определяет тип атрибута, который будет сгенерирован AttributesGenerator. Также обратите внимание на то, что AttributesGenerator будет генерировать комментарии в исходном коде для каждого атрибута, предоставляя рекомендации по настройке производительности для каждого поля в зависимости от его возможности принимать значение null.

public class Car {
    final int carId;
    final String manufacturer;
    final String model;
    final double[] prices;
    final String[] extras;
    final List<String> features;

    public Car(int carId, String manufacturer, String model, double[] prices, String[] extras, List<String> features) {
        this.carId = carId;
        this.manufacturer = manufacturer;
        this.model = model;
        this.prices = prices;
        this.extras = extras;
        this.features = features;
    }
}

Вариант 1: Генерировать только атрибуты, для копирования и вставки

Использование:

package com.googlecode.cqengine.examples.codegen;
import com.googlecode.cqengine.codegen.AttributeSourceGenerator;

public class GenerateAttributesForCopyPaste {
    public static void main(String[] args) {
... ```
    /**
     * CQEngine атрибут для доступа к полю {@code Car.carId}.
     */
    public static final Attribute<Car, Integer> CAR_ID = new SimpleAttribute<Car, Integer>("CAR_ID") {
        public Integer getValue(Car car, QueryOptions queryOptions) { return car.carId; }
    };

    /**
     * CQEngine атрибут для доступа к полю {@code Car.manufacturer}.
     */
    // Примечание: Для лучшей производительности:
    // - если это поле не может быть нулевым, замените этот SimpleNullableAttribute на SimpleAttribute
    public static final Attribute<Car, String> MANUFACTURER = new SimpleNullableAttribute<Car, String>("MANUFACTURER") {
        public String getValue(Car car, QueryOptions queryOptions) { return car.manufacturer; }
    };

    /**
     * CQEngine атрибут для доступа к полю {@code Car.model}.
     */
    // Примечание: Для лучшей производительности:
    // - если это поле не может быть нулевым, замените этот SimpleNullableAttribute на SimpleAttribute
    public static final Attribute<Car, String> MODEL = new SimpleNullableAttribute<Car, String>("MODEL") {
        public String getValue(Car car, QueryOptions queryOptions) { return car.model; }
    };

    /**
     * CQEngine атрибут для доступа к полю {@code Car.prices}.
     */
    // Примечание: Для лучшей производительности:
    // - если это поле не может быть нулевым, замените этот
    //   MultiValueNullableAttribute на MultiValueAttribute (и измените getNullableValues() на getValues())
    public static final Attribute<Car, Double> PRICES = new MultiValueNullableAttribute<Car, Double>("PRICES", false) {
        public Iterable<Double> getNullableValues(final Car car, QueryOptions queryOptions) {
            return new AbstractList<Double>() {
                public Double get(int i) { return car.prices[i]; }
                public int size() { return car.prices.length; }
            };
        }
    };

    /**
     * CQEngine атрибут для доступа к полю {@code Car.extras}.
     */
    // Примечание: Для лучшей производительности:
    // - если массив не может содержать нулевые элементы, измените true на false в следующем конструкторе, или
    // - если массив не может содержать нулевых элементов И само поле не может быть нулевым, замените этот
    //   MultiValueNullableAttribute на MultiValueAttribute (и измените getNullableValues() на getValues())
    public static final Attribute<Car, String> EXTRAS = new MultiValueNullableAttribute<Car, String>("EXTRAS", true) {
        public Iterable<String> getNullableValues(Car car, QueryOptions queryOptions) { return Arrays.asList(car.extras); }
    };

    /**
     * CQEngine атрибут для доступа к полю {@code Car.features}.
     */
    // Примечание: Для лучшей производительности:
    // - если список не может содержать нулевые элементы, измените true на false в следующем конструкторе, или
    // - если список не может содержать нулевых элементов И само поле не может быть нулевым, замените этот
    //   MultiValueNullableAttribute на MultiValueAttribute (и измените getNullableValues() на getValues())
    public static final Attribute<Car, String> FEATURES = new MultiValueNullableAttribute<Car, String>("FEATURES", true) {
        public Iterable<String> getNullableValues(Car car, QueryOptions queryOptions) { return car.features; }
    };``` **import com.googlecode.cqengine.examples.codegen.Car;**

/**  
* Атрибуты CQEngine для доступа к полям класса com.googlecode.cqengine.examples.codegen.Car.  
*  
* Автоматически сгенерировано AttributeSourceGenerator CQEngine.  
*/  
public class CQCar {  

    /**  
    * Атрибут CQEngine для доступа к полю Car.carId.  
    */  
    public static final Attribute<Car, Integer> CAR_ID = new SimpleAttribute<Car, Integer>("CAR_ID") {  
        public Integer getValue(Car car, QueryOptions queryOptions) { return car.carId; }  
    };  

    /**  
     * Атрибут CQEngine для доступа к полю Car.manufacturer.  
     */  
    // Примечание: Для лучшей производительности:  
    // - если это поле не может быть нулевым, замените этот SimpleNullableAttribute на SimpleAttribute  
    public static final Attribute<Car, String> MANUFACTURER = new SimpleNullableAttribute<Car, String>("MANUFACTURER") {  
        public String getValue(Car car, QueryOptions queryOptions) { return car.manufacturer; }  
    };  

    /**  
    * Атрибут CQEngine для доступа к полю Car.model.  
    */  
    // Примечание: Для лучшей производительности:  
    // - если это поле не может быть нулевым, замените этот SimpleNullableAttribute на SimpleAttribute  
    public static final Attribute<Car, String> MODEL = new SimpleNullableAttribute<Car, String>("MODEL") {  
        public String getValue(Car car, QueryOptions queryOptions) { return car.model; }  
    };  

    /**  
    * Атрибут CQEngine для доступа к полю Car.prices.  
    */  
    // Примечание: Для лучшей производительности:  
    // - если это поле не может быть нулевым, замените этот MultiValueNullableAttribute на MultiValueAttribute (и измените getNullableValues() на getValues())  
    public static final Attribute<Car, Double> PRICES = new MultiValueNullableAttribute<Car, Double>("PRICES", false) {  
        public Iterable<Double> getNullableValues(final Car car, QueryOptions queryOptions) {  
            return new AbstractList<Double>() {  
                public Double get(int i) { return car.prices[i]; }  
                public int size() { return car.prices.length; }  
            };  
        }  
    };  

    /**  
    * Атрибут CQEngine для доступа к полю Car.extras.  
    */  
    // Примечание: Для лучшей производительности:  
    // - если массив не может содержать нулевые элементы, измените true на false в следующем конструкторе, или  
    // - если массив не может содержать нулевых элементов И само поле не может быть нулевым, замените этот MultiValueNullableAttribute на MultiValueAttribute (и измените getNullableValues() на getValues())  
    public static final Attribute<Car, String> EXTRAS = new MultiValueNullableAttribute<Car, String>("EXTRAS", true) {  
        public Iterable<String> getNullableValues(Car car, QueryOptions queryOptions) { return Arrays.asList(car.extras); }  
    };  

    /**  
    * Атрибут CQEngine для доступа к полю Car.features.  
    */  
    // Примечание: Для лучшей производительности:  
    // - если список не может содержать нулевые элементы, измените true на false в следующем конструкторе, или  
    // - если список не может содержать нулевых элементов И само поле не может быть нулевым, замените этот MultiValueNullableAttribute на MultiValueAttribute (и измените getNullableValues() на getValues())  
    public static final Attribute<Car, String> FEATURES = new MultiValueNullableAttribute<Car, String>("FEATURES", true) {  
        public Iterable<String> getNullableValues(Car car, QueryOptions queryOptions) { return car.features; }  
    };  
}

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/mirrors-cqengine.git
git@api.gitlife.ru:oschina-mirror/mirrors-cqengine.git
oschina-mirror
mirrors-cqengine
mirrors-cqengine
master