public Object evaluate(ExecutionContext context) throws RegionNotFoundException { Region rgn; Cache cache = context.getCache(); // do PR bucketRegion substitution here for expressions that evaluate to a Region. PartitionedRegion pr = context.getPartitionedRegion(); if (pr != null && pr.getFullPath().equals(this.regionPath)) { rgn = context.getBucketRegion(); } else if (pr != null) { // Asif : This is a very tricky solution to allow equijoin queries on PartitionedRegion // locally // We have possibly got a situation of equijoin. it may be across PRs. so use the context's // bucket region // to get ID and then retrieve the this region's bucket region BucketRegion br = context.getBucketRegion(); int bucketID = br.getId(); // Is current region a partitioned region rgn = cache.getRegion(this.regionPath); if (rgn.getAttributes().getDataPolicy().withPartitioning()) { // convert it into bucket region. PartitionedRegion prLocal = (PartitionedRegion) rgn; rgn = prLocal.getDataStore().getLocalBucketById(bucketID); } } else { rgn = cache.getRegion(this.regionPath); } if (rgn == null) { // if we couldn't find the region because the cache is closed, throw // a CacheClosedException if (cache.isClosed()) { throw new CacheClosedException(); } throw new RegionNotFoundException( LocalizedStrings.CompiledRegion_REGION_NOT_FOUND_0.toLocalizedString(this.regionPath)); } if (context.isCqQueryContext()) { return new QRegion(rgn, true, context); } else { return new QRegion(rgn, false, context); } }
@SuppressWarnings("unchecked") @Override public void cmdExecute(Message msg, ServerConnection servConn, long start) throws IOException, ClassNotFoundException, InterruptedException { String regionFullPath = null; CachedRegionHelper crHelper = servConn.getCachedRegionHelper(); regionFullPath = msg.getPart(0).getString(); String errMessage = ""; if (regionFullPath == null) { logger.warn( LocalizedMessage.create( LocalizedStrings.GetClientPartitionAttributes_THE_INPUT_REGION_PATH_IS_NULL)); errMessage = LocalizedStrings.GetClientPartitionAttributes_THE_INPUT_REGION_PATH_IS_NULL .toLocalizedString(); writeErrorResponse( msg, MessageType.GET_CLIENT_PARTITION_ATTRIBUTES_ERROR, errMessage.toString(), servConn); servConn.setAsTrue(RESPONDED); } else { Region region = crHelper.getRegion(regionFullPath); if (region == null) { logger.warn( LocalizedMessage.create( LocalizedStrings .GetClientPartitionAttributes_REGION_NOT_FOUND_FOR_SPECIFIED_REGION_PATH, regionFullPath)); errMessage = LocalizedStrings.GetClientPartitionAttributes_REGION_NOT_FOUND.toLocalizedString() + regionFullPath; writeErrorResponse( msg, MessageType.GET_CLIENT_PARTITION_ATTRIBUTES_ERROR, errMessage.toString(), servConn); servConn.setAsTrue(RESPONDED); } else { try { Message responseMsg = servConn.getResponseMessage(); responseMsg.setTransactionId(msg.getTransactionId()); responseMsg.setMessageType(MessageType.RESPONSE_CLIENT_PARTITION_ATTRIBUTES); PartitionedRegion prRgion = (PartitionedRegion) region; PartitionResolver partitionResolver = prRgion.getPartitionResolver(); int numParts = 2; // MINUMUM PARTS if (partitionResolver != null) { numParts++; } responseMsg.setNumberOfParts(numParts); // PART 1 responseMsg.addObjPart(prRgion.getTotalNumberOfBuckets()); // PART 2 if (partitionResolver != null) { responseMsg.addObjPart(partitionResolver.getClass().toString().substring(6)); } // PART 3 String leaderRegionPath = null; PartitionedRegion leaderRegion = null; String leaderRegionName = prRgion.getColocatedWith(); if (leaderRegionName != null) { Cache cache = prRgion.getCache(); while (leaderRegionName != null) { leaderRegion = (PartitionedRegion) cache.getRegion(leaderRegionName); if (leaderRegion.getColocatedWith() == null) { leaderRegionPath = leaderRegion.getFullPath(); break; } else { leaderRegionName = leaderRegion.getColocatedWith(); } } } responseMsg.addObjPart(leaderRegionPath); responseMsg.send(); msg.flush(); } catch (Exception e) { writeException(msg, e, false, servConn); } finally { servConn.setAsTrue(Command.RESPONDED); } } } }