Re: [hibernate-dev] [infinispan-dev] [HSearch] DSL for Lucene queries (was: Re: Query module new API and configurations)

2009-09-25 Thread Navin Surtani
Just wanted to get this topic re-started again.


Essentially what I think this project/DSL/module/thingy-bob is thought  
to become: -

A simple package where a user can build Lucene queries without having  
to know too much about Lucene itself. If I'm headed down the wrong  
thought path then just thwack me.



On 26 Aug 2009, at 21:08, Hardy Ferentschik wrote:

 On Wed, 2009-08-26 at 13:39 +0200, Emmanuel Bernard wrote:
 I've been thinking about a DSL to build Lucene queries in the last
 day.
 What do you think of this proposal?

 What do you really gain compared to native Lucene queries?

What's gained I believe is the fact that people can build complex  
lucene queries easier. Currently, it's a bit clunky imo so if we  
provide a cleaner way to build them it can prove beneficial to any  
lucene user (myself included for querying on Infinispan).

Any other thoughts?


 If your API achieves exactly the same as what's possible with Lucene
 it is just a 'useless' wrapper.

 A wrapper around native Lucene queries would make sense if it could
 somehow use some of the Hibernate Search specific meta data. As an
 extreme example one could generate some meta classes a la JPA2. This  
 way
 one could ensure that you can get help with which field names are
 available.

 --Hardy

 ___
 infinispan-dev mailing list
 infinispan-...@lists.jboss.org
 https://lists.jboss.org/mailman/listinfo/infinispan-dev

Navin Surtani

Intern Infinispan
Intern JBoss Cache Searchable

___
hibernate-dev mailing list
hibernate-dev@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/hibernate-dev


Re: [hibernate-dev] [infinispan-dev] [HSearch] DSL for Lucene queries (was: Re: Query module new API and configurations)

2009-09-03 Thread Emmanuel Bernard

On 28 août 09, at 07:54, Sanne Grinovero wrote:

 Sure I like it! I'm in the swamp of old mails, so I give you my first
 impression only:
 Even if it's fluent it's not (yet) intuitive to me which methods I  
 should call;

 Query luceneQuery =
 qb.must(Occurs.MUST)
.add(
qb.boolean(Occurs.Should)
.add( qb.term(city,  
 Atlanta).boostedTo(4).createQuery() )
.add( qb.term(address1,  
 Peachtree).fuzzy().createQuery() )
)
.add(
qb.from(movingDate,  
 200604).to(201201).exclusive().createQuery()
)
.createQuery();

 I guess there is a typo? As must(MUST) is a bit confusing to me.

yep typo.

 why not

 qb.booleanQuery()
   .Must( qb.otherQuery(...).. )
   .Should( qb.secondQuery(..).. )
   .build();

good idea,

.must()
   .add( qb.from().to() )
   .add( ... )
.must().not()
.should()


 and
 qb.termQuery(city, Atlanta).boostedTo(4).createQuery())
 or even overloading
 qb.termQuery(city, Atlanta).createQuery())
 with
 qb.termQuery(city, Atlanta, 4f).createQuery())
 is not as readable as boostedTo method but more immediate;
 intelligent IDEs should propose the options to devs while typing, even
 guessing the parameter name and making it's meaning self-evident.

No I find it hard and confusing even in IntelliJ IDEA to use  
overloaded methods and a set of parameters.
The idea behing boostedTo() is to mimick named parameters.

Actually ideally we would want  term().on(city).matches(Atlanta),  
WDYT?
Or even qb.on(city).matches(atlanta)

which could also be used to unify range queries and multi term queries
qb.on(date).from(2009).to(2010)
qb.on(a).on(b).matches(word)



 qb.rangeQuery could be either
   rangeQuery(field, fromX, toY)
 or
   rangeQuery(field).from(x).to(y)
 so why are you choosing (field,from).to(to) ?

I think
range(field).from(x).to(y)
or
on(field).from(x).to(y)
are better, I've move to range and if we decide on is better, I will  
move.


 Thinking about the RangeQuery on dates, it would be cool to accept any
 type for which we have Bridges, like accepting Date type or even a
 user-defined FieldBridge together with an Object.

That would be cool but realistically we need to accept Object unless  
somehow we can convey the expected type(s) of a field bridge using  
generics or something. SOmebody has an idea on how the API would look  
like?
probably something like
T on(String field, ClassT) ...

on(field, Date.class).from(new Date()).


 I like the Analyzer choices, it would be very cool if we could by
 default guess the correct one from the searched-for entity types.

Define guessing. Guessing the targeted entity? How?


 We could even consider a Query-By-Example query builder, reading
 indexed fields from an instance of an indexed type, or something like
 HSEARCH-119 proposal (for termvectors similatory).


+1 but let's start (not so) modest :)


 cheers,
 Sanne

 2009/8/28 Emmanuel Bernard emman...@hibernate.org:
 Hey Sanne,
 What do you think of the PAI proposal itself?
 Like it? See improvements?

 On 28 août 09, at 10:37, Sanne Grinovero wrote:

 I've nothing against a separate maven module, still Hibernate Search
 already has lots of goodies to work with Lucene which are not
 necessarily linked to Hibernate (e.g. Analyzer definition helpers,
 pojo mapping through annotations, enhanced filtering, IndexReader
 pooling, nice Infinispan Directory...) so this new query builder is
 not much different. Just a thought.

 So even if Emmanuel has shown this builder to be useful even with  
 this
 limited features, it could become even more useful when strongly
 combined with the other features; 2 come to mind, may be more later:

 A) adding filters to the builders; I don't think it would be easy to
 have named filters without the full Search package

 B) Letting the users forget about the Analyzer matches complexity
 (optionally), as by using the mapping information we could default  
 to
 a reasonable Analyzer for each field. Most users on the forum are in
 trouble because they select the wrong analyzer/ forget to use one  
 when
 building the F.T.Query.

 IMHO these are good reasons to couple it to the rest of the code;
 Maybe it would be possible in future to have Hibernate optional.

 Sanne


 2009/8/27 Manik Surtani ma...@jboss.org:

 On 27 Aug 2009, at 16:10, Emmanuel Bernard wrote:


 queryBuilder.withAnalyzer(Analyzer)
 queryBuilder.withEntityAnalyzer(Class?)
 queryBuilder.basedOnEntityAnalyzer(Class?)
.overridesForField(String field, Analyzer)
.overridesForField(String field, Analyzer)
.build() //sucky name

 Perhaps rename the static factory methods to something like:
 QueryBuilder.getQueryBuilder(Analyzer)
 QueryBuilder.getQueryBuilder(Class?)
 and QueryBuilder instances have overrideAnalyzerForField(String,
 Analyzer).
  Why do you need the build() method at the end?

 if you do that, all of the sudden, a QB can change it's analyzer  
 on the
 fly
 making it immutable.
 

Re: [hibernate-dev] [infinispan-dev] [HSearch] DSL for Lucene queries (was: Re: Query module new API and configurations)

2009-09-03 Thread Sanne Grinovero
answers and ideas inline:

2009/9/3 Emmanuel Bernard emman...@hibernate.org:

 On 28 août 09, at 07:54, Sanne Grinovero wrote:

 Sure I like it! I'm in the swamp of old mails, so I give you my first
 impression only:
 Even if it's fluent it's not (yet) intuitive to me which methods I should
 call;

 Query luceneQuery =
 qb.must(Occurs.MUST)
   .add(
       qb.boolean(Occurs.Should)
           .add( qb.term(city, Atlanta).boostedTo(4).createQuery() )
           .add( qb.term(address1, Peachtree).fuzzy().createQuery() )
   )
   .add(
       qb.from(movingDate,
 200604).to(201201).exclusive().createQuery()
   )
   .createQuery();

 I guess there is a typo? As must(MUST) is a bit confusing to me.

 yep typo.

 why not

 qb.booleanQuery()
  .Must( qb.otherQuery(...).. )
  .Should( qb.secondQuery(..).. )
  .build();

 good idea,

 .must()
  .add( qb.from().to() )
  .add( ... )
 .must().not()
 .should()


 and
 qb.termQuery(city, Atlanta).boostedTo(4).createQuery())
 or even overloading
 qb.termQuery(city, Atlanta).createQuery())
 with
 qb.termQuery(city, Atlanta, 4f).createQuery())
 is not as readable as boostedTo method but more immediate;
 intelligent IDEs should propose the options to devs while typing, even
 guessing the parameter name and making it's meaning self-evident.

 No I find it hard and confusing even in IntelliJ IDEA to use overloaded
 methods and a set of parameters.
 The idea behing boostedTo() is to mimick named parameters.

 Actually ideally we would want  term().on(city).matches(Atlanta), WDYT?
 Or even qb.on(city).matches(atlanta)

