Hi Guilherme,

Thanks for the repro. It is a bug.
I've create a ticket [1]

[1] https://issues.apache.org/jira/browse/IGNITE-5804

On Fri, Jul 21, 2017 at 2:04 PM, Guilherme Melo <[email protected]>
wrote:

> Hello Andrei, upon further investigation it seems I have found a bug, the
> scenario is this: when running a query from a client node, if the result is
> bigger than the default, or set page size the objects returned are not
> transformed, but rather org.apache.ignite.internal.processors.cache.query.
> GridCacheQueryResponseEntry.
> I found this while running 1.9
> below is a simple test I wrote to prove it, its not the most elegant way
> to show it, but I did not have a lot of time.
>
> public class SimpleAlwaysTruePredicate implements 
> IgniteBiPredicate<String,Integer> {
>     @Override
>     public boolean apply(String s, Integer integer) {
>         return true;
>     }
> }
>
>
> public class SimpleOnlyValueTransformer implements 
> IgniteClosure<Cache.Entry<String, Integer>, Integer> {
>     @Override
>     public Integer apply(Cache.Entry<String, Integer> stringIntegerEntry) {
>         return stringIntegerEntry.getValue();
>     }
> }
>
>
> public static void main(String[] args) {
>
>     Ignition.setClientMode(true);
>     Ignite ignite = Ignition.start();
>
>     IgniteCache<String, Integer> cache = ignite.createCache("test");
>
>     System.out.println("Running a query with a transformer less than the 
> default page size");
>     //less than the default page size, no problem
>     for (int i = 0; i < 1024; i++) {
>         cache.put(String.valueOf(i), i);
>     }
>
>     List<Integer> returned = cache.query(new ScanQuery<String, Integer>(new 
> SimpleAlwaysTruePredicate()),
>             new SimpleOnlyValueTransformer()).getAll();
>
>     returned.forEach(i -> doNothing(i));
>     cache.clear();
>     cache.destroy();
>
>     cache = ignite.createCache("test");
>
>     System.out.println("Running a query with a transformer more than the 
> default page size");
>     //one more than the default page size, throws exception
>     for (int i = 0; i < 1025; i++) {
>         cache.put(String.valueOf(i), i);
>     }
>
>     returned = cache.query(new ScanQuery<String, Integer>(new 
> SimpleAlwaysTruePredicate()),
>             new SimpleOnlyValueTransformer()).getAll();
>
>     try {
>         returned.forEach(i -> doNothing(i));
>
>     } catch (Exception e) {
>         System.out.println(e);
>     }
>     cache.clear();
>     cache.destroy();
>     //just to make sure:
>     System.out.println("Running a query with a default page size and one more 
> entry then it");
>     cache = ignite.createCache("test");
>     cache.put("one", 1);
>     cache.put("two", 2);
>     Query<Cache.Entry<String, Integer>> query = new ScanQuery<>(new 
> SimpleAlwaysTruePredicate());
>     query.setPageSize(1);
>
>     returned = cache.query(query,
>             new SimpleOnlyValueTransformer()).getAll();
>
>
>     try {
>         returned.forEach(i -> doNothing(i));
>
>     } catch (Exception e) {
>         System.out.println(e);
>     }
>     cache.clear();
>     cache.destroy();
>     Ignition.stop(true);
> }
>
> public static void doNothing(Integer i) {
>
> }
>
>
> Cheers,
>
> Guilherme Melo
> www.gmelo.org
>
> On 20 July 2017 at 23:13, Andrey Mashenkov <[email protected]>
> wrote:
>
>> Hi Guilherme,
>>
>> What version of ignite do you use?
>> Can you share a reproducer?
>>
>> On Thu, Jul 20, 2017 at 1:32 PM, Guilherme Melo <[email protected]>
>> wrote:
>>
>>> Hello,
>>> Has anyone had issues with Transformers not being called on every
>>> instance of the scanQuery?
>>> only about 10% of the objects get transformed, the rest are added to the
>>> list returned from cache.query() are IgniteBiTuple, not what was passed to
>>> the Transformer.
>>> this does not happen when running the query without the transformer.
>>>
>>> Thank you
>>>
>>>
>>
>>
>> --
>> Best regards,
>> Andrey V. Mashenkov
>>
>
>


-- 
Best regards,
Andrey V. Mashenkov

Reply via email to