Hi Dan,

Thanks for the input. Serialization errors are now gone.

However, I get this exception now :

org.apache.geode.cache.client.ServerOperationException: remote server on
UNKNOWN(6217:loner):55000:e60cf1f7: While performing a remote
executeRegionFunction
at
org.apache.geode.cache.client.internal.ExecuteRegionFunctionOp$ExecuteRegionFunctionOpImpl.processResponse(ExecuteRegionFunctionOp.java:442)
at
org.apache.geode.cache.client.internal.AbstractOp.processResponse(AbstractOp.java:222)
at
org.apache.geode.cache.client.internal.AbstractOp.attemptReadResponse(AbstractOp.java:195)
at
org.apache.geode.cache.client.internal.AbstractOp.attempt(AbstractOp.java:382)
at
org.apache.geode.cache.client.internal.AbstractOpWithTimeout.attempt(AbstractOpWithTimeout.java:45)
at
org.apache.geode.cache.client.internal.ConnectionImpl.execute(ConnectionImpl.java:263)
at
org.apache.geode.cache.client.internal.pooling.PooledConnection.execute(PooledConnection.java:353)
at
org.apache.geode.cache.client.internal.OpExecutorImpl.executeWithPossibleReAuthentication(OpExecutorImpl.java:750)
at
org.apache.geode.cache.client.internal.OpExecutorImpl.execute(OpExecutorImpl.java:138)
at
org.apache.geode.cache.client.internal.PoolImpl.execute(PoolImpl.java:785)
at
org.apache.geode.cache.client.internal.ExecuteRegionFunctionOp.execute(ExecuteRegionFunctionOp.java:92)
at
org.apache.geode.cache.client.internal.ServerRegionProxy.executeFunction(ServerRegionProxy.java:687)
at
org.apache.geode.internal.cache.execute.ServerRegionFunctionExecutor.executeOnServer(ServerRegionFunctionExecutor.java:200)
at
org.apache.geode.internal.cache.execute.ServerRegionFunctionExecutor.executeFunction(ServerRegionFunctionExecutor.java:154)
at
org.apache.geode.internal.cache.execute.ServerRegionFunctionExecutor.execute(ServerRegionFunctionExecutor.java:379)
at
org.apache.geode.cache.lucene.internal.LuceneQueryImpl.findTopEntries(LuceneQueryImpl.java:121)
at
org.apache.geode.cache.lucene.internal.LuceneQueryImpl.findPages(LuceneQueryImpl.java:99)
at
org.apache.geode.cache.lucene.internal.LuceneQueryImpl.findResults(LuceneQueryImpl.java:85)
at
org.apache.geode.cache.lucene.internal.LuceneQueryImpl.findValues(LuceneQueryImpl.java:78)
at com.lbc.station.service.controller.*StationController*
.testStationsOfInterest(StationController.java:65)
at
com.lbc.station.service.controller.$StationControllerDefinition$$exec1.invokeInternal(Unknown
Source)
. . .
. . .
. . .
*Caused by: java.lang.ClassNotFoundException:
com.lbc.station.service.controller.StationController*
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:686)
at
org.apache.geode.internal.InternalDataSerializer$DSObjectInputStream.resolveClass(InternalDataSerializer.java:3668)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1868)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1751)
at java.io.ObjectInputStream.readClass(ObjectInputStream.java:1716)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1556)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2287)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2211)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2069)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)
at
org.apache.geode.internal.InternalDataSerializer.readSerializable(InternalDataSerializer.java:2846)
at
org.apache.geode.internal.InternalDataSerializer.basicReadObject(InternalDataSerializer.java:2790)
at org.apache.geode.DataSerializer.readObject(DataSerializer.java:2968)
at
org.apache.geode.cache.lucene.internal.distributed.LuceneFunctionContext.fromData(LuceneFunctionContext.java:106)
at
org.apache.geode.internal.InternalDataSerializer.invokeFromData(InternalDataSerializer.java:2372)
at org.apache.geode.internal.DSFIDFactory.create(DSFIDFactory.java:997)
at
org.apache.geode.internal.InternalDataSerializer.basicReadObject(InternalDataSerializer.java:2668)
at org.apache.geode.DataSerializer.readObject(DataSerializer.java:2968)
at
org.apache.geode.internal.util.BlobHelper.deserializeBlob(BlobHelper.java:99)
at
org.apache.geode.internal.cache.tier.sockets.CacheServerHelper.deserialize(CacheServerHelper.java:73)
at
org.apache.geode.internal.cache.tier.sockets.Part.getObject(Part.java:351)
at
org.apache.geode.internal.cache.tier.sockets.Part.getObject(Part.java:359)
at
org.apache.geode.internal.cache.tier.sockets.command.ExecuteRegionFunction66.cmdExecute(ExecuteRegionFunction66.java:101)
at
org.apache.geode.internal.cache.tier.sockets.BaseCommand.execute(BaseCommand.java:183)
at
org.apache.geode.internal.cache.tier.sockets.ServerConnection.doNormalMessage(ServerConnection.java:848)
at
org.apache.geode.internal.cache.tier.sockets.OriginalServerConnection.doOneMessage(OriginalServerConnection.java:72)
at
org.apache.geode.internal.cache.tier.sockets.ServerConnection.run(ServerConnection.java:1212)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at
org.apache.geode.internal.cache.tier.sockets.AcceptorImpl.lambda$initializeServerConnectionThreadPool$3(AcceptorImpl.java:666)
at
org.apache.geode.internal.logging.LoggingThreadFactory.lambda$newThread$0(LoggingThreadFactory.java:121)
... 1 common frames omitted