yes much better


 which could also be used to unify range queries and multi term queries
 qb.on(date).from(2009).to(2010)

nice

 qb.on(a).on(b).matches(word)

this is not really fluent, I only understand what you mean because of
your comment



 qb.rangeQuery could be either
  rangeQuery(field, fromX, toY)
 or
  rangeQuery(field).from(x).to(y)
 so why are you choosing (field,from).to(to) ?

 I think
 range(field).from(x).to(y)
 or
 on(field).from(x).to(y)
 are better, I've move to range and if we decide on is better, I will move.

I agree with your choice


 Thinking about the RangeQuery on dates, it would be cool to accept any
 type for which we have Bridges, like accepting Date type or even a
 user-defined FieldBridge together with an Object.

 That would be cool but realistically we need to accept Object unless somehow
 we can convey the expected type(s) of a field bridge using generics or
 something. SOmebody has an idea on how the API would look like?
 probably something like
 T on(String field, ClassT) ...

 on(field, Date.class).from(new Date()).

I didn't mean that the method signature should be aware of the type,
Object is fine;
from( Object lowerBoundary ); //automatically finds out the
StringBridge from the BridgeFactory
from( Object lowerBoundary, StringBridge ); //overrides ths
StringBridge selection

Even better making StringBridge generic we get typesafety:
T void from(T lowerBoundary, StringBridgeT bridge)



 I like the Analyzer choices, it would be very cool if we could by
 default guess the correct one from the searched-for entity types.

 Define guessing. Guessing the targeted entity? How?

Ha right; I was assuming you were going to select the targeted entity, like
with Criteria?



 We could even consider a Query-By-Example query builder, reading
 indexed fields from an instance of an indexed type, or something like
 HSEARCH-119 proposal (for termvectors similatory).


 +1 but let's start (not so) modest :)


 cheers,
 Sanne

 2009/8/28 Emmanuel Bernard emman...@hibernate.org:

 Hey Sanne,
 What do you think of the PAI proposal itself?
 Like it? See improvements?

 On 28 août 09, at 10:37, Sanne Grinovero wrote:

 I've nothing against a separate maven module, still Hibernate Search
 already has lots of goodies to work with Lucene which are not
 necessarily linked to Hibernate (e.g. Analyzer definition helpers,
 pojo mapping through annotations, enhanced filtering, IndexReader
 pooling, nice Infinispan Directory...) so this new query builder is
 not much different. Just a thought.

 So even if Emmanuel has shown this builder to be useful even with this
 limited features, it could become even more useful when strongly
 combined with the other features; 2 come to mind, may be more later:

 A) adding filters to the builders; I don't think it would be easy to
 have named filters without the full Search package

 B) Letting the users forget about the Analyzer matches complexity
 (optionally), as by using the mapping information we could default to
 a reasonable Analyzer for each field. Most users on the forum are in
 trouble because they select the wrong analyzer/ forget to use one when
 building the F.T.Query.

 IMHO these are good reasons to couple it to the rest of the code;
 Maybe it would be possible in future to have Hibernate optional.

 Sanne


 2009/8/27 Manik Surtani ma...@jboss.org:

 On 27 Aug 2009, at 16:10, Emmanuel Bernard wrote:



Re: [hibernate-dev] [infinispan-dev] [HSearch] DSL for Lucene queries (was: Re: Query module new API and configurations)

2009-09-03 Thread Emmanuel Bernard
I don't see how people would nicely have access to the right bridge  
implementation

