Barry Oglesby created GEODE-2002: ------------------------------------ Summary: The index is not used on a query with a where clause containing a parameterized key on a map Key: GEODE-2002 URL: https://issues.apache.org/jira/browse/GEODE-2002 Project: Geode Issue Type: Bug Components: querying Reporter: Barry Oglesby
This is the same as GEM-1026. If an index is defined like: {noformat} <index name="instrumentTLAltIdIndex" from-clause="/instrument i, i.tradingLines tl" expression="tl.alternateReferences['SEDOL', 'INHOUSE_SEDOL']"/> {noformat} And a query is defined like: {noformat} <trace> select i from from /instrument i, i.tradingLines t where t.alternateReferences[$1]='BFNY8K9' with bind parameter 'SEDOL'. {noformat} Then, the {{instrumentTLAltIdIndex}} index won't be used when the query is executed. The message logged in the server log looks like (with {{indexesUsed(0)}} instead of {{indexesUsed(1)}}): {noformat} [info 2016/10/14 14:51:03.069 PDT <ServerConnection on port 57074 Thread 2> tid=0x3e] Query Executed in 3.645424 ms; rowCount = 14; indexesUsed(0) "<trace> select i from /instrument i, i.tradingLines t where t.alternateReferences[$1]='BFNY8K9'" {noformat} The {{CompiledIndexOperation generateCanonicalizedExpression}} method returns {{index_iter2.alternateReferences\[$1\]}} instead of {{index_iter2.alternateReferences\['INHOUSE_SEDOL'\]}}, and the {{AbstractMapIndex isMatchingWithIndexExpression}} method fails to match the index. The {{$1}} is generated by CompiledBindArgument generateCanonicalizedExpression. Also, note that the trace logging is incorrect on any query using a map index. The static query is defined like: {noformat} <trace> select i from from /instrument i, i.tradingLines t where t.alternateReferences['SEDOL']='BFNY8K9' {noformat} This logs a message in the server log like: {noformat} [info 2016/10/14 14:29:58.145 PDT <ServerConnection on port 56969 Thread 1> tid=0x3c] Query Executed in 54.36587 ms; rowCount = 16; indexesUsed(1):instrumentTLAltIdIndex-SEDOL(Results: 0) "<trace> select i from /instrument i, i.tradingLines t where t.alternateReferences['SEDOL']='BFNY8K9'" {noformat} The {{Results: 0}} part of the message is wrong. It should be {{Results: 16}}. The {{IndexTrackingQueryObserver beforeIndexLookup}} method saves the {{IndexInfo}} at {{key=instrumentTLAltIdIndex-SEDOL}}, but the {{afterIndexLookup}} method attempts to retrieve it using {{key=instrumentTLAltIdIndex}}. The {{IndexInfo}} is not found, so its results are not updated. -- This message was sent by Atlassian JIRA (v6.3.4#6332)