Regards,
Ajay Vasudevan

On Thu, Jan 30, 2020 at 1:03 AM Dan Smith <dsm...@pivotal.io> wrote:

> Hi vas,
>
> The problem is that your entire query needs to be inside the lamba, like
> below:
>
> index -> {
>                     return new BooleanQuery.Builder()
>                          //Query object must be constructed here, inside
> the lambda
>                          Query queryToExecute = new
> StandardQueryParser().parse(queryString, "stationNameIndex");
>                         .add(queryToExecute, BooleanClause.Occur.MUST)
>                         .build();
>                   });
>
> The reason you have to do this is that this entire object is serialized
> and evaluated *on the server*. Unfortunately, lucene queries are not
> serializable. So in the code you send, the query is constructed on the
> client and then we try to serialize it and send it to the server, which
> doesn't work.
>
> //Query is created on the client
> Query queryToExecute = new StandardQueryParser().parse(queryString,
> "stationNameIndex");
>
> LuceneQuery<Long, Station> luceneQuery =
>           luceneService
>               .createLuceneQueryFactory()
>               .setLimit(100)
>               .create(
>                   "stationNameIndex",
>                   "stations-region",
>                   index -> {
>                     return new BooleanQuery.Builder()
>                          //Using a Query object here that was constructed
> outside this block means that it must be serialized to the server. This
> won't work.
>                         .add(queryToExecute, BooleanClause.Occur.MUST)
>                         .build();
>                   });
>
> On Wed, Jan 29, 2020 at 3:23 PM vas aj <vasudevan.a...@gmail.com> wrote:
>
>> Changed Query queryToExecute = new StandardQueryParser().parse(queryString,
>> "stationNameIndex");
>> to Query queryToExecute = new StandardQueryParser().parse(queryString,
>> "stationName");
>>
>> But still, get the error
>>
>> Caused by: java.io.NotSerializableException:
>> org.apache.lucene.search.PrefixQuery
>> . . .
>>
>> Caused by: org.apache.geode.SerializationException: failed serializing
>> object
>> . . .
>>
>> Caused by: java.io.NotSerializableException:
>> org.apache.lucene.search.PrefixQuery
>>
>> Help is needed, please
>>
>> On Wed, Jan 29, 2020 at 11:13 PM vas aj <vasudevan.a...@gmail.com> wrote:
>>
>>> Rechecked my lucene index on Geode and they are as follows:
>>>
>>> create lucene index --name=stationNameIndex --region=stations-region
>>> --field=stationName,longitude,latitude
>>> --analyzer=org.apache.lucene.analysis.en.EnglishAnalyzer,DEFAULT,DEFAULT
>>>
>>> and in java code
>>>
>>> queryString = "stationName: piccadilly*";
>>> Query queryToExecute = new StandardQueryParser().parse(queryString,
>>> "stationNameIndex");
>>>
>>> LuceneQuery<Long, Station> luceneQuery =
>>>           luceneService
>>>               .createLuceneQueryFactory()
>>>               .setLimit(100)
>>>               .create(
>>>                   "stationNameIndex",
>>>                   "stations-region",
>>>                   index -> {
>>>                     return new BooleanQuery.Builder()
>>>                         .add(queryToExecute, BooleanClause.Occur.MUST)
>>>                         .build();
>>>                   });
>>>
>>> luceneQuery.findValues() throws Serialization exception but when I use
>>> the
>>>
>>> LuceneQuery<Long, Station> luceneQuery =
>>>           luceneService
>>>               .createLuceneQueryFactory()
>>>               .setLimit(100)
>>>               .create(
>>>                   "stationNameIndex",
>>>                   "stations-region",
>>>                   queryString,
>>>                   "stationName"
>>>                   });
>>>
>>> It works.
>>>
>>> What has gone wrong?
>>>
>>> On Wed, Jan 29, 2020 at 9:19 PM Xiaojian Zhou <gz...@pivotal.io> wrote:
>>>
>>>> You should use the stationName not station if your object is indexed
>>>> on the field, i.e. stationName.
>>>>
>>>> Even class Station implements DataSerializable, lucene index are still
>>>> only index on the object's fields, such as stationName.
>>>>
>>>> On Wed, Jan 29, 2020 at 1:04 PM vas aj <vasudevan.a...@gmail.com>
>>>> wrote:
>>>>
>>>>> Sorry
>>>>> queryString = "station: piccadilly*" to get the mentioned error.
>>>>>
>>>>> On Wed, Jan 29, 2020 at 9:01 PM vas aj <vasudevan.a...@gmail.com>
>>>>> wrote:
>>>>>
>>>>>> Hi team,
>>>>>>
>>>>>> The below code :
>>>>>>
>>>>>> queryString = "piccadilly*";
>>>>>> Query queryToExecute = new StandardQueryParser().parse(queryString,
>>>>>> "stationNameIndex");
>>>>>>
>>>>>> LuceneQuery<Long, Station> luceneQuery =
>>>>>>           luceneService
>>>>>>               .createLuceneQueryFactory()
>>>>>>               .setLimit(100)
>>>>>>               .create(
>>>>>>                   "stationNameIndex",
>>>>>>                   "stations-region",
>>>>>>                   index -> {
>>>>>>                     return new BooleanQuery.Builder()
>>>>>>                         .add(queryToExecute, BooleanClause.Occur.MUST)
>>>>>>                         .build();
>>>>>>                   });
>>>>>> Collection<Station> stations = luceneQuery.findValues();
>>>>>>
>>>>>> *throws the below error : *
>>>>>>
>>>>>> Error while querying => {}
>>>>>> org.apache.geode.SerializationException: failed serializing object
>>>>>> at
>>>>>> org.apache.geode.internal.cache.tier.sockets.Message.serializeAndAddPart(Message.java:408)
>>>>>> at
>>>>>> org.apache.geode.internal.cache.tier.sockets.Message.addObjPart(Message.java:350)
>>>>>> at
>>>>>> org.apache.geode.internal.cache.tier.sockets.Message.addObjPart(Message.java:329)
>>>>>> at
>>>>>> org.apache.geode.cache.client.internal.ExecuteRegionFunctionSingleHopOp$ExecuteRegionFunctionSingleHopOpImpl.<init>(ExecuteRegionFunctionSingleHopOp.java:180)
>>>>>> at
>>>>>> org.apache.geode.cache.client.internal.ServerRegionProxy.lambda$executeFunction$1(ServerRegionProxy.java:699)
>>>>>> at
>>>>>> org.apache.geode.cache.client.internal.ExecuteRegionFunctionSingleHopOp.constructAndGetExecuteFunctionTasks(ExecuteRegionFunctionSingleHopOp.java:131)
>>>>>> at
>>>>>> org.apache.geode.cache.client.internal.ExecuteRegionFunctionSingleHopOp.execute(ExecuteRegionFunctionSingleHopOp.java:84)
>>>>>> at
>>>>>> org.apache.geode.cache.client.internal.ServerRegionProxy.executeFunction(ServerRegionProxy.java:701)
>>>>>> at
>>>>>> org.apache.geode.internal.cache.execute.ServerRegionFunctionExecutor.executeOnServer(ServerRegionFunctionExecutor.java:200)
>>>>>> at
>>>>>> org.apache.geode.internal.cache.execute.ServerRegionFunctionExecutor.executeFunction(ServerRegionFunctionExecutor.java:154)
>>>>>> at
>>>>>> org.apache.geode.internal.cache.execute.ServerRegionFunctionExecutor.execute(ServerRegionFunctionExecutor.java:379)
>>>>>> at
>>>>>> org.apache.geode.cache.lucene.internal.LuceneQueryImpl.findTopEntries(LuceneQueryImpl.java:121)
>>>>>> at
>>>>>> org.apache.geode.cache.lucene.internal.LuceneQueryImpl.findPages(LuceneQueryImpl.java:99)
>>>>>> at
>>>>>> org.apache.geode.cache.lucene.internal.LuceneQueryImpl.findResults(LuceneQueryImpl.java:85)
>>>>>> at
>>>>>> org.apache.geode.cache.lucene.internal.LuceneQueryImpl.findValues(LuceneQueryImpl.java:78)
>>>>>>
>>>>>> whereas
>>>>>>
>>>>>> LuceneQuery<Long, Station> luceneQuery =
>>>>>>           luceneService
>>>>>>               .createLuceneQueryFactory()
>>>>>>               .setLimit(100)
>>>>>>               .create(
>>>>>>                   "stationNameIndex",
>>>>>>                   "stations-region",
>>>>>>                   queryString,
>>>>>>                   "stationName"
>>>>>>                   });
>>>>>>
>>>>>> works perfectly & Station
>>>>>> implements org.apache.geode.DataSerializable.
>>>>>>
>>>>>> What am I missing?.
>>>>>> Please help.
>>>>>>
>>>>>> Regards,
>>>>>> Aj
>>>>>>
>>>>>> On Tue, Jan 28, 2020 at 11:31 PM Xiaojian Zhou <gz...@pivotal.io>
>>>>>> wrote:
>>>>>>
>>>>>>> Maybe you should change one or both of the "MUST" to "SHOULD". And
>>>>>>> it's better to switch the order of the 2 subqueries.
>>>>>>>
>>>>>>>
>>>>>>> On Tue, Jan 28, 2020 at 2:23 PM vas aj <vasudevan.a...@gmail.com>
>>>>>>> wrote:
>>>>>>>
>>>>>>>> Thanks Dan for the quick help.
>>>>>>>> However the query failed.
>>>>>>>>
>>>>>>>> Working on the same.
>>>>>>>>
>>>>>>>> On Tue, 28 Jan 2020, 19:55 Dan Smith, <dsm...@pivotal.io> wrote:
>>>>>>>>
>>>>>>>>> I think you could probably use a BooleanQuery to do this.
>>>>>>>>> Something like this, although I haven't tested it. Your LuceneQuery1 
>>>>>>>>> just
>>>>>>>>> results in a call to StandardQueryParser.parse, so you can combine 
>>>>>>>>> that
>>>>>>>>> with your spatial query:
>>>>>>>>>
>>>>>>>>> LuceneQuery<Long, Station> luceneQuery2 =
>>>>>>>>>     luceneService
>>>>>>>>>          .createLuceneQueryFactory()
>>>>>>>>>          .create("stationNameIndex", "stations-region", index -> {
>>>>>>>>>             BooleanQuery query = new BooleanQuery();
>>>>>>>>>             query.add(new StandardQueryParser().parse(queryString,
>>>>>>>>> name), BooleanQuery.Occur.MUST);
>>>>>>>>>             query.add(SpatialHelper.findWithin(-122.8515139,
>>>>>>>>> 45.5099231, 0.5), , BooleanQuery.Occur.MUST);
>>>>>>>>>             return query;
>>>>>>>>>     }
>>>>>>>>>
>>>>>>>>> On Tue, Jan 28, 2020 at 11:36 AM vas aj <vasudevan.a...@gmail.com>
>>>>>>>>> wrote:
>>>>>>>>>
>>>>>>>>>> Hi team,
>>>>>>>>>>
>>>>>>>>>> I want to execute a *LuceneQuery* that searches both a
>>>>>>>>>> queryString(E.g. "station:Piccadilly*") as well as nearest station 
>>>>>>>>>> within
>>>>>>>>>> .5 miles.(E.g. SpatialHelper.findWithin(lat, long, 0.5))
>>>>>>>>>>
>>>>>>>>>> In other words, is there any means of combining *luceneQuery1* &
>>>>>>>>>> *luceneQuery2* and executing them as
>>>>>>>>>> Collection<Station> nearestStations = *luceneQuery*.findValues();
>>>>>>>>>>
>>>>>>>>>> where luceneQuery = luceneQuery1 + luceneQuery2
>>>>>>>>>>
>>>>>>>>>> *LuceneQuery1*
>>>>>>>>>> LuceneQuery<Long, Station> luceneQuery1 =
>>>>>>>>>>         luceneService
>>>>>>>>>>             .createLuceneQueryFactory()
>>>>>>>>>>             .setLimit(100)
>>>>>>>>>>             .create("stationNameIndex", "stations-region",
>>>>>>>>>> queryString, "name");
>>>>>>>>>>
>>>>>>>>>> *LuceneQuery2*
>>>>>>>>>> LuceneQuery<Long, Station> luceneQuery2 =
>>>>>>>>>>     luceneService
>>>>>>>>>>          .createLuceneQueryFactory()
>>>>>>>>>>          .create("stationNameIndex", "stations-region", index ->
>>>>>>>>>> SpatialHelper.findWithin(-122.8515139, 45.5099231, 0.5);
>>>>>>>>>>
>>>>>>>>>> Regards
>>>>>>>>>> Aj
>>>>>>>>>>
>>>>>>>>>

Reply via email to