Search code examples
spring-datagemfile

QueryService in GemFire 8.2.x Function return null values


I have created function to select data from Partition region Individual. When I try to execute the function at client side getting null.

output
[[], null]

public class MySelectPartitionFunction extends FunctionAdapter implements Declarable{

    private static final long serialVersionUID = 1L;

    @Override
    public void execute(FunctionContext context) {
         Cache cache = CacheFactory.getAnyInstance();
          QueryService queryService = cache.getQueryService();

          String qstr = (String) context.getArguments();

          try {
            Query query = queryService.newQuery(qstr);
           RegionFunctionContext rContext = (RegionFunctionContext)context;
            SelectResults results = (SelectResults) query.execute(rContext);
            context.getResultSender().sendResult((ArrayList) (results).asList());
            context.getResultSender().lastResult(null);
          } catch (Exception e) {
            throw new FunctionException(e);
          }
        }

    @Override
    public String getId() {
    return getClass().getName();
    }

    @Override
    public boolean hasResult() {
      return true;
    }

    @Override
    public boolean isHA() {
      return false;
    }

    public void init(Properties arg0) {
    }

}


public class TestFunctionQuery {
    public static void main(String[] args) {

        ResultCollector rcollector = null;
        ClientCache cache;
        Region<?, ?> individual;

        cache = new ClientCacheFactory().set("name", "ClientWorker").set("cache-xml-file", "xml/clientCache.xml")
                .create();
        individual = cache.getRegion("Individual");
        String qStr = "SELECT * FROM /Individual";

        try {
          Set keyFilter = new HashSet();
            keyFilter.add(1);

          rcollector = FunctionService
              .onRegion(individual)
              .withArgs(qStr)
              .withFilter(keyFilter)
              .execute("com.xxx.logic.MySelectPartitionFunction");

          Object result = rcollector.getResult();
          ArrayList resultList = (ArrayList)result;
          List queryResults = new ArrayList();
          if (resultList.size()!=0) {
            for (Object obj: resultList) {
              if (obj != null) {
                queryResults.addAll((ArrayList)obj);
              }
            }
          }
          System.out.println((queryResults));

        } catch (FunctionException ex) {
            System.out.println("Exception");
        }
      }

}

gfsh>describe region --name=Individual
..........................................................
Name            : Individual
Data Policy     : partition
Hosting Members : server2
server1


Non-Default Attributes Shared By Hosting Members

  Type    |       Name       | Value
--------- | ---------------- | -----
Region    | size             | 3
Partition | redundant-copies | 1

Solution

  • I was able to retrieve the record after making changes in Function and client code

    @Override
    public void execute(FunctionContext context) {
        Cache cache = CacheFactory.getAnyInstance();
        QueryService queryService = cache.getQueryService();
    
          String qstr = (String) context.getArguments();
    
          try {
               Query query = queryService.newQuery(qstr);
                SelectResults<?> result = (SelectResults<?>) query.execute((RegionFunctionContext) context);
                ArrayList<?> arrayResult = (ArrayList<?>) result.asList();
                context.getResultSender().sendResult(arrayResult);
                context.getResultSender().lastResult(null);
            } catch (Exception e) {
            throw new FunctionException(e);
          }
    
    }
    
    ClientCache cache;
        Region<?, ?> individual;
    
        cache = new ClientCacheFactory().set("name", "ClientWorker").set("cache-xml-file", "xml/clientCache.xml")
                .create();
        individual = cache.getRegion("Individual");
    
    
        String qStr = "SELECT  r1.id,r1.firstName, r1.lastName FROM /Individual r1";
    
        try {
    
            Object result = FunctionService.onRegion(individual)
                     .withArgs(qStr).execute("com.xxx.logic.MySelectPartitionFunction").getResult();
    

    Output [[struct(id:2,firstName:Basha,lastName:Shaik), struct(id:1,firstName:Krish,lastName:Chaitu), struct(id:5,firstName:Vigneshwaran,lastName:Ganesan)], null, [struct(id:4,firstName:Arun,lastName:Kishore), struct(id:3,firstName:Anurag,lastName:Kshirsagar)], null]