On 3 sept. 09, at 17:30, Sanne Grinovero wrote:


 That would be cool but realistically we need to accept Object  
 unless somehow
 we can convey the expected type(s) of a field bridge using  
 generics or
 something. SOmebody has an idea on how the API would look like?
 probably something like
 T on(String field, ClassT) ...

 on(field, Date.class).from(new Date()).

 I didn't mean that the method signature should be aware of the type,
 Object is fine;
 from( Object lowerBoundary ); //automatically finds out the
 StringBridge from the BridgeFactory
 from( Object lowerBoundary, StringBridge ); //overrides ths
 StringBridge selection

 Even better making StringBridge generic we get typesafety:
 T void from(T lowerBoundary, StringBridgeT bridge)

___
hibernate-dev mailing list
hibernate-dev@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/hibernate-dev


Re: [hibernate-dev] [infinispan-dev] [HSearch] DSL for Lucene queries (was: Re: Query module new API and configurations)

2009-08-28 Thread Sanne Grinovero
I've nothing against a separate maven module, still Hibernate Search
already has lots of goodies to work with Lucene which are not
necessarily linked to Hibernate (e.g. Analyzer definition helpers,
pojo mapping through annotations, enhanced filtering, IndexReader
pooling, nice Infinispan Directory...) so this new query builder is
not much different. Just a thought.

So even if Emmanuel has shown this builder to be useful even with this
limited features, it could become even more useful when strongly
combined with the other features; 2 come to mind, may be more later:

A) adding filters to the builders; I don't think it would be easy to
have named filters without the full Search package

B) Letting the users forget about the Analyzer matches complexity
(optionally), as by using the mapping information we could default to
a reasonable Analyzer for each field. Most users on the forum are in
trouble because they select the wrong analyzer/ forget to use one when
building the F.T.Query.

IMHO these are good reasons to couple it to the rest of the code;
Maybe it would be possible in future to have Hibernate optional.

Sanne


2009/8/27 Manik Surtani ma...@jboss.org:

 On 27 Aug 2009, at 16:10, Emmanuel Bernard wrote:


 queryBuilder.withAnalyzer(Analyzer)
 queryBuilder.withEntityAnalyzer(Class?)
 queryBuilder.basedOnEntityAnalyzer(Class?)
                     .overridesForField(String field, Analyzer)
                     .overridesForField(String field, Analyzer)
                     .build() //sucky name

 Perhaps rename the static factory methods to something like:
 QueryBuilder.getQueryBuilder(Analyzer)
 QueryBuilder.getQueryBuilder(Class?)
 and QueryBuilder instances have overrideAnalyzerForField(String, Analyzer).
  Why do you need the build() method at the end?

 if you do that, all of the sudden, a QB can change it's analyzer on the fly
 making it immutable.
 Also the overridesForField methods would pollute the API when it's time to
 create a query.
 One of the advantages of a fluent API in a strongly typed environment is
 that we can hide methods that are meaningless in a given context.

 That been said, if the API ends up being pure Lucene and once we stabilize
 it, we can contribute it back even though I am not necessarily a huge fan of
 ASL.

 Not it doesn't have to be either ASL or even hosted at Apache.  I guess what
 I am suggesting is perhaps even a separate project - LuceneQueryBuilder or
 something  - which plain-old-Lucene users could use as well.  Doesn't matter
 where it's hosted or what the license is - as long as its ASL or LGPL :)

 Let's start it under the Hibernate Search umbrella due to potential
 synergies and spin it out if needed.

 Ok.  Just make sure we use a different maven module or something so that
 there are no dependencies on the rest of HS or Hibernate.  Otherwise
 spinning out will be a PITA.  Lucene should be the only dependencies of this
 code.
 Cheers
 --
 Manik Surtani
 ma...@jboss.org
 Lead, Infinispan
 Lead, JBoss Cache
 http://www.infinispan.org
 http://www.jbosscache.org




 ___
 infinispan-dev mailing list
 infinispan-...@lists.jboss.org
 https://lists.jboss.org/mailman/listinfo/infinispan-dev


___
hibernate-dev mailing list
hibernate-dev@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/hibernate-dev


Re: [hibernate-dev] [infinispan-dev] [HSearch] DSL for Lucene queries (was: Re: Query module new API and configurations)

