the problem is in MultipleFieldEqualitor

@Override
public boolean isDerivedFrom(StreamComparator base){
if(null == base){ return false; }
if(base instanceof StreamComparator){
MultipleFieldComparator baseComps = (MultipleFieldComparator)base;
if(baseComps.getComps().length >= eqs.length){
for(int idx = 0; idx < eqs.length; ++idx){
if(!eqs[idx].isDerivedFrom(baseComps.getComps()[idx])){
return false;
}
}
return true;
}
}
return false;
}

it is called from ComplementStream

private void init(TupleStream streamA, TupleStream streamB, StreamEqualitor
eq) throws IOException {
this.streamA = new PushBackStream(streamA);
this.streamB = new PushBackStream(new UniqueStream(streamB, eq));
this.originalStreamB = streamB; // hold onto this for toExpression
this.eq = eq;
// streamA and streamB must both be sorted so that comp can be derived from
if(!eq.isDerivedFrom(streamA.getStreamSort()) || !eq.isDerivedFrom(streamB.
getStreamSort())){
throw new IOException("Invalid ComplementStream - both substream
comparators (sort) must be a superset of this stream's equalitor.");
}
}

If streamA.getStreamSort() or streamB.getStreamSort() returns
FieldComparator, then we get this casting exception.


Anyway.. if i add another sort field to search expressions, it works!
Is it bug or a feature?


max

On Mon, Oct 3, 2016 at 4:12 PM, Joel Bernstein <joels...@gmail.com> wrote:

> Ok, I'll test this out.
>
> Joel Bernstein
> http://joelsolr.blogspot.com/
>
> On Mon, Oct 3, 2016 at 4:40 AM, Markko Legonkov <maxl...@gmail.com> wrote:
>
> > here is the stacktrace
> >
> > java.io.IOException: Unable to construct instance of
> > org.apache.solr.client.solrj.io.stream.ComplementStream
> >         at org.apache.solr.client.solrj.io.stream.expr.StreamFactory.
> > createInstance(StreamFactory.java:323)
> >         at org.apache.solr.client.solrj.io.stream.expr.StreamFactory.
> > constructStream(StreamFactory.java:185)
> >         at org.apache.solr.client.solrj.io.stream.expr.StreamFactory.
> > constructStream(StreamFactory.java:178)
> >         at org.apache.solr.handler.StreamHandler.handleRequestBody(
> > StreamHandler.java:185)
> >         at org.apache.solr.handler.RequestHandlerBase.handleRequest(
> > RequestHandlerBase.java:154)
> >         at org.apache.solr.core.SolrCore.execute(SolrCore.java:2089)
> >         at org.apache.solr.servlet.HttpSolrCall.execute(
> > HttpSolrCall.java:652)
> >         at org.apache.solr.servlet.HttpSolrCall.call(
> > HttpSolrCall.java:459)
> >         at org.apache.solr.servlet.SolrDispatchFilter.doFilter(
> > SolrDispatchFilter.java:257)
> >         at org.apache.solr.servlet.SolrDispatchFilter.doFilter(
> > SolrDispatchFilter.java:208)
> >         at org.eclipse.jetty.servlet.ServletHandler$CachedChain.
> > doFilter(ServletHandler.java:1668)
> >         at org.eclipse.jetty.servlet.ServletHandler.doHandle(
> > ServletHandler.java:581)
> >         at org.eclipse.jetty.server.handler.ScopedHandler.handle(
> > ScopedHandler.java:143)
> >         at org.eclipse.jetty.security.SecurityHandler.handle(
> > SecurityHandler.java:548)
> >         at org.eclipse.jetty.server.session.SessionHandler.
> > doHandle(SessionHandler.java:226)
> >         at org.eclipse.jetty.server.handler.ContextHandler.
> > doHandle(ContextHandler.java:1160)
> >         at org.eclipse.jetty.servlet.ServletHandler.doScope(
> > ServletHandler.java:511)
> >         at org.eclipse.jetty.server.session.SessionHandler.
> > doScope(SessionHandler.java:185)
> >         at org.eclipse.jetty.server.handler.ContextHandler.
> > doScope(ContextHandler.java:1092)
> >         at org.eclipse.jetty.server.handler.ScopedHandler.handle(
> > ScopedHandler.java:141)
> >         at org.eclipse.jetty.server.handler.ContextHandlerCollection.
> > handle(ContextHandlerCollection.java:213)
> >         at org.eclipse.jetty.server.handler.HandlerCollection.
> > handle(HandlerCollection.java:119)
> >         at org.eclipse.jetty.server.handler.HandlerWrapper.handle(
> > HandlerWrapper.java:134)
> >         at org.eclipse.jetty.server.Server.handle(Server.java:518)
> >         at org.eclipse.jetty.server.HttpChannel.handle(
> > HttpChannel.java:308)
> >         at org.eclipse.jetty.server.HttpConnection.onFillable(
> > HttpConnection.java:244)
> >         at org.eclipse.jetty.io.AbstractConnection$
> ReadCallback.succeeded(
> > AbstractConnection.java:273)
> >         at org.eclipse.jetty.io.FillInterest.fillable(
> > FillInterest.java:95)
> >         at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(
> > SelectChannelEndPoint.java:93)
> >         at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.
> > produceAndRun(ExecuteProduceConsume.java:246)
> >         at org.eclipse.jetty.util.thread.strategy.
> > ExecuteProduceConsume.run(ExecuteProduceConsume.java:156)
> >         at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(
> > QueuedThreadPool.java:654)
> >         at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(
> > QueuedThreadPool.java:572)
> >         at java.lang.Thread.run(Thread.java:745)
> > Caused by: java.lang.reflect.InvocationTargetException
> >         at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native
> > Method)
> >         at sun.reflect.NativeConstructorAccessorImpl.newInstance(
> > NativeConstructorAccessorImpl.java:62)
> >         at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(
> > DelegatingConstructorAccessorImpl.java:45)
> >         at java.lang.reflect.Constructor.newInstance(Constructor.java:
> 422)
> >         at org.apache.solr.client.solrj.io.stream.expr.StreamFactory.
> > createInstance(StreamFactory.java:316)
> >         ... 33 more
> > Caused by: java.lang.ClassCastException:
> > org.apache.solr.client.solrj.io.comp.FieldComparator cannot be cast to
> > org.apache.solr.client.solrj.io.comp.MultipleFieldComparator
> >         at org.apache.solr.client.solrj.io.eq.MultipleFieldEqualitor.
> > isDerivedFrom(MultipleFieldEqualitor.java:99)
> >         at org.apache.solr.client.solrj.io.stream.ReducerStream.init(
> > ReducerStream.java:132)
> >         at org.apache.solr.client.solrj.io.stream.ReducerStream.<init>
> > (ReducerStream.java:69)
> >         at org.apache.solr.client.solrj.io.stream.UniqueStream.init(
> > UniqueStream.java:83)
> >         at org.apache.solr.client.solrj.io.stream.UniqueStream.<init>(
> > UniqueStream.java:55)
> >         at org.apache.solr.client.solrj.io.stream.ComplementStream.
> > init(ComplementStream.java:81)
> >         at org.apache.solr.client.solrj.io.stream.ComplementStream.<
> > init>(ComplementStream.java:73)
> >         ... 38 more
> >
> >
> > On Sun, Oct 2, 2016 at 12:59 AM, Joel Bernstein <joels...@gmail.com>
> > wrote:
> >
> > > Hi can you attach the stack traces in the logs? I'd like to see where
> > this
> > > exception coming, this appears to be a bug.
> > >
> > > I'll also need to dig into your expression and see if there is an issue
> > > with the syntax.
> > >
> > > Joel Bernstein
> > > http://joelsolr.blogspot.com/
> > >
> > > On Sat, Oct 1, 2016 at 2:29 PM, Markko Legonkov <maxl...@gmail.com>
> > wrote:
> > >
> > > > Hi
> > > >
> > > > What i would like to achieve is that i want to filter out all
> products
> > > > which have different prices on two given dates.
> > > > Here is a sample expression
> > > >
> > > > leftOuterJoin(
> > > >   search(
> > > >     products,
> > > >     q="*:*",
> > > >     fq="product_id_i:1 AND product_name_s:test",
> > > >     fl="id, product_id_i, product_name_s,sale_price_d",
> > > >     sort="product_id_i asc"
> > > >   ),
> > > >   select(
> > > >     search(
> > > >       products,
> > > >       q="product_id_i:1 AND product_name_s:Test",
> > > >       fl="id, product_id_i, product_name_s,sale_price_d",
> > > >       sort="product_id_i asc"
> > > >     ),
> > > >     id as c_id,
> > > >     product_id_i as c_product_id_i,
> > > >     product_name_s as c_product_name_s,
> > > >     sale_price_d as c_sale_price_d
> > > >   ),
> > > >   on="product_id_i=c_product_id_i, sale_price_d!=c_sale_price_d"
> > > > )
> > > >
> > > > I am using solr 6.2.0
> > > > And the result i get from solr is:
> > > > {
> > > >   "result-set": {
> > > >     "docs": [
> > > >       {
> > > >         "EXCEPTION": "org.apache.solr.client.solrj.
> > > io.comp.FieldComparator
> > > > cannot be cast to
> > > > org.apache.solr.client.solrj.io.comp.MultipleFieldComparator",
> > > >         "EOF": true
> > > >       }
> > > >     ]
> > > >   }
> > > > }
> > > >
> > > > Do i have to configure something in solr that it knows it has to use
> > > > MultipleFieldComparator?
> > > >
> > > > Regards
> > > > Max
> > > >
> > >
> >
>

Reply via email to