How to query objects in which some fields have be transformed during serialization by an extended PDX ReflectionBasedAutoSerializer
search cancel

How to query objects in which some fields have be transformed during serialization by an extended PDX ReflectionBasedAutoSerializer

book

Article ID: 294214

calendar_today

Updated On:

Products

VMware Tanzu Gemfire

Issue/Introduction

Beginning with GemFire 6.6.2, the Portable Data eXchange (PDX) ReflectionBasedAutoSerializer can be extended to convert ("transform") the type of field variables of domain objects. A useful example of this, given in the User's Guide, is to convert a BigDecimal field to a String field. This article explains how to query objects in which some of the fields have been converted by such an extended ReflectionBasedAutoSerializer.


Environment


Cause

To understand the issue, suppose that you want to query objects that contain a field whose type has been converted from BigDecimal to String while it is serialized. The original type of the field is BigDecimal, so you might write a query with a WHERE condition like the following (where the type of the field "bigDecimal" is originally, before conversion, BigDecimal):

SELECT * FROM /MyRegion WHERE bigDecimal = 2001.03

However, this query may fail to return any results, because the WHERE condition is applied to the serialized object directly and the converted field type is, thus, a String.

Resolution

In the above case, the type of the target field was converted from BigDecimal to String. Hence, you should deal with the field as a String using a query like the following:

SELECT * FROM /MyRegion WHERE bigDecimal = '2001.03'

If, however, you want to deal with the field using the original type in the WHERE condition, you should implement a public method in your domain class to return the original field type and query using that method, as shown in the following (where the method getBigDecimalValue returns the field value with a BigDecimal type):

SELECT * FROM /MyRegion mr WHERE mr.getBigDecimalValue = 2001.03

Please note that that this approach will cause the objects to be deserialized in order to call the method, so the domain class must be available in the CLASSPATH.


Additional Information

Environment

Product Version
VMware GemFire 6.6.2 or later

For information on writing a custom PDX ReflectionBasedAutoSerializer, please refer to the following document: