Hi

You should explain your task in detail.
What for are you get all entries as map in one node? You can get increase
performance if you will get only local entries (or particular partition
entries on thread) on node.
What will you do with huge map? You can to get only specific part of
entries (using SQL by indexed fields).

I think, you should review algorithm, in order to it could support
distributed paradigm.

On Mon, Dec 5, 2016 at 4:20 PM, begineer <redni...@gmail.com> wrote:

> Hi, I have below sample bean which I am storing as value in cache. I want
> to
> build a map such that it gives me count of trade status for each trade
> type(Pls see sample output, done thru java 8 streams).
> Problem with this approach is I have to pull millions of entries from cache
> to some collection and manipulate them.
>
> Is there a way to query cache using SQL/ScanQueries to build same map in
> more efficient way. Below is my sample code to explain the problem.
>
> public class TradeCacheExample {
>         public static void main(String[] args) {
>                 Trade trade1 = new Trade(1, TradeStatus.NEW, "type1");
>                 Trade trade2 = new Trade(2, TradeStatus.FAILED, "type2");
>                 Trade trade3 = new Trade(3, TradeStatus.NEW, "type1");
>                 Trade trade4 = new Trade(4, TradeStatus.NEW, "type3");
>                 Trade trade5 = new Trade(5, TradeStatus.CHANGED, "type2");
>                 Trade trade6 = new Trade(6, TradeStatus.EXPIRED, "type1");
>
>                 Ignite ignite = Ignition.start("examples/
> config/example-ignite.xml");
>                 CacheConfiguration<Integer, Trade> config = new
> CacheConfiguration<>("mycache");
>                 config.setIndexedTypes(Integer.class, Trade.class);
>                 IgniteCache<Integer, Trade> cache =
> ignite.getOrCreateCache(config);
>                 cache.put(trade1.getId(), trade1);
>                 cache.put(trade2.getId(), trade2);
>                 cache.put(trade3.getId(), trade3);
>                 cache.put(trade4.getId(), trade4);
>                 cache.put(trade5.getId(), trade5);
>                 cache.put(trade6.getId(), trade6);
>                 List<Trade> trades = cache.query(new ScanQuery<Integer,
> Trade>()).getAll().stream().map(item->item.getValue()).collect(toList());
>
>                 Map<String, Map&lt;TradeStatus, Long>> resultMap =
> trades.stream().collect(
>                                 groupingBy(item -> item.getTradeType(),
> groupingBy(Trade::getStatus,
> counting())));
>                 System.out.println(resultMap);
>                 //{type3={NEW=1}, type2={CHANGED=1, FAILED=1},
> type1={EXPIRED=1, NEW=2}}
>         }
> }
>
> public class Trade {
>         private int id;
>         private TradeStatus status;
>         private String tradeType;
>         public Trade(int id, TradeStatus status, String tradeType) {
>                 this.id = id;
>                 this.status = status;
>                 this.tradeType = tradeType;
>         }
>
> //setter getter, equals, hashcode methods
>
>         public enum TradeStatus {
>                 NEW, CHANGED, EXPIRED, FAILED, UNCHANGED
>         }
>
>
>
>
> --
> View this message in context: http://apache-ignite-users.
> 70518.x6.nabble.com/Building-complex-queries-to-query-
> ignite-Cache-tp9392.html
> Sent from the Apache Ignite Users mailing list archive at Nabble.com.
>



-- 
Vladislav Pyatkov

Reply via email to