Mailing List Archive

jruby and solrj
I've been messing around with jRuby and SolrJ with nice results. But can't
seem to get the SolrQuery.addFacetField method to work. I get this error:

"for method addFacetField expected [[Ljava.lang.String;]; got:
[java.lang.String]; error: argument type mismatch (TypeError)"

I'm using it like:

query.add_facet_field 'cat'

and also tried:

query.addFacetField 'cat'

Any ideas as to what I'm doing wrong?

Matt

p.s. The other methods I've tried work great: set_query, set_query_type,
set_facet, set_facet_limit, set_facet_min_count, set_include_score,
add_sort_field.
Re: jruby and solrj [ In reply to ]
just guessing, but try passing that as a string[] rather then just a
string

The java function takes ( string ... v ) -- in java that means you can
pass either a string or an array, or a variable length list of
strings. I'm guessing that does something funny with jruby

ryan


On Oct 5, 2008, at 10:54 PM, Matt Mitchell wrote:

> I've been messing around with jRuby and SolrJ with nice results. But
> can't
> seem to get the SolrQuery.addFacetField method to work. I get this
> error:
>
> "for method addFacetField expected [[Ljava.lang.String;]; got:
> [java.lang.String]; error: argument type mismatch (TypeError)"
>
> I'm using it like:
>
> query.add_facet_field 'cat'
>
> and also tried:
>
> query.addFacetField 'cat'
>
> Any ideas as to what I'm doing wrong?
>
> Matt
>
> p.s. The other methods I've tried work great: set_query,
> set_query_type,
> set_facet, set_facet_limit, set_facet_min_count, set_include_score,
> add_sort_field.
Re: jruby and solrj [ In reply to ]
Unfortunately, to call varargs from JRuby (so I just learned from
irc's #jruby), you have to do this:

query.add_facet_field(['cat'].to_java :string)

anyway, for our solr-jruby purposes, i think we can stick to using the
ModifiableSolrParams API instead of SolrQuery, but we still get
varargs issues.

thankfully Ruby solves this relatively nicely...

solr = EmbeddedSolrServer.new(container, "core1")
query = ModifiableSolrParams.new
def query.abcd(key, values)
add(key,(values.is_a?(Array) ? values : [values]).to_java(:string))
end
query.abcd('q','*:*')
query.abcd('facet.field',['cat'])
response = solr.query(query)

We'll just need to sprinkle a little Ruby fairy dust on some of this
clunky stuff. It's not all that bad. But the varargs one is strange
to me, but I'm sure there is some deep technical reason why that
support isn't intuitive.

Erik


On Oct 6, 2008, at 1:36 AM, Ryan McKinley wrote:

> just guessing, but try passing that as a string[] rather then just a
> string
>
> The java function takes ( string ... v ) -- in java that means you
> can pass either a string or an array, or a variable length list of
> strings. I'm guessing that does something funny with jruby
>
> ryan
>
>
> On Oct 5, 2008, at 10:54 PM, Matt Mitchell wrote:
>
>> I've been messing around with jRuby and SolrJ with nice results.
>> But can't
>> seem to get the SolrQuery.addFacetField method to work. I get this
>> error:
>>
>> "for method addFacetField expected [[Ljava.lang.String;]; got:
>> [java.lang.String]; error: argument type mismatch (TypeError)"
>>
>> I'm using it like:
>>
>> query.add_facet_field 'cat'
>>
>> and also tried:
>>
>> query.addFacetField 'cat'
>>
>> Any ideas as to what I'm doing wrong?
>>
>> Matt
>>
>> p.s. The other methods I've tried work great: set_query,
>> set_query_type,
>> set_facet, set_facet_limit, set_facet_min_count, set_include_score,
>> add_sort_field.
Re: jruby and solrj [ In reply to ]
Awesome, thanks Erik! I really like the idea of bypassing SolrQuery, and
just using a straight up Hash. It'll be even easier to keep the API
consistent between jruby and standard ruby now.


On Mon, Oct 6, 2008 at 3:59 PM, Erik Hatcher <erik@ehatchersolutions.com>wrote:

> Unfortunately, to call varargs from JRuby (so I just learned from irc's
> #jruby), you have to do this:
>
> query.add_facet_field(['cat'].to_java :string)
>
> anyway, for our solr-jruby purposes, i think we can stick to using the
> ModifiableSolrParams API instead of SolrQuery, but we still get varargs
> issues.
>
> thankfully Ruby solves this relatively nicely...
>
> solr = EmbeddedSolrServer.new(container, "core1")
> query = ModifiableSolrParams.new
> def query.abcd(key, values)
> add(key,(values.is_a?(Array) ? values : [values]).to_java(:string))
> end
> query.abcd('q','*:*')
> query.abcd('facet.field',['cat'])
> response = solr.query(query)
>
> We'll just need to sprinkle a little Ruby fairy dust on some of this clunky
> stuff. It's not all that bad. But the varargs one is strange to me, but
> I'm sure there is some deep technical reason why that support isn't
> intuitive.
>
> Erik
>
>
>
> On Oct 6, 2008, at 1:36 AM, Ryan McKinley wrote:
>
> just guessing, but try passing that as a string[] rather then just a
>> string
>>
>> The java function takes ( string ... v ) -- in java that means you can
>> pass either a string or an array, or a variable length list of strings. I'm
>> guessing that does something funny with jruby
>>
>> ryan
>>
>>
>> On Oct 5, 2008, at 10:54 PM, Matt Mitchell wrote:
>>
>> I've been messing around with jRuby and SolrJ with nice results. But
>>> can't
>>> seem to get the SolrQuery.addFacetField method to work. I get this error:
>>>
>>> "for method addFacetField expected [[Ljava.lang.String;]; got:
>>> [java.lang.String]; error: argument type mismatch (TypeError)"
>>>
>>> I'm using it like:
>>>
>>> query.add_facet_field 'cat'
>>>
>>> and also tried:
>>>
>>> query.addFacetField 'cat'
>>>
>>> Any ideas as to what I'm doing wrong?
>>>
>>> Matt
>>>
>>> p.s. The other methods I've tried work great: set_query, set_query_type,
>>> set_facet, set_facet_limit, set_facet_min_count, set_include_score,
>>> add_sort_field.
>>>
>>
>
Re: jruby and solrj [ In reply to ]
On Oct 6, 2008, at 4:19 PM, Matt Mitchell wrote:
> Awesome, thanks Erik! I really like the idea of bypassing SolrQuery,
> and
> just using a straight up Hash. It'll be even easier to keep the API
> consistent between jruby and standard ruby now.

Here's a cute trick:

query = {'qt' => 'standard', 'q'=>'*:*', 'facet.field' => 'cat'}
response = solr.query(MapSolrParams.new(query))

But that doesn't work, as-is, with an array for the facet.field
parameter, nor does it work for symbols, so this doesn't work for two
reasons:

solr.query(MapSolrParams.new(
:qt => 'standard', :q=>'*:*', 'facet.field' => ['cat']
)

Getting warmer! :)

Erik
Re: jruby and solrj [ In reply to ]
I've created a simple bare minimum server.rb that - similar to SolrJ's
SolrServer abstraction in (currently mostly empty) methods.

And in test/ I've checked in a JRuby example showing the difference
between going through a pure Ruby API and the SolrJ API. You can run
it this way from the root of the solr-ruby-refactoring branch:

jruby -Ilib test/temp.rb

I think the goal is to achieve something like this being equivalent
for both MRI and SolrJ-Ruby, regardless of the solr object type:

response = eval(solr.request(:qt => 'standard', :q => '*:*',
'facet.field' => ['cat'], :wt=>'ruby'))
puts response['response']['numFound']

Not quite sure where the eval belongs, so I left it out of
Solr::Server for now. We want to be able to support raw responses
through solr-ruby also, for use cases like letting Solr's JSON
response pass through a Ruby application server (or perhaps even to
use JSON within solr-ruby, if it parses faster).

Shouldn't be too hard to get there from here, eh Matt?

Erik