perché hazelcast non può interrogare risultati errati con imap e hazelcastjsonvalue

Aug 25 2020

Uso i dati dell'archivio IMap in hazelcast, la chiave è una stringa, il valore è un valore hazelcastjson. esempio di codice: `

    Gson gson = new Gson();
    String json = "{\"orderId\":\"-20200822-221116-188-quote-100002\",\"securityId\":\"130015\",\"tradingAccount\":\"xtrinterbanktra01\",\"subSystemId\":\"QDM-ESP\",\"userId\":\"xtrinterbankat01\",\"securityExchange\":\"B\",\"systemNodeId\":710,\"quoteId\":\"1598145974197\",\"execId\":\"22550774606679263\",\"investAccount\":\"xtrinterbankinvest01\",\"productAccount\":\"xtrinterbankprod01\",\"assetAccount\":\"xtrinterbankasst01\",\"securityAccount\":\"111010032010000205011\",\"securityType\":\"4\",\"settlType\":\"1\",\"orderModel\":\"legs\",\"orderStatus\":\"8\",\"createdTime\":1598145974,\"createdDate\":\"20200824\",\"tradeDate\":\"20200824\",\"positionFlag\":1,\"price\":111.0,\"orderQty\":1.0E7,\"accumulatedExecQty\":1.0E7,\"lastQty\":1.0E7,\"finalFlag\":true,\"symbol\":\"13国债15\",\"side\":\"1\",\"orderVersion\":2,\"classType\":\"OrderBO\",\"messageId\":87350933198472267,\"uniqueKey\":\"-20200822-221116-188-quote-100002\",\"topicName\":\"order\",\"subject\":\"business/order/130015/B/xtrinterbanktra01/xtrinterbankat01\",\"publisherId\":\"oms-710-9577@168-61-73-136\",\"tenantId\":\"ficc\",\"extFields\":{\"quotaionType\":\"5\",\"clOrdId\":\"-20200822-221116-188-quote-100001\",\"marketIndicator\":\"4\",\"deliveryType\":\"0\",\"transcatTime\":\"1883635200\",\"quoteStaus\":\"16\",\"clearingMethod\":\"13\",\"execType\":\"F\",\"validUnitTime\":\"1883635200\"}}";

    String tableName = "__UT_TestMap";

    IMap map = instance.getMap(tableName);
    map.addIndex(new IndexConfig(IndexType.HASH,"orderId"));

    map.put("-20200822-221116-188-quote-100002",json);

    System.out.println(map.entrySet(Predicates.sql("side='1'")));

`la condizione è corretta, ma il risultato è nullo, perché? quando non aggiungo index , il risultato della query è corretto.

Risposte

NeilStevenson Aug 26 2020 at 16:00

Nel tuo map.put, prova a cambiare la clausola del valore da jsonanew HazelcastJsonValue(json))

La variabile che hai nominato jsonè in realtà una String, quindi è una mappa di form Map<String, String>.

Hazelcast non cercherà un campo all'interno di una stringa, perché non saprà che contiene alcuna forma di dati strutturati. Riceverai un IllegalOperationExceptionper il codice pubblicato.

Se usi new HazelcastJsonValue(json))per il valore della voce, questo lo rende strutturato e puoi cercare (e indicizzare) sui campi.