Запрос фильтрации Apache ignite по дате

В моем классе кеша у меня есть factorDate как объект Joda DateTime

@QuerySqlField(index = true)
private DateTime factorDate;

Мне нужно получить все результаты между двумя свиданиями. Для этого у меня есть следующий код:

    CacheConfiguration<Integer, MyClass> cfg = new CacheConfiguration<>("myCache");
    cfg.setIndexedTypes(Integer.class, MyClass.class);

    IgniteConfiguration ignitionConfig = new IgniteConfiguration();
    ignitionConfig.setCacheConfiguration(cfg);
    Ignite ignite = Ignition.getOrStart(ignitionConfig);

    IgniteCache<Integer, MyClass> cache = ignite.getOrCreateCache(cfg);

    DateTime startDateObj = DateTimeFormat.forPattern("dd-MMM-yyyy").parseDateTime(startDate);
    DateTime endDateObj = DateTimeFormat.forPattern("dd-MMM-yyyy").parseDateTime(endDate);

    Timestamp startTimeStamp = new Timestamp(startDateObj.getMillis());
    Timestamp endTimeStamp = new Timestamp(endDateObj.getMillis());

    StringBuilder builder = new StringBuilder();
    builder.append(" SELECT factorDate, name FROM MyClass ");
    builder.append(" WHERE factorDate >= ? AND factorDate <= ? ");
    builder.append(" AND name = ? ");

    SqlFieldsQuery qry = new SqlFieldsQuery(builder.toString());

    qry.setArgs(startTimeStamp, endTimeStamp, "Jack Jones");
    List<List<?>> res = cache.query(qry).getAll();

Я не получаю результатов, если знаю, что есть результаты. Любые идеи?

Я также пробовал использовать объект DateTime вместо отметки времени в качестве аргумента запроса, но все равно не повезло


person Julian    schedule 07.09.2016    source источник


Ответы (1)


Двоичный формат по умолчанию не поддерживает пользовательские классы Comparable. В качестве обходного пути вы можете попробовать использовать вместо этого OptimizedMarshaller:

<property name="marshaller">
    <bean class="org.apache.ignite.marshaller.optimized.OptimizedMarshaller"/>
</property>

Но обратите внимание, что он десериализует ваши ключи и значения на серверных узлах, поэтому вы должны убедиться, что классы развернуты там.

person Valentin Kulichenko    schedule 07.09.2016
comment
Не могли бы вы подробнее рассказать о второй части? - person Julian; 08.09.2016
comment
По умолчанию Ignite хранит данные в двоичном формате. Это позволяет выполнять SQL-запросы без десериализации (поэтому Comparable также игнорируется). Если используется OptimizedMarshaller, объекты будут десериализованы на стороне сервера, и эти десериализованные объекты будут использоваться для получения значений полей. - person Valentin Kulichenko; 09.09.2016