2009-08-28 Thread Sanne Grinovero
Sure I like it! I'm in the swamp of old mails, so I give you my first
impression only:
Even if it's fluent it's not (yet) intuitive to me which methods I should call;

Query luceneQuery =
qb.must(Occurs.MUST)
.add(
qb.boolean(Occurs.Should)
.add( qb.term(city, Atlanta).boostedTo(4).createQuery() )
.add( qb.term(address1, Peachtree).fuzzy().createQuery() )
)
.add(
qb.from(movingDate, 200604).to(201201).exclusive().createQuery()
)
.createQuery();

I guess there is a typo? As must(MUST) is a bit confusing to me.
why not

qb.booleanQuery()
   .Must( qb.otherQuery(...).. )
   .Should( qb.secondQuery(..).. )
   .build();

and
qb.termQuery(city, Atlanta).boostedTo(4).createQuery())
or even overloading
qb.termQuery(city, Atlanta).createQuery())
with
qb.termQuery(city, Atlanta, 4f).createQuery())
is not as readable as boostedTo method but more immediate;
intelligent IDEs should propose the options to devs while typing, even
guessing the parameter name and making it's meaning self-evident.

qb.rangeQuery could be either
   rangeQuery(field, fromX, toY)
or
   rangeQuery(field).from(x).to(y)
so why are you choosing (field,from).to(to) ?

Thinking about the RangeQuery on dates, it would be cool to accept any
type for which we have Bridges, like accepting Date type or even a
user-defined FieldBridge together with an Object.

I like the Analyzer choices, it would be very cool if we could by
default guess the correct one from the searched-for entity types.

We could even consider a Query-By-Example query builder, reading
indexed fields from an instance of an indexed type, or something like
HSEARCH-119 proposal (for termvectors similatory).

cheers,
Sanne

2009/8/28 Emmanuel Bernard emman...@hibernate.org:
 Hey Sanne,
 What do you think of the PAI proposal itself?
 Like it? See improvements?

 On 28 août 09, at 10:37, Sanne Grinovero wrote:

 I've nothing against a separate maven module, still Hibernate Search
 already has lots of goodies to work with Lucene which are not
 necessarily linked to Hibernate (e.g. Analyzer definition helpers,
 pojo mapping through annotations, enhanced filtering, IndexReader
 pooling, nice Infinispan Directory...) so this new query builder is
 not much different. Just a thought.

 So even if Emmanuel has shown this builder to be useful even with this
 limited features, it could become even more useful when strongly
 combined with the other features; 2 come to mind, may be more later:

 A) adding filters to the builders; I don't think it would be easy to
 have named filters without the full Search package

 B) Letting the users forget about the Analyzer matches complexity
 (optionally), as by using the mapping information we could default to
 a reasonable Analyzer for each field. Most users on the forum are in
 trouble because they select the wrong analyzer/ forget to use one when
 building the F.T.Query.

 IMHO these are good reasons to couple it to the rest of the code;
 Maybe it would be possible in future to have Hibernate optional.

 Sanne


 2009/8/27 Manik Surtani ma...@jboss.org:

 On 27 Aug 2009, at 16:10, Emmanuel Bernard wrote:


 queryBuilder.withAnalyzer(Analyzer)
 queryBuilder.withEntityAnalyzer(Class?)
 queryBuilder.basedOnEntityAnalyzer(Class?)
                    .overridesForField(String field, Analyzer)
                    .overridesForField(String field, Analyzer)
                    .build() //sucky name

 Perhaps rename the static factory methods to something like:
 QueryBuilder.getQueryBuilder(Analyzer)
 QueryBuilder.getQueryBuilder(Class?)
 and QueryBuilder instances have overrideAnalyzerForField(String,
 Analyzer).
  Why do you need the build() method at the end?

 if you do that, all of the sudden, a QB can change it's analyzer on the
 fly
 making it immutable.
 Also the overridesForField methods would pollute the API when it's time
 to
 create a query.
 One of the advantages of a fluent API in a strongly typed environment is
 that we can hide methods that are meaningless in a given context.

 That been said, if the API ends up being pure Lucene and once we
 stabilize
 it, we can contribute it back even though I am not necessarily a huge fan
 of
 ASL.

 Not it doesn't have to be either ASL or even hosted at Apache.  I guess
 what
 I am suggesting is perhaps even a separate project - LuceneQueryBuilder
 or
 something  - which plain-old-Lucene users could use as well.  Doesn't
 matter
 where it's hosted or what the license is - as long as its ASL or LGPL :)

 Let's start it under the Hibernate Search umbrella due to potential
 synergies and spin it out if needed.

 Ok.  Just make sure we use a different maven module or something so that
 there are no dependencies on the rest of HS or Hibernate.  Otherwise
 spinning out will be a PITA.  Lucene should be the only dependencies of
 this
 code.
 Cheers
 --
 Manik Surtani
 ma...@jboss.org
 Lead, Infinispan
 Lead, JBoss Cache
 http://www.infinispan.org
 

