CQEngine предоставляет два метода для автоматического создания атрибутов: байт-код или исходный код.
В следующем примере используется 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]}
}
}
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;
}
}
Использование:
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 )