I have a strange issue. I need to run a query with a sub-query to select a 
record. I used the LET statement for the sub-query. When the query executes 
I do get the correct result, but each time OrientDB server throws an error 
in its console. Complaints about casting data type for the index. 

To demonstrate and replicate the problem I have recreated this condition 
with 2 simple tables, so you can quickly reproduce it.

Script to recreate the issue

create class Acc extends V
create property Acc.name STRING

create class Year extends V
create property Year.account LINK Acc (NOTNULL TRUE, MANDATORY TRUE)
create property Year.value INTEGER (NOTNULL TRUE, MANDATORY TRUE)

// Indexes (allow only a single year per account)
create index UniqueAccLeadYear on Year (account, value) UNIQUE

Steps to reproduce the exception:

orientdb {db=Customers}> info class Acc
CLASS 'Acc'

Records..............: 0
Super classes........: [V]
Default cluster......: acc (id=249)
Supported clusters...: acc(249), acc_1(250), acc_2(251), acc_3(252)
Cluster selection....: round-robin
Oversize.............: 0.0

PROPERTIES
+----+----+------+-----------------+---------+--------+--------+----+----+-------+-------+
|#   |NAME|TYPE  |LINKED-TYPE/CLASS|MANDATORY|READONLY|NOT-NULL|MIN |MAX 
|COLLATE|DEFAULT|
+----+----+------+-----------------+---------+--------+--------+----+----+-------+-------+
|0   |name|STRING|                 |false    |false   |false   |    |    |
default|       |
+----+----+------+-----------------+---------+--------+--------+----+----+-------+-------+

orientdb {db=Customers}> info class Year
CLASS 'Year'

Records..............: 0
Super classes........: [V]
Default cluster......: year (id=265)
Supported clusters...: year(265), year_1(266), year_2(267), year_3(268)
Cluster selection....: round-robin
Oversize.............: 0.0

PROPERTIES
+----+-------+-------+-----------------+---------+--------+--------+----+----+-------+-------+
|#   |NAME   |TYPE   |LINKED-TYPE/CLASS|MANDATORY|READONLY|NOT-NULL|MIN 
|MAX |COLLATE|DEFAULT|
+----+-------+-------+-----------------+---------+--------+--------+----+----+-------+-------+
|0   |value  |INTEGER|                 |true     |false   |true    |    |   
 |default|       |
|1   |account|LINK   |Acc              |true     |false   |true    |    |   
 |default|       |
+----+-------+-------+-----------------+---------+--------+--------+----+----+-------+-------+

INDEXES (1 altogether)
+----+-----------------+---------------+
|#   |NAME             |PROPERTIES     |
+----+-----------------+---------------+
|0   |UniqueAccLeadYear|[account,value]|
+----+-----------------+---------------+

orientdb {db=Customers}> insert into Acc set name = 'Account 1'
Inserted record 'Acc#249:0{name:Account 1} v1' in 0.004000 sec(s).

orientdb {db=Customers}> insert into Year set value = 2017, account = #249:0
Inserted record 'Year#265:0{value:2017,account:#249:0} v1' in 0.003000 sec(s
).

orientdb {db=Customers}> select from Acc
+----+------+------+---------+
|#   |@RID  |@CLASS|name     |
+----+------+------+---------+
|0   |#249:0|Acc   |Account 1|
+----+------+------+---------+

orientdb {db=Customers}> select from Year
+----+------+------+-----+-------+
|#   |@RID  |@CLASS|value|account|
+----+------+------+-----+-------+
|0   |#265:0|Year  |2017 |#249:0 |
+----+------+------+-----+-------+

