Разница в результатах SQL-запросов Apache Ignite - PullRequest
0 голосов
/ 06 мая 2019

У меня проблема с Apache Ignite SQL.В настоящее время я использую Ignite v2.6, но также видел ту же проблему с предыдущей версией.

Существует кэш, определенный следующим образом:

    <bean class="org.apache.ignite.configuration.CacheConfiguration">
        <property name="name" value="Tasks"/>
        <property name="cacheMode" value="PARTITIONED" />
        <property name="backups" value="1" />
        <property name="storeKeepBinary" value="true" />
        <property name="atomicityMode" value="TRANSACTIONAL"/> 
        <property name="writeSynchronizationMode" value="FULL_SYNC"/>
        <property name="nodeFilter" ref="TaskNodeFilter" />

        <property name="queryEntities">
            <list>
                <bean class="org.apache.ignite.cache.QueryEntity">
                    <property name="keyType" value="java.util.UUID"/>
                    <property name="valueType" value="Tasks" />
                    <property name="fields">
                        <map>
                            <entry key="id" value="java.util.UUID"/>
                            <entry key="created" value="java.lang.Long"/>
                            <entry key="jobId" value="java.util.UUID"/>
                            <entry key="exception" value="java.lang.Object"/>
                            <entry key="lastAction" value="java.lang.Long"/>
                            <entry key="jobId" value="java.util.UUID"/>
                            <entry key="masterId" value="java.util.UUID"/>
                            <entry key="identifier" value="java.lang.String"/>
                            <entry key="status" value="java.lang.Integer"/>
                            <entry key="nodeId" value="java.util.UUID"/>
                            <entry key="status" value="java.lang.Integer"/>
                            <entry key="progressMax" value="java.lang.Long"/>
                            <entry key="progressAt" value="java.lang.Long"/>
                            <entry key="actionType" value="java.lang.String"/>
                        </map>
                    </property>

                    <property name="indexes">
                        <list>
                            <bean class="org.apache.ignite.cache.QueryIndex">
                                <constructor-arg value="jobId"/>
                            </bean>
                            <bean class="org.apache.ignite.cache.QueryIndex">
                                <constructor-arg value="status"/>
                            </bean>
                            <bean class="org.apache.ignite.cache.QueryIndex">
                                <constructor-arg value="actionType"/>
                            </bean>
                            <bean class="org.apache.ignite.cache.QueryIndex">
                                <constructor-arg value="created"/>
                            </bean>
                            <bean class="org.apache.ignite.cache.QueryIndex">
                                <constructor-arg value="masterId"/>
                            </bean>
                        </list>
                    </property>
                </bean>
            </list>
        </property>
    </bean>

Запись "созданная" являетсяотметка времени из System.currentTimeMillis (), поэтому в Java это длинное значение.Поэтому я установил это поле в конфигурации кэша на «Java.lang.Long».

Теперь, когда я ищу с помощью SQL, я получаю разные результаты в зависимости от моего запроса, но всегда с тем же диапазоном:

select COUNT(id) as ANZAHL
FROM "Tasks".Tasks
where created BETWEEN 1543705200000 AND 1545433200000;

возвращает 0 (неправильно!)

select COUNT(id) as ANZAHL
FROM "Tasks".Tasks
where CAST(created AS BIGINT) BETWEEN 1543705200000 AND 1545433200000;

возвращает 1142 (это ожидаемое значение)

select COUNT(*) as ANZAHL
FROM "Tasks".Tasks
where CAST(created AS BIGINT) BETWEEN 1543705200000 AND 1545433200000;

возвращает 0 (неправильно!)

Я что-то не так делаю?Зачем мне приводить значение к BIGINT, если его длинного значения должно быть достаточно?Кроме того, почему существует разница между COUNT (id) и COUNT (*)?

Спасибо!

1 Ответ

0 голосов
/ 06 мая 2019

Я также наблюдал проблему подсчета, но это не имеет ничего общего с приведением, и он работает, исправляя запрос, как показано ниже

select COUNT(id) as ANZAHL
FROM "Tasks".Tasks
where created <= 1543705200000 AND created >= 1545433200000;    

Вам не нужно приводить длинное значение к BIGINT, и оно может запустить выше запроса без преобразования.Почему МЕЖДУ тогда не работает?
Я пытался получить план запроса для аналогичного запроса (упомянутого вами) и могу видеть следующие вещи в этом -
ГДЕ (__Z0.CREATED> = 1543705200000) И (__Z0.CREATED<= 1545433200000) <br>Я не думаю, что это то, что вы хотите, это полностью изменяет ожидаемое состояние.

...