Предикат настраиваемого атрибута Hazelcast не учитывается при использовании с операцией агрегирования (подсчета) Imap
Я использую пользовательский атрибут в запросе предиката hazelcast для преобразования поля даты в строку для выполнения оператора LIKE в запросе. Для этого я реализовал экстрактор значений и настроил пользовательский атрибут в файле hazelcast.xml.
<attributes>
<attribute extractor="com.myproject.util.DocumentComparator$DateExtractor">docdates</attribute>
</attributes>
public static class DateExtractor extends ValueExtractor<Document, String> {
private DateTimeFormatter outputFormat = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public void extract(PDocument target, String argument, ValueCollector collector) {
collector.addObject(outputFormat.print(target.getCreatedOn().getTime()));
collector.addObject(outputFormat.print(target.getUpdatedOn().getTime()));
}
}
Приведенный ниже предикат sql с использованием настраиваемого атрибута также работает нормально.
docMap.values(new SqlPredicate("docdates like %17:18:31%"))
Но когда я использую тот же предикат с настраиваемым атрибутом для операции агрегирования (подсчета),
Supplier<Long, Document, Object> supplier = Supplier.fromPredicate(new SqlPredicate("docdates like %17:18:31%"));
Aggregation<Long, Object, Long> aggregation = Aggregations.count();
System.out.println(docMap.aggregate(supplier, aggregation));
Я получаю исключение ниже,
Caused by: java.lang.IllegalArgumentException: There is no suitable accessor for 'docdates' on class 'class com.ltchie.mco.entity.EPDocument'
at com.hazelcast.query.impl.getters.ReflectionHelper.createGetter(ReflectionHelper.java:168)
at com.hazelcast.query.impl.getters.Extractors.instantiateGetter(Extractors.java:124)
at com.hazelcast.query.impl.getters.Extractors.getGetter(Extractors.java:101)
at com.hazelcast.query.impl.getters.Extractors.extract(Extractors.java:63)
at com.hazelcast.query.impl.QueryableEntry.extractAttributeValueFromTargetObject(QueryableEntry.java:144)
at com.hazelcast.query.impl.QueryableEntry.extractAttributeValue(QueryableEntry.java:82)
at com.hazelcast.query.impl.QueryableEntry.getAttributeValue(QueryableEntry.java:48)
at com.hazelcast.query.impl.predicates.AbstractPredicate.readAttributeValue(AbstractPredicate.java:130)
at com.hazelcast.query.impl.predicates.AbstractPredicate.apply(AbstractPredicate.java:55)
at com.hazelcast.query.SqlPredicate.apply(SqlPredicate.java:72)
at com.hazelcast.mapreduce.aggregation.impl.PredicateSupplier.apply(PredicateSupplier.java:58)
at com.hazelcast.mapreduce.aggregation.impl.SupplierConsumingMapper.map(SupplierConsumingMapper.java:57)
at com.hazelcast.mapreduce.impl.task.KeyValueSourceMappingPhase.executeMappingPhase(KeyValueSourceMappingPhase.java:49)
at com.hazelcast.mapreduce.impl.task.MapCombineTask.processMapping(MapCombineTask.java:140)
at com.hazelcast.mapreduce.impl.task.MapCombineTask.processPartitionMapping(MapCombineTask.java:309)
at com.hazelcast.mapreduce.impl.task.MapCombineTask.access$700(MapCombineTask.java:70)
at com.hazelcast.mapreduce.impl.task.MapCombineTask$PartitionBasedProcessor.processPartitions(MapCombineTask.java:361)
Кажется, что агрегатная операция hazelcast в IMAP не учитывает объявление пользовательского атрибута. Не могли бы вы помочь мне решить эту проблему? Я использую Hazelcast версии 3.7.8