Note, for everyone's reference, I found the following link in a Google search which helped me figure out my collocated PRs, Equi-Join Query problem...
https://pubs.vmware.com/vfabric5/index.jsp?topic=/com.vmware.vfabric.gemfire.6.6/developing/partitioned_regions/join_query_partitioned_regions.html For *Pivotal GemFire*, the reference is here... http://gemfire.docs.pivotal.io/docs-gemfire/latest/developing/partitioned_regions/join_query_partitioned_regions.html And for *Apache Geode*, the reference is here... http://geode.docs.pivotal.io/docs/developing/partitioned_regions/join_query_partitioned_regions.html I have to say that the key to properly performing an Equi-Join Query on collocated PRs (inside a Function, no-less), given the following code snippet from the documentation, was not very obvious... SelectResults result = (SelectResults)*query .execute((RegionFunctionContext)context)*; Thanks, John On Tue, Jul 12, 2016 at 6:54 PM, John Blum <jb...@pivotal.io> wrote: > Thanks for the fast response Dan. > > Unfortunately, that did not work, given the following... > > protected static final String CUSTOMERS_WITH_CONTACTS_QUERY = > "SELECT DISTINCT customer FROM /Customers customer, /Contacts contact" > + " WHERE customer.firstName = contact.person.firstName AND > customer.lastName = contact.person.lastName"; > > @GemfireFunction > public List<Customer> > findAllCustomersWithContactInformation(FunctionContext functionContext) { > return executeQueryOnRegion(toRegionFunctionContext(functionContext)); > } > > protected List<Customer> executeQueryOnRegion(RegionFunctionContext > regionFunctionContext) { > return executeQueryOnRegion(*PartitionRegionHelper.* > *getLocalDataForContext**(regionFunctionContext)*); > } > > @SuppressWarnings("unchecked") > protected List<Customer> executeQueryOnRegion(Region<Long, Customer> > customers) { > try { > QueryService queryService = > customers.getRegionService().getQueryService(); > Query query = queryService.newQuery(CUSTOMERS_WITH_CONTACTS_QUERY); > Object results = query.execute(); > Assert.isInstanceOf(SelectResults.class, results); > return ((SelectResults<Customer>) results).asList(); > } > catch (Exception e) { > throw new RuntimeException("?", e); > } > } > > However, the following does work... > > @SuppressWarnings("unchecked") > protected List<Customer> executeQueryInFunctionContext(RegionFunctionContext > *functionContext*) { > try { > QueryService queryService = > functionContext.getDataSet().getRegionService().getQueryService(); > Query query = queryService.newQuery(CUSTOMERS_WITH_CONTACTS_QUERY); > Object results = *query.execute(functionContext);* > Assert.isInstanceOf(SelectResults.class, results); > return ((SelectResults<Customer>) results).asList(); > } > catch (Exception e) { > throw new RuntimeException("?", e); > } > } > > This would probably make for a good example in the *Apache Geode* > examples, sometime, ;-). I can contribute this after SpringOne. > > Thanks again, > John > > > On Tue, Jul 12, 2016 at 6:03 PM, Dan Smith <dsm...@pivotal.io> wrote: > >> I'm not sure, but I think you might need to use the query method on the >> Region returned from PartitionRegionHelper.getLocalDataForContext. >> >> -Dan >> >> On Tue, Jul 12, 2016 at 5:57 PM, John Blum <jb...@pivotal.io> wrote: >> >> > I have 2 PRs (Customers & Contacts) and I am running a query to find all >> > customers with contact information. I have collocated both Customers >> and >> > Contacts. Initially, I tried to run the query outside a GemFire >> Function, >> > which failed with... >> > >> > java.lang.UnsupportedOperationException: *A query on a Partitioned >> Region ( >> > Customers ) may not reference any other region if query is NOT executed >> > within a Function* >> > at >> > >> > >> com.gemstone.gemfire.cache.query.internal.DefaultQuery.checkQueryOnPR(DefaultQuery.java:638) >> > at >> > >> > >> com.gemstone.gemfire.cache.query.internal.DefaultQuery.execute(DefaultQuery.java:351) >> > at >> > >> > >> org.springframework.data.gemfire.GemfireTemplate.find(GemfireTemplate.java:299) >> > >> > So, then I proceeded to attempt to execute my query... >> > >> > SELECT DISTINCT customer >> > FROM /Customers customer, /Contacts contact" >> > WHERE customer.firstName = contact.person.firstName >> > AND customer.lastName = contact.person.lastName >> > >> > ... in a Function as instructed, however, I ended up with the same >> > Exception. >> > >> > I am trying to figure out how to properly execute a JOIN on 2 >> "collocated" >> > PRs from within a Function, given the FunctionContext (or possibly the >> > local data set of the PR using RegionFunctionContext.getDataSet(), or >> > something like that). >> > >> > Any help is appreciated. >> > >> > Thanks, >> > >> > -John >> > >> > > > > -- > -John > 503-504-8657 > john.blum10101 (skype) > -- -John 503-504-8657 john.blum10101 (skype)