orientdb {db=Customers}> SELECT FROM Year LET $account = (SELECT FROM #249:0) 
WHERE value = 2017 AND account = $account[0].@rid
+----+------+------+-----+-------+
|#   |@RID  |@CLASS|value|account|
+----+------+------+-----+-------+
|0   |#265:0|Year  |2017 |#249:0 |
+----+------+------+-----+-------+

When executing the last query I get this exception in the DB console

$ANSI{green {db=Customers}} Error on using index UniqueAccLeadYear in query 
'SELECT 
FROM Year LET $account = (SELECT FROM #249:0) WHERE value = 2017 AND 
account = $account[0].@rid'. Probably you need to rebuild indexes. Now 
executing query using cluster scan
java.lang.ClassCastException: java.lang.Integer cannot be cast to com.
orientechnologies.orient.core.db.record.OIdentifiable
 at com.orientechnologies.orient.core.serialization.serializer.binary.impl.
OLinkSerializer.preprocess(OLinkSerializer.java:44)
 at com.orientechnologies.orient.core.serialization.serializer.binary.impl.
index.OCompositeKeySerializer.preprocess(OCompositeKeySerializer.java:283)
 at com.orientechnologies.orient.core.serialization.serializer.binary.impl.
index.OCompositeKeySerializer.preprocess(OCompositeKeySerializer.java:46)
 at com.orientechnologies.orient.core.index.sbtree.local.OSBTree.
iterateEntriesBetweenAscOrder(OSBTree.java:1474)
 at com.orientechnologies.orient.core.index.sbtree.local.OSBTree.
iterateEntriesBetween(OSBTree.java:771)
 at com.orientechnologies.orient.core.index.engine.OSBTreeIndexEngine.
iterateEntriesBetween(OSBTreeIndexEngine.java:185)
 at com.orientechnologies.orient.core.storage.impl.local.
OAbstractPaginatedStorage.doIterateIndexEntriesBetween(
OAbstractPaginatedStorage.java:2042)
 at com.orientechnologies.orient.core.storage.impl.local.
OAbstractPaginatedStorage.iterateIndexEntriesBetween(
OAbstractPaginatedStorage.java:2030)
 at com.orientechnologies.orient.core.index.OIndexOneValue.
iterateEntriesBetween(OIndexOneValue.java:205)
 at com.orientechnologies.orient.core.index.OIndexAbstractDelegate.
iterateEntriesBetween(OIndexAbstractDelegate.java:104)
 at com.orientechnologies.orient.core.index.OIndexTxAwareOneValue.
iterateEntriesBetween(OIndexTxAwareOneValue.java:292)
 at com.orientechnologies.orient.core.sql.operator.OQueryOperatorEquals.
executeIndexQuery(OQueryOperatorEquals.java:173)
 at com.orientechnologies.orient.core.sql.OCommandExecutorSQLSelect.
searchForIndexes(OCommandExecutorSQLSelect.java:2184)
 at com.orientechnologies.orient.core.sql.OCommandExecutorSQLSelect.
searchInClasses(OCommandExecutorSQLSelect.java:1001)
 at com.orientechnologies.orient.core.sql.
OCommandExecutorSQLResultsetAbstract.assignTarget(
OCommandExecutorSQLResultsetAbstract.java:209)
 at com.orientechnologies.orient.core.sql.OCommandExecutorSQLSelect.
assignTarget(OCommandExecutorSQLSelect.java:530)
 at com.orientechnologies.orient.core.sql.OCommandExecutorSQLSelect.
executeSearch(OCommandExecutorSQLSelect.java:512)
 at com.orientechnologies.orient.core.sql.OCommandExecutorSQLSelect.execute(
OCommandExecutorSQLSelect.java:488)
 at com.orientechnologies.orient.core.sql.OCommandExecutorSQLDelegate.
execute(OCommandExecutorSQLDelegate.java:74)
 at com.orientechnologies.orient.core.storage.impl.local.
OAbstractPaginatedStorage.executeCommand(OAbstractPaginatedStorage.java:2592
)
 at com.orientechnologies.orient.core.storage.impl.local.
OAbstractPaginatedStorage.command(OAbstractPaginatedStorage.java:2538)
 at com.orientechnologies.orient.core.command.OCommandRequestTextAbstract.
execute(OCommandRequestTextAbstract.java:69)
 at com.orientechnologies.orient.server.network.protocol.http.command.post.
OServerCommandPostCommand.execute(OServerCommandPostCommand.java:106)
 at com.orientechnologies.orient.graph.server.command.
OServerCommandPostCommandGraph.execute(OServerCommandPostCommandGraph.java:
37)
 at com.orientechnologies.orient.server.network.protocol.http.
ONetworkProtocolHttpAbstract.service(ONetworkProtocolHttpAbstract.java:169)
 at com.orientechnologies.orient.server.network.protocol.http.
ONetworkProtocolHttpAbstract.execute(ONetworkProtocolHttpAbstract.java:622)
 at com.orientechnologies.common.thread.OSoftThread.run(OSoftThread.java:77)

I tried different variations of the query with no avail. When query is 
correct it does return the result as expected, but exception always thrown. 
I tried rebuilding the index and recreating tables, but all the same.

If I hardcode the Acc RID then the query produces result and no exception 
is thrown. Like this:

SELECT FROM Year LET $account = (SELECT FROM #249:0) WHERE value = 2017 AND 
account = #249:0

Am I doing something wrong with the LET variable, incorrectly accessing the 
account RID or is it a bug?

Thanks,


-- 

--- 
You received this message because you are subscribed to the Google Groups 
"OrientDB" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to orient-database+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to