Re: [hibernate-dev] [infinispan-dev] [HSearch] DSL for Lucene queries (was: Re: Query module new API and configurations)

2009-08-27 Thread Manik Surtani
Very elegant.  I'm generally a big fan of 'builder' patterns like  
this, but this really isn't a DSL, is it?  :)  When you first  
mentioned a DSL I had visions of defining a new grammar and an ANTLR  
parser, etc.  But that is overkill.


This approach certainly works, and will almost certainly perform  
better too.  One question: for the sake of brevity, why  
SealedQueryBuilder instead of QueryBuilder ?  :)


Also, I still think that if this is a generic helper factory that  
helps you build Lucene queries - and has no knowledge of how and where  
the query is used (why should it?) - then this should be something  
people can use outside of HS or Infinispan.  E.g., directly with Lucene.



On 26 Aug 2009, at 12:39, Emmanuel Bernard wrote:

I've been thinking about a DSL to build Lucene queries in the last  
day.

What do you think of this proposal?

A few remarks:
 - it asks the analyzer so that we correctly apply the analyzer on  
terms

 - it has a few query factory methods
 - it contains a few orthogonal operations
 - I am not quite satisfied with how boolean is handled, any idea?



Examples


SealedQueryBuilder qb =  
searchFactory.withEntityAnalyzer(Address.class);



Query luceneQuery =
qb.must(Occurs.MUST)
.add(
qb.boolean(Occurs.Should)
.add( qb.term(city,  
Atlanta).boostedTo(4).createQuery() )
.add( qb.term(address1,  
Peachtree).fuzzy().createQuery() )

)
.add(
qb.from(movingDate,  
200604).to(201201).exclusive().createQuery()

)
.createQuery();



Analyzer choice
queryBuilder.withAnalyzer(Analyzer)
queryBuilder.withEntityAnalyzer(Class?)
queryBuilder.basedOnEntityAnalyzer(Class?)
.overridesForField(String field, Analyzer)
.overridesForField(String field, Analyzer)
.build() //sucky name
returns a SealedQueryBuilder //sucky name


SealedQueryBuilder contains the factory methods




Factory methods
Hosted onSealedQueryBuilder


.term(String field, String text) //define a new query
.term(String field, String text) //define a new query
   .ignoreAnalyzer() //ignore the analyzer, optional
   .fuzzy() //API prevent wildcard calls, optional
 .threshold() //optional
 .prefixLengh() //optional
.term(String field, String value)
   .wildcard() //API prevent fuzzy calls, optional


//range query
.from(String field, String text)
   .exclusive() //optional
.to(String text)
   .exclusive() //optional
.constantScore() //optional, due to constantScoreRangeQuery but  
in practice inherited from the common operations



//match all docs
.all()


//phrase query
.phrase(String field)
.ignoreAnalyzer() //ignore the analyzer, optional
.addWord(String text) //at least one
.addWord(String text)
.sentence(String text) //do we need that?
.slop() //optional


//search multiple fields for same value
.searchInMultipleFields()
  .onField(String field)
  .boostedTo(float) //optional
  .ignoreAnalyzer() //optional
  .onField(String field)
  .forWords(String) //do we need that?
  .forWord(String)




Boolean operations
SealedQueryBuilder contains the boolean methods


.boolean(Occurs occurs)

  .add( qb.from().to() )
  .add( ... )




Works on all queries
.boostedTo()
.constantScore()
.filter(Filter) //filter the current query
.scoreMultipliedByField(field) //FieldScoreQuery +  
FunctionQuery?? //Not backed

.createQuery()




Todo
Span*Queries

MultiPhraseQuery - needs to fillup all accepted terms
FieldScoreQuery
ValueSourceQuery
FuzzyLikeThis
MoreLikeThis


On 25 août 09, at 16:43, Manik Surtani wrote:



On 25 Aug 2009, at 13:34, Emmanuel Bernard wrote:



On 25 août 09, at 14:27, Manik Surtani wrote:


A DSL would work, but I'd rather not define our own language here.
Which is why I asked for a standard.  Perhaps something based on  
SQL/

JPA-QL?  Or are you thinking  DSL specific to Lucene - which could
be used by any/all of {Lucene, Hibernate Search, Infinispan}?  In
which case the DSL should ideally be a Lucene project.


Yes I was thinking about a DSL used for Hibernate Search and maybe  
all

of Lucene if the HS integration benefits offer no value towards
simplicity (but I think i can offer value).



Ok, this should be interesting.  Lets chat about this some more -  
have

you drafted any thoughts around this DSL somewhere?




___
infinispan-dev mailing list
infinispan-...@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/infinispan-dev


--
Manik Surtani
ma...@jboss.org
Lead, Infinispan
Lead, JBoss Cache
http://www.infinispan.org
http://www.jbosscache.org




___
hibernate-dev mailing list
hibernate-dev@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/hibernate-dev


Re: [hibernate-dev] [infinispan-dev] [HSearch] DSL for Lucene queries (was: Re: Query module new API and configurations)

2009-08-27 Thread Manik Surtani


On 27 Aug 2009, at 13:06, Emmanuel Bernard wrote:



On 27 août 09, at 13:07, Manik Surtani wrote:

Very elegant.  I'm generally a big fan of 'builder' patterns like  
this, but this really isn't a DSL, is it?  :)  When you first  
mentioned a DSL I had visions of defining a new grammar and an  
ANTLR parser, etc.  But that is overkill.


This is called an internal DSL, ie you use Java as the language, not  
some external representation.




This approach certainly works, and will almost certainly perform  
better too.  One question: for the sake of brevity, why  
SealedQueryBuilder instead of QueryBuilder ?  :)


The name is not right yet

There are two things:
- the query builder that lets you define the analyzer
- the query builder that has an analyzer assigned and lets you build  
query

What name is best for each of them.


I thought this stuff you mentioned made sense:


queryBuilder.withAnalyzer(Analyzer)
queryBuilder.withEntityAnalyzer(Class?)
queryBuilder.basedOnEntityAnalyzer(Class?)
.overridesForField(String field, Analyzer)
.overridesForField(String field, Analyzer)
.build() //sucky name


Perhaps rename the static factory methods to something like:

QueryBuilder.getQueryBuilder(Analyzer)
QueryBuilder.getQueryBuilder(Class?)

and QueryBuilder instances have overrideAnalyzerForField(String,  
Analyzer).  Why do you need the build() method at the end?







Also, I still think that if this is a generic helper factory that  
helps you build Lucene queries - and has no knowledge of how and  
where the query is used (why should it?) - then this should be  
something people can use outside of HS or Infinispan.  E.g.,  
directly with Lucene.


As of today this code is technically pure Lucene but to be honest  
the idea of passing an analyzer multiplexer (like the one we receive  
from searchFactory.getAnalyzerClass?)) is not wildly spread in  
Lucene and potentially cumbersome wo the declarative approach of  
HSearch.


The second problem is that some potential improvements will require  
inner knowledge of HSearch:
- object parameters (and not string params) do require to know the  
FieldBridge of the property. This is a pure HSearch notion.
- property literal like JPA is introducing could be added to  
replace the String-based field approach in some situations. Though I  
don't think that it would be a perfect fit.

- spell checker (the old idea we had)

That been said, if the API ends up being pure Lucene and once we  
stabilize it, we can contribute it back even though I am not  
necessarily a huge fan of ASL.


Not it doesn't have to be either ASL or even hosted at Apache.  I  
guess what I am suggesting is perhaps even a separate project -  
LuceneQueryBuilder or something  - which plain-old-Lucene users could  
use as well.  Doesn't matter where it's hosted or what the license is  
- as long as its ASL or LGPL :)


--
Manik Surtani
ma...@jboss.org
Lead, Infinispan
Lead, JBoss Cache
http://www.infinispan.org
http://www.jbosscache.org




___
hibernate-dev mailing list
hibernate-dev@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/hibernate-dev


Re: [hibernate-dev] [infinispan-dev] [HSearch] DSL for Lucene queries (was: Re: Query module new API and configurations)

2009-08-27 Thread Emmanuel Bernard





queryBuilder.withAnalyzer(Analyzer)
queryBuilder.withEntityAnalyzer(Class?)
queryBuilder.basedOnEntityAnalyzer(Class?)
.overridesForField(String field, Analyzer)
.overridesForField(String field, Analyzer)
.build() //sucky name


Perhaps rename the static factory methods to something like:

QueryBuilder.getQueryBuilder(Analyzer)
QueryBuilder.getQueryBuilder(Class?)

and QueryBuilder instances have overrideAnalyzerForField(String,  
Analyzer).  Why do you need the build() method at the end?


if you do that, all of the sudden, a QB can change it's analyzer on  
the fly making it immutable.
Also the overridesForField methods would pollute the API when it's  
time to create a query.


One of the advantages of a fluent API in a strongly typed environment  
is that we can hide methods that are meaningless in a given context.




That been said, if the API ends up being pure Lucene and once we  
stabilize it, we can contribute it back even though I am not  
necessarily a huge fan of ASL.


Not it doesn't have to be either ASL or even hosted at Apache.  I  
guess what I am suggesting is perhaps even a separate project -  
LuceneQueryBuilder or something  - which plain-old-Lucene users  
could use as well.  Doesn't matter where it's hosted or what the  
license is - as long as its ASL or LGPL :)


Let's start it under the Hibernate Search umbrella due to potential  
synergies and spin it out if needed.___
hibernate-dev mailing list
hibernate-dev@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/hibernate-dev


Re: [hibernate-dev] [infinispan-dev] [HSearch] DSL for Lucene queries (was: Re: Query module new API and configurations)

2009-08-27 Thread Manik Surtani


On 27 Aug 2009, at 16:10, Emmanuel Bernard wrote:






queryBuilder.withAnalyzer(Analyzer)
queryBuilder.withEntityAnalyzer(Class?)
queryBuilder.basedOnEntityAnalyzer(Class?)
.overridesForField(String field, Analyzer)
.overridesForField(String field, Analyzer)
.build() //sucky name


Perhaps rename the static factory methods to something like:

QueryBuilder.getQueryBuilder(Analyzer)
QueryBuilder.getQueryBuilder(Class?)

and QueryBuilder instances have overrideAnalyzerForField(String,  
Analyzer).  Why do you need the build() method at the end?


if you do that, all of the sudden, a QB can change it's analyzer on  
the fly making it immutable.
Also the overridesForField methods would pollute the API when it's  
time to create a query.


One of the advantages of a fluent API in a strongly typed  
environment is that we can hide methods that are meaningless in a  
given context.




That been said, if the API ends up being pure Lucene and once we  
stabilize it, we can contribute it back even though I am not  
necessarily a huge fan of ASL.


Not it doesn't have to be either ASL or even hosted at Apache.  I  
guess what I am suggesting is perhaps even a separate project -  
LuceneQueryBuilder or something  - which plain-old-Lucene users  
could use as well.  Doesn't matter where it's hosted or what the  
license is - as long as its ASL or LGPL :)


Let's start it under the Hibernate Search umbrella due to potential  
synergies and spin it out if needed.


Ok.  Just make sure we use a different maven module or something so  
that there are no dependencies on the rest of HS or Hibernate.   
Otherwise spinning out will be a PITA.  Lucene should be the only  
dependencies of this code.


Cheers
--
Manik Surtani
ma...@jboss.org
Lead, Infinispan
Lead, JBoss Cache
http://www.infinispan.org
http://www.jbosscache.org




___
hibernate-dev mailing list
hibernate-dev@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/hibernate-dev