Hibernate SVN: r19178 - in search/trunk/hibernate-search/src/main/java/org/hibernate/search: batchindexing and 1 other directories.
by hibernate-commits@lists.jboss.org
Author: sannegrinovero
Date: 2010-04-06 14:29:09 -0400 (Tue, 06 Apr 2010)
New Revision: 19178
Modified:
search/trunk/hibernate-search/src/main/java/org/hibernate/search/MassIndexer.java
search/trunk/hibernate-search/src/main/java/org/hibernate/search/batchindexing/BatchCoordinator.java
search/trunk/hibernate-search/src/main/java/org/hibernate/search/batchindexing/BatchIndexingWorkspace.java
search/trunk/hibernate-search/src/main/java/org/hibernate/search/batchindexing/IdentifierProducer.java
search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MassIndexerImpl.java
Log:
HSEARCH-495 IdentifierProducer: ClassCastException
Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/MassIndexer.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/MassIndexer.java 2010-04-06 18:17:40 UTC (rev 19177)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/MassIndexer.java 2010-04-06 18:29:09 UTC (rev 19178)
@@ -115,7 +115,7 @@
* @param maximum
* @return
*/
- MassIndexer limitIndexedObjectsTo(int maximum);
+ MassIndexer limitIndexedObjectsTo(long maximum);
/**
* Starts the indexing process in background (asynchronous).
Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/batchindexing/BatchCoordinator.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/batchindexing/BatchCoordinator.java 2010-04-06 18:17:40 UTC (rev 19177)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/batchindexing/BatchCoordinator.java 2010-04-06 18:29:09 UTC (rev 19178)
@@ -61,7 +61,7 @@
private final boolean optimizeAfterPurge;
private final CountDownLatch endAllSignal;
private final MassIndexerProgressMonitor monitor;
- private final int objectsLimit;
+ private final long objectsLimit;
private BatchBackend backend;
@@ -69,7 +69,7 @@
SearchFactoryImplementor searchFactoryImplementor,
SessionFactory sessionFactory, int objectLoadingThreads,
int collectionLoadingThreads, CacheMode cacheMode,
- int objectLoadingBatchSize, int objectsLimit,
+ int objectLoadingBatchSize, long objectsLimit,
boolean optimizeAtEnd,
boolean purgeAtStart, boolean optimizeAfterPurge,
MassIndexerProgressMonitor monitor) {
Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/batchindexing/BatchIndexingWorkspace.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/batchindexing/BatchIndexingWorkspace.java 2010-04-06 18:17:40 UTC (rev 19177)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/batchindexing/BatchIndexingWorkspace.java 2010-04-06 18:29:09 UTC (rev 19178)
@@ -74,7 +74,7 @@
private final BatchBackend backend;
- private final int objectsLimit;
+ private final long objectsLimit;
public BatchIndexingWorkspace(SearchFactoryImplementor searchFactoryImplementor, SessionFactory sessionFactory,
Class<?> entityType,
@@ -82,7 +82,7 @@
CacheMode cacheMode, int objectLoadingBatchSize,
CountDownLatch endAllSignal,
MassIndexerProgressMonitor monitor, BatchBackend backend,
- int objectsLimit) {
+ long objectsLimit) {
this.indexedType = entityType;
this.searchFactory = searchFactoryImplementor;
Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/batchindexing/IdentifierProducer.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/batchindexing/IdentifierProducer.java 2010-04-06 18:17:40 UTC (rev 19177)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/batchindexing/IdentifierProducer.java 2010-04-06 18:29:09 UTC (rev 19178)
@@ -60,7 +60,7 @@
private final Class<?> indexedType;
private final MassIndexerProgressMonitor monitor;
- private final int objectsLimit;
+ private final long objectsLimit;
/**
* @param fromIdentifierListToEntities the target queue where the produced identifiers are sent to
@@ -75,7 +75,7 @@
SessionFactory sessionFactory,
int objectLoadingBatchSize,
Class<?> indexedType, MassIndexerProgressMonitor monitor,
- int objectsLimit) {
+ long objectsLimit) {
this.destination = fromIdentifierListToEntities;
this.sessionFactory = sessionFactory;
this.batchSize = objectLoadingBatchSize;
@@ -111,14 +111,14 @@
}
private void loadAllIdentifiers(final StatelessSession session) throws InterruptedException {
- Long totalCount = (Long) session
+ Number countAsNumber = (Number) session
.createCriteria( indexedType )
- .setProjection( Projections.count( "id" ) )
+ .setProjection( Projections.rowCount() )
.setCacheable( false )
.uniqueResult();
-
- if ( objectsLimit != 0 && objectsLimit < totalCount.intValue() ) {
- totalCount = Long.valueOf( objectsLimit );
+ long totalCount = countAsNumber.longValue();
+ if ( objectsLimit != 0 && objectsLimit < totalCount ) {
+ totalCount = objectsLimit;
}
log.debug( "going to fetch {} primary keys", totalCount);
monitor.addToTotalCount( totalCount );
@@ -131,7 +131,7 @@
ScrollableResults results = criteria.scroll( ScrollMode.FORWARD_ONLY );
ArrayList<Serializable> destinationList = new ArrayList<Serializable>( batchSize );
- int counter = 0;
+ long counter = 0;
try {
while ( results.next() ) {
Serializable id = (Serializable) results.get( 0 );
Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MassIndexerImpl.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MassIndexerImpl.java 2010-04-06 18:17:40 UTC (rev 19177)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MassIndexerImpl.java 2010-04-06 18:29:09 UTC (rev 19178)
@@ -61,7 +61,7 @@
private int collectionLoadingThreads = 4; //also responsible for loading of lazy @IndexedEmbedded collections
// private int writerThreads = 1; //also running the Analyzers
private int objectLoadingBatchSize = 10;
- private int objectsLimit = 0; //means no limit at all
+ private long objectsLimit = 0; //means no limit at all
private CacheMode cacheMode = CacheMode.IGNORE;
private boolean optimizeAtEnd = true;
private boolean purgeAtStart = true;
@@ -193,7 +193,7 @@
monitor );
}
- public MassIndexer limitIndexedObjectsTo(int maximum) {
+ public MassIndexer limitIndexedObjectsTo(long maximum) {
this.objectsLimit = maximum;
return this;
}
15 years, 5 months
Hibernate SVN: r19177 - core/trunk/testsuite/src/test/java/org/hibernate/test/readonly.
by hibernate-commits@lists.jboss.org
Author: gbadner
Date: 2010-04-06 14:17:40 -0400 (Tue, 06 Apr 2010)
New Revision: 19177
Modified:
core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/DataPoint.hbm.xml
Log:
HHH-5076 HHH-4810 : Revert back to DataPoint.hbm.xml version that fixed HHH-4908
Modified: core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/DataPoint.hbm.xml
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/DataPoint.hbm.xml 2010-04-06 16:53:35 UTC (rev 19176)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/DataPoint.hbm.xml 2010-04-06 18:17:40 UTC (rev 19177)
@@ -13,10 +13,10 @@
<generator class="increment"/>
</id>
<property name="x">
- <column name="xval" not-null="true" precision="25" scale="20" unique-key="xy"/>
+ <column name="xval" not-null="true" precision="25" scale="19" unique-key="xy"/>
</property>
<property name="y">
- <column name="yval" not-null="true" precision="25" scale="20" unique-key="xy"/>
+ <column name="yval" not-null="true" precision="25" scale="19" unique-key="xy"/>
</property>
<property name="description"/>
</class>
15 years, 5 months
Hibernate SVN: r19176 - in core/patches/hibernate-3.3.2.GA_JBPAPP-4059: testsuite/src/test/java/org/hibernate/test/hql and 1 other directory.
by hibernate-commits@lists.jboss.org
Author: stliu
Date: 2010-04-06 12:53:35 -0400 (Tue, 06 Apr 2010)
New Revision: 19176
Modified:
core/patches/hibernate-3.3.2.GA_JBPAPP-4059/core/src/main/java/org/hibernate/hql/ast/tree/BinaryLogicOperatorNode.java
core/patches/hibernate-3.3.2.GA_JBPAPP-4059/testsuite/src/test/java/org/hibernate/test/hql/ASTParserLoadingTest.java
Log:
JBPAPP-4059 HHH-2088 TypeMismatchException on object equality expression from one-to-one relationship
Modified: core/patches/hibernate-3.3.2.GA_JBPAPP-4059/core/src/main/java/org/hibernate/hql/ast/tree/BinaryLogicOperatorNode.java
===================================================================
--- core/patches/hibernate-3.3.2.GA_JBPAPP-4059/core/src/main/java/org/hibernate/hql/ast/tree/BinaryLogicOperatorNode.java 2010-04-06 16:44:29 UTC (rev 19175)
+++ core/patches/hibernate-3.3.2.GA_JBPAPP-4059/core/src/main/java/org/hibernate/hql/ast/tree/BinaryLogicOperatorNode.java 2010-04-06 16:53:35 UTC (rev 19176)
@@ -23,6 +23,7 @@
*/
package org.hibernate.hql.ast.tree;
+import org.hibernate.type.OneToOneType;
import org.hibernate.type.Type;
import org.hibernate.Hibernate;
import org.hibernate.TypeMismatchException;
@@ -80,8 +81,8 @@
// resolve an expected type
SessionFactoryImplementor sessionFactory = getSessionFactoryHelper().getFactory();
if ( lhsType != null && rhsType != null ) {
- int lhsColumnSpan = lhsType.getColumnSpan( sessionFactory );
- if ( lhsColumnSpan != rhsType.getColumnSpan( sessionFactory ) ) {
+ int lhsColumnSpan = getColumnSpan( lhsType, sessionFactory );
+ if ( lhsColumnSpan != getColumnSpan( rhsType, sessionFactory ) ) {
throw new TypeMismatchException(
"left and right hand sides of a binary logic operator were incompatibile [" +
lhsType.getName() + " : "+ rhsType.getName() + "]"
@@ -97,6 +98,15 @@
}
}
+ private int getColumnSpan( Type type, SessionFactoryImplementor sfi ) {
+ int columnSpan = type.getColumnSpan( sfi );
+ if ( columnSpan == 0 && type instanceof OneToOneType ) {
+ columnSpan = ( (OneToOneType) type ).getIdentifierOrUniqueKeyType( sfi ).getColumnSpan(
+ sfi );
+ }
+ return columnSpan;
+ }
+
/**
* Mutate the subtree relating to a row-value-constructor to instead use
* a series of ANDed predicates. This allows multi-column type comparisons
Modified: core/patches/hibernate-3.3.2.GA_JBPAPP-4059/testsuite/src/test/java/org/hibernate/test/hql/ASTParserLoadingTest.java
===================================================================
--- core/patches/hibernate-3.3.2.GA_JBPAPP-4059/testsuite/src/test/java/org/hibernate/test/hql/ASTParserLoadingTest.java 2010-04-06 16:44:29 UTC (rev 19175)
+++ core/patches/hibernate-3.3.2.GA_JBPAPP-4059/testsuite/src/test/java/org/hibernate/test/hql/ASTParserLoadingTest.java 2010-04-06 16:53:35 UTC (rev 19176)
@@ -391,6 +391,32 @@
return count;
}
+ public void testEntityAndOneToOneReturnedByQuery() {
+ Session s = openSession();
+ s.beginTransaction();
+ Human h = new Human();
+ h.setName( new Name( "Gail", null, "Badner" ) );
+ s.save( h );
+ User u = new User();
+ u.setUserName( "gbadner" );
+ u.setHuman( h );
+ s.save( u );
+ s.getTransaction().commit();
+ s.close();
+
+ s = openSession();
+ s.beginTransaction();
+ Object [] result = ( Object [] ) s.createQuery( "from User u, Human h where u.human = h" ).uniqueResult();
+ assertNotNull( result );
+ assertEquals( u.getUserName(), ( ( User ) result[ 0 ] ).getUserName() );
+ assertEquals( h.getName().getFirst(), ( ( Human ) result[ 1 ] ).getName().getFirst() );
+ assertSame( ( ( User ) result[ 0 ] ).getHuman(), result[ 1 ] );
+ s.createQuery( "delete User" ).executeUpdate();
+ s.createQuery( "delete Human" ).executeUpdate();
+ s.getTransaction().commit();
+ s.close();
+ }
+
public void testNestedComponentIsNull() {
// (1) From MapTest originally...
// (2) Was then moved into HQLTest...
15 years, 5 months
Hibernate SVN: r19175 - in core/patches/hibernate-3.3.2.GA_CP01_JBPAPP-4038: testsuite/src/test/java/org/hibernate/test/hql and 1 other directory.
by hibernate-commits@lists.jboss.org
Author: stliu
Date: 2010-04-06 12:44:29 -0400 (Tue, 06 Apr 2010)
New Revision: 19175
Modified:
core/patches/hibernate-3.3.2.GA_CP01_JBPAPP-4038/core/src/main/java/org/hibernate/hql/ast/tree/BinaryLogicOperatorNode.java
core/patches/hibernate-3.3.2.GA_CP01_JBPAPP-4038/testsuite/src/test/java/org/hibernate/test/hql/ASTParserLoadingTest.java
Log:
JBPAPP-4038 HHH-2088 TypeMismatchException on object equality expression from one-to-one relationship
Modified: core/patches/hibernate-3.3.2.GA_CP01_JBPAPP-4038/core/src/main/java/org/hibernate/hql/ast/tree/BinaryLogicOperatorNode.java
===================================================================
--- core/patches/hibernate-3.3.2.GA_CP01_JBPAPP-4038/core/src/main/java/org/hibernate/hql/ast/tree/BinaryLogicOperatorNode.java 2010-04-06 16:32:59 UTC (rev 19174)
+++ core/patches/hibernate-3.3.2.GA_CP01_JBPAPP-4038/core/src/main/java/org/hibernate/hql/ast/tree/BinaryLogicOperatorNode.java 2010-04-06 16:44:29 UTC (rev 19175)
@@ -23,6 +23,7 @@
*/
package org.hibernate.hql.ast.tree;
+import org.hibernate.type.OneToOneType;
import org.hibernate.type.Type;
import org.hibernate.Hibernate;
import org.hibernate.TypeMismatchException;
@@ -80,8 +81,8 @@
// resolve an expected type
SessionFactoryImplementor sessionFactory = getSessionFactoryHelper().getFactory();
if ( lhsType != null && rhsType != null ) {
- int lhsColumnSpan = lhsType.getColumnSpan( sessionFactory );
- if ( lhsColumnSpan != rhsType.getColumnSpan( sessionFactory ) ) {
+ int lhsColumnSpan = getColumnSpan( lhsType, sessionFactory );
+ if ( lhsColumnSpan != getColumnSpan( rhsType, sessionFactory ) ) {
throw new TypeMismatchException(
"left and right hand sides of a binary logic operator were incompatibile [" +
lhsType.getName() + " : "+ rhsType.getName() + "]"
@@ -97,6 +98,15 @@
}
}
+ private int getColumnSpan( Type type, SessionFactoryImplementor sfi ) {
+ int columnSpan = type.getColumnSpan( sfi );
+ if ( columnSpan == 0 && type instanceof OneToOneType ) {
+ columnSpan = ( (OneToOneType) type ).getIdentifierOrUniqueKeyType( sfi ).getColumnSpan(
+ sfi );
+ }
+ return columnSpan;
+ }
+
/**
* Mutate the subtree relating to a row-value-constructor to instead use
* a series of ANDed predicates. This allows multi-column type comparisons
Modified: core/patches/hibernate-3.3.2.GA_CP01_JBPAPP-4038/testsuite/src/test/java/org/hibernate/test/hql/ASTParserLoadingTest.java
===================================================================
--- core/patches/hibernate-3.3.2.GA_CP01_JBPAPP-4038/testsuite/src/test/java/org/hibernate/test/hql/ASTParserLoadingTest.java 2010-04-06 16:32:59 UTC (rev 19174)
+++ core/patches/hibernate-3.3.2.GA_CP01_JBPAPP-4038/testsuite/src/test/java/org/hibernate/test/hql/ASTParserLoadingTest.java 2010-04-06 16:44:29 UTC (rev 19175)
@@ -391,6 +391,32 @@
return count;
}
+ public void testEntityAndOneToOneReturnedByQuery() {
+ Session s = openSession();
+ s.beginTransaction();
+ Human h = new Human();
+ h.setName( new Name( "Gail", null, "Badner" ) );
+ s.save( h );
+ User u = new User();
+ u.setUserName( "gbadner" );
+ u.setHuman( h );
+ s.save( u );
+ s.getTransaction().commit();
+ s.close();
+
+ s = openSession();
+ s.beginTransaction();
+ Object [] result = ( Object [] ) s.createQuery( "from User u, Human h where u.human = h" ).uniqueResult();
+ assertNotNull( result );
+ assertEquals( u.getUserName(), ( ( User ) result[ 0 ] ).getUserName() );
+ assertEquals( h.getName().getFirst(), ( ( Human ) result[ 1 ] ).getName().getFirst() );
+ assertSame( ( ( User ) result[ 0 ] ).getHuman(), result[ 1 ] );
+ s.createQuery( "delete User" ).executeUpdate();
+ s.createQuery( "delete Human" ).executeUpdate();
+ s.getTransaction().commit();
+ s.close();
+ }
+
public void testNestedComponentIsNull() {
// (1) From MapTest originally...
// (2) Was then moved into HQLTest...
15 years, 5 months
Hibernate SVN: r19174 - core/patches.
by hibernate-commits@lists.jboss.org
Author: stliu
Date: 2010-04-06 12:32:59 -0400 (Tue, 06 Apr 2010)
New Revision: 19174
Added:
core/patches/hibernate-3.3.2.GA_JBPAPP-4059/
Log:
JBPAPP-4059 create one-off branche
Copied: core/patches/hibernate-3.3.2.GA_JBPAPP-4059 (from rev 19173, core/tags/hibernate-3.3.2.GA)
15 years, 5 months
Hibernate SVN: r19173 - search/trunk.
by hibernate-commits@lists.jboss.org
Author: epbernard
Date: 2010-04-06 06:05:14 -0400 (Tue, 06 Apr 2010)
New Revision: 19173
Modified:
search/trunk/pom.xml
Log:
Remove Hardy's traces in pom :)
Modified: search/trunk/pom.xml
===================================================================
--- search/trunk/pom.xml 2010-04-06 09:17:34 UTC (rev 19172)
+++ search/trunk/pom.xml 2010-04-06 10:05:14 UTC (rev 19173)
@@ -385,8 +385,7 @@
<snapshotRepository>
<id>snapshots.jboss.org</id>
<name>JBoss Snapshot Repository</name>
- <url>file:///Users/hardy/tmp/snapshot</url>
- <!--url>dav:https://snapshots.jboss.org/maven2</url-->
+ <url>dav:https://snapshots.jboss.org/maven2</url>
</snapshotRepository>
</distributionManagement>
15 years, 5 months
Hibernate SVN: r19172 - in search/trunk/hibernate-search/src/test/java/org/hibernate/search/test: jgroups/master and 2 other directories.
by hibernate-commits@lists.jboss.org
Author: sannegrinovero
Date: 2010-04-06 05:17:34 -0400 (Tue, 06 Apr 2010)
New Revision: 19172
Modified:
search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/embedded/nested/AttributeValue.java
search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/jgroups/master/TShirt.java
search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/jgroups/slave/TShirt.java
search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/query/boost/DynamicBoostedDescriptionLibrary.java
Log:
HSEARCH-493 Continuous integration builds fail some tests on Oracle databases
Modified: search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/embedded/nested/AttributeValue.java
===================================================================
--- search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/embedded/nested/AttributeValue.java 2010-04-05 15:21:34 UTC (rev 19171)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/embedded/nested/AttributeValue.java 2010-04-06 09:17:34 UTC (rev 19172)
@@ -50,7 +50,7 @@
@ContainedIn
private Attribute attribute;
- @Column(name = "_value")
+ @Column(name = "att_value")
@Field(index = Index.TOKENIZED, store = Store.YES)
private String value;
Modified: search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/jgroups/master/TShirt.java
===================================================================
--- search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/jgroups/master/TShirt.java 2010-04-05 15:21:34 UTC (rev 19171)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/jgroups/master/TShirt.java 2010-04-06 09:17:34 UTC (rev 19172)
@@ -29,6 +29,7 @@
import org.hibernate.search.annotations.Index;
import org.hibernate.search.annotations.Indexed;
+import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@@ -45,6 +46,7 @@
private int id;
@Field(index= Index.TOKENIZED)
private String logo;
+ @Column(name="size_")
private String size;
public int getId() {
Modified: search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/jgroups/slave/TShirt.java
===================================================================
--- search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/jgroups/slave/TShirt.java 2010-04-05 15:21:34 UTC (rev 19171)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/jgroups/slave/TShirt.java 2010-04-06 09:17:34 UTC (rev 19172)
@@ -29,6 +29,7 @@
import org.hibernate.search.annotations.Index;
import org.hibernate.search.annotations.Indexed;
+import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@@ -45,6 +46,7 @@
private int id;
@Field(index= Index.TOKENIZED)
private String logo;
+ @Column(name="size_")
private String size;
public int getId() {
Modified: search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/query/boost/DynamicBoostedDescriptionLibrary.java
===================================================================
--- search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/query/boost/DynamicBoostedDescriptionLibrary.java 2010-04-05 15:21:34 UTC (rev 19171)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/query/boost/DynamicBoostedDescriptionLibrary.java 2010-04-06 09:17:34 UTC (rev 19172)
@@ -27,6 +27,7 @@
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
+import javax.persistence.Table;
import org.hibernate.search.annotations.DocumentId;
import org.hibernate.search.annotations.Field;
@@ -44,6 +45,7 @@
@Entity
@Indexed
@DynamicBoost(impl = CustomBoostStrategy.class)
+@Table(name="DynBoostLibrary")
public class DynamicBoostedDescriptionLibrary {
private int id;
15 years, 5 months
Hibernate SVN: r19171 - in search/trunk/hibernate-search/src: main/java/org/hibernate/search/annotations and 3 other directories.
by hibernate-commits@lists.jboss.org
Author: sannegrinovero
Date: 2010-04-05 11:21:34 -0400 (Mon, 05 Apr 2010)
New Revision: 19171
Added:
search/trunk/hibernate-search/src/main/java/org/hibernate/search/annotations/CharFilterDef.java
search/trunk/hibernate-search/src/test/resources/org/hibernate/search/test/analyzer/solr/mapping-chars.properties
Modified:
search/trunk/hibernate-search/src/main/docbook/en-US/modules/mapping.xml
search/trunk/hibernate-search/src/main/java/org/hibernate/search/annotations/AnalyzerDef.java
search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/SolrAnalyzerBuilder.java
search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/analyzer/solr/SolrAnalyzerTest.java
search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/analyzer/solr/Team.java
Log:
HSEARCH-477 Support for the new Solr's character filters (Gustavo Fernandes)
Modified: search/trunk/hibernate-search/src/main/docbook/en-US/modules/mapping.xml
===================================================================
--- search/trunk/hibernate-search/src/main/docbook/en-US/modules/mapping.xml 2010-04-05 14:08:35 UTC (rev 19170)
+++ search/trunk/hibernate-search/src/main/docbook/en-US/modules/mapping.xml 2010-04-05 15:21:34 UTC (rev 19171)
@@ -693,6 +693,12 @@
</listitem>
<listitem>
+ <para>a list of char filters: each char filter is responsible to
+ pre-process input characters before the tokenization. Char filters can add,
+ change or remove characters; one common usage is for characters normalization</para>
+ </listitem>
+
+ <listitem>
<para>a tokenizer: responsible for tokenizing the input stream
into individual words</para>
</listitem>
@@ -704,16 +710,17 @@
</listitem>
</itemizedlist>
- <para>This separation of tasks - a tokenizer followed by a list of
+ <para>This separation of tasks - a list of char filters, and a tokenizer followed by a list of
filters - allows for easy reuse of each individual component and let
you build your customized analyzer in a very flexible way (just like
- Lego). Generally speaking the <classname>Tokenizer</classname> starts
- the analysis process by turning the character input into tokens which
+ Lego). Generally speaking the <classname>char filters</classname> do some
+ pre-processing in the character input, then the <classname>Tokenizer</classname> starts
+ the tokenizing process by turning the character input into tokens which
are then further processed by the <classname>TokenFilter</classname>s.
Hibernate Search supports this infrastructure by utilizing the Solr
analyzer framework. Make sure to add<filename> solr-core.jar and
- </filename><filename>solr-common.jar</filename> to your classpath to
- use analyzer definitions. In case you also want to utilizing a
+ </filename><filename>solr-solrj.jar</filename> to your classpath to
+ use analyzer definitions. In case you also want to use the
snowball stemmer also include the
<filename>lucene-snowball.jar.</filename> Other Solr analyzers might
depend on more libraries. For example, the
@@ -727,6 +734,11 @@
framework</title>
<programlisting>@AnalyzerDef(name="customanalyzer",
+ charFilters = {
+ @CharFilterDef(factory = MappingCharFilterFactory.class, params = {
+ @Parameter(name = "mapping", value = "org/hibernate/search/test/analyzer/solr/mapping-chars.properties")
+ })
+ },
tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
filters = {
@TokenFilterDef(factory = ISOLatin1AccentFilterFactory.class),
@@ -741,9 +753,12 @@
}</programlisting>
</example>
- <para>A tokenizer is defined by its factory which is responsible for
- building the tokenizer and using the optional list of parameters. This
- example use the standard tokenizer. A filter is defined by its factory
+ <para>A char filter is defined by its factory which is responsible for
+ building the char filter and using the optional list of parameters.
+ In our example, a mapping char filter is used, and will replace
+ characters in the input based on the rules specified in the mapping
+ file. A tokenizer is also defined by its factory.
+ This example use the standard tokenizer. A filter is defined by its factory
which is responsible for creating the filter instance using the
optional parameters. In our example, the StopFilter filter is built
reading the dedicated words property file and is expected to ignore
@@ -751,7 +766,7 @@
factory.</para>
<warning>
- <para>Filters are applied in the order they are defined in the
+ <para>Filters and char filters are applied in the order they are defined in the
<classname>@AnalyzerDef</classname> annotation. Make sure to think
twice about this order.</para>
</warning>
@@ -800,13 +815,53 @@
<section>
<title>Available analyzers</title>
- <para>Solr and Lucene come with a lot of useful default tokenizers and
- filters. You can find a complete list of tokenizer factories and
+ <para>Solr and Lucene come with a lot of useful default char filters, tokenizers and
+ filters. You can find a complete list of char filter factories, tokenizer factories and
filter factories at <ulink
url="http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters">http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters</ulink>.
Let check a few of them.</para>
<table>
+ <title>Some of the available char filters</title>
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry align="center">Factory</entry>
+
+ <entry align="center">Description</entry>
+
+ <entry align="center">parameters</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>MappingCharFilterFactory</entry>
+
+ <entry>Replaces one or more characters with one or more characters, based on mappings
+ specified in the resource file</entry>
+
+ <entry><para><literal>mapping</literal>: points to a resource file containing the mappings
+ using the format:
+ <literallayout>
+ "á" => "a"
+ "ñ" => "n"
+ "ø" => "o"
+ </literallayout>
+ </para></entry>
+ </row>
+ <row>
+ <entry>HTMLStripCharFilterFactory</entry>
+
+ <entry>Remove HTML standard tags, keeping the text</entry>
+
+ <entry>none</entry>
+ </row>
+ </tbody>
+ </tgroup>
+
+ </table>
+
+ <table>
<title>Some of the available tokenizers</title>
<tgroup cols="3">
@@ -833,7 +888,7 @@
<entry>HTMLStripStandardTokenizerFactory</entry>
<entry>Remove HTML tags, keep the text and pass it to a
- StandardTokenizer</entry>
+ StandardTokenizer. @Deprecated, use the HTMLStripCharFilterFactory instead</entry>
<entry>none</entry>
</row>
Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/annotations/AnalyzerDef.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/annotations/AnalyzerDef.java 2010-04-05 14:08:35 UTC (rev 19170)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/annotations/AnalyzerDef.java 2010-04-05 15:21:34 UTC (rev 19171)
@@ -53,6 +53,11 @@
String name();
/**
+ * @return CharFilters used. The filters are applied in the defined order
+ */
+ CharFilterDef[] charFilters() default { };
+
+ /**
* @return Tokenizer used.
*/
TokenizerDef tokenizer();
Added: search/trunk/hibernate-search/src/main/java/org/hibernate/search/annotations/CharFilterDef.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/annotations/CharFilterDef.java (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/annotations/CharFilterDef.java 2010-04-05 15:21:34 UTC (rev 19171)
@@ -0,0 +1,53 @@
+/* $Id$
+ *
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2009, Red Hat, Inc. and/or its affiliates or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat, Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ */
+package org.hibernate.search.annotations;
+
+import org.apache.solr.analysis.CharFilterFactory;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Define a <code>CharFilterFactory</code> and its parameters
+ *
+ * @author Gustavo Fernandes
+ */
+(a)Retention(RetentionPolicy.RUNTIME)
+@Target({ ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
+@Documented
+public @interface CharFilterDef {
+ /**
+ * @return the <code>TokenFilterFactory</code> class which shall be instantiated.
+ */
+ public abstract Class<? extends CharFilterFactory> factory();
+
+ /**
+ * @return Optional parameters passed to the <code>CharFilterFactory</code>.
+ */
+ public abstract Parameter[] params() default { };
+}
Property changes on: search/trunk/hibernate-search/src/main/java/org/hibernate/search/annotations/CharFilterDef.java
___________________________________________________________________
Name: svn:keywords
+ Id
Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/SolrAnalyzerBuilder.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/SolrAnalyzerBuilder.java 2010-04-05 14:08:35 UTC (rev 19170)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/SolrAnalyzerBuilder.java 2010-04-05 15:21:34 UTC (rev 19171)
@@ -29,6 +29,7 @@
import java.util.Collections;
import org.apache.lucene.analysis.Analyzer;
+import org.apache.solr.analysis.CharFilterFactory;
import org.apache.solr.analysis.TokenizerChain;
import org.apache.solr.analysis.TokenFilterFactory;
import org.apache.solr.analysis.TokenizerFactory;
@@ -36,6 +37,7 @@
import org.apache.solr.common.ResourceLoader;
import org.hibernate.search.annotations.AnalyzerDef;
+import org.hibernate.search.annotations.CharFilterDef;
import org.hibernate.search.annotations.TokenizerDef;
import org.hibernate.search.annotations.TokenFilterDef;
import org.hibernate.search.annotations.Parameter;
@@ -65,7 +67,9 @@
tokenFactory.init( getMapOfParameters( token.params() ) );
final int length = analyzerDef.filters().length;
+ final int charLength = analyzerDef.charFilters().length;
TokenFilterFactory[] filters = new TokenFilterFactory[length];
+ CharFilterFactory[] charFilters = new CharFilterFactory[charLength];
ResourceLoader resourceLoader = new HibernateSearchResourceLoader();
for ( int index = 0 ; index < length ; index++ ) {
TokenFilterDef filterDef = analyzerDef.filters()[index];
@@ -75,7 +79,15 @@
((ResourceLoaderAware)filters[index]).inform( resourceLoader );
}
}
- return new TokenizerChain(tokenFactory, filters);
+ for ( int index = 0 ; index < charFilters.length ; index++ ) {
+ CharFilterDef charFilterDef = analyzerDef.charFilters()[index];
+ charFilters[index] = (CharFilterFactory) instantiate( charFilterDef.factory() );
+ charFilters[index].init( getMapOfParameters( charFilterDef.params() ) );
+ if ( charFilters[index] instanceof ResourceLoaderAware ) {
+ ((ResourceLoaderAware)charFilters[index]).inform( resourceLoader );
+ }
+ }
+ return new TokenizerChain( charFilters, tokenFactory, filters );
}
private static Object instantiate(Class clazz) {
Modified: search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/analyzer/solr/SolrAnalyzerTest.java
===================================================================
--- search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/analyzer/solr/SolrAnalyzerTest.java 2010-04-05 14:08:35 UTC (rev 19170)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/analyzer/solr/SolrAnalyzerTest.java 2010-04-05 15:21:34 UTC (rev 19171)
@@ -174,6 +174,12 @@
tokens = AnalyzerUtils.tokensFromAnalysis( analyzer, "name", text );
AnalyzerUtils.assertTokensEqual( tokens, new String[] { "foo", "bar" } );
+ // CharStreamFactories test
+ analyzer = fts.getSearchFactory().getAnalyzer( "mapping_char_analyzer" );
+ text = "CORAÇÃO DE MELÃO";
+ tokens = AnalyzerUtils.tokensFromAnalysis( analyzer, "name", text );
+ AnalyzerUtils.assertTokensEqual( tokens, new String[] { "CORACAO", "DE", "MELAO" } );
+
fts.close();
}
Modified: search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/analyzer/solr/Team.java
===================================================================
--- search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/analyzer/solr/Team.java 2010-04-05 14:08:35 UTC (rev 19170)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/analyzer/solr/Team.java 2010-04-05 15:21:34 UTC (rev 19171)
@@ -28,12 +28,12 @@
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
-import org.apache.solr.analysis.HTMLStripStandardTokenizerFactory;
-import org.apache.solr.analysis.HTMLStripWhitespaceTokenizerFactory;
+import org.apache.solr.analysis.HTMLStripCharFilterFactory;
import org.apache.solr.analysis.ISOLatin1AccentFilterFactory;
import org.apache.solr.analysis.LengthFilterFactory;
import org.apache.solr.analysis.LowerCaseFilterFactory;
import org.apache.solr.analysis.LowerCaseTokenizerFactory;
+import org.apache.solr.analysis.MappingCharFilterFactory;
import org.apache.solr.analysis.PorterStemFilterFactory;
import org.apache.solr.analysis.ShingleFilterFactory;
import org.apache.solr.analysis.SnowballPorterFilterFactory;
@@ -49,6 +49,7 @@
import org.hibernate.search.annotations.Analyzer;
import org.hibernate.search.annotations.AnalyzerDef;
import org.hibernate.search.annotations.AnalyzerDefs;
+import org.hibernate.search.annotations.CharFilterDef;
import org.hibernate.search.annotations.DocumentId;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Indexed;
@@ -87,17 +88,19 @@
filters = {
@TokenFilterDef(factory = StandardFilterFactory.class)
}),
-
@AnalyzerDef(name = "html_standard_analyzer",
- tokenizer = @TokenizerDef(factory = HTMLStripStandardTokenizerFactory.class),
+ charFilters = {
+ @CharFilterDef(factory = HTMLStripCharFilterFactory.class)
+ },
+ tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
filters = {
@TokenFilterDef(factory = StandardFilterFactory.class)
}),
@AnalyzerDef(name = "html_whitespace_analyzer",
- tokenizer = @TokenizerDef(factory = HTMLStripWhitespaceTokenizerFactory.class),
- filters = {
- @TokenFilterDef(factory = StandardFilterFactory.class)
+ tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
+ charFilters = {
+ @CharFilterDef(factory = HTMLStripCharFilterFactory.class)
}),
@AnalyzerDef(name = "trim_analyzer",
@@ -123,7 +126,10 @@
}),
@AnalyzerDef(name = "word_analyzer",
- tokenizer = @TokenizerDef(factory = HTMLStripStandardTokenizerFactory.class),
+ charFilters = {
+ @CharFilterDef(factory = HTMLStripCharFilterFactory.class)
+ },
+ tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
filters = {
@TokenFilterDef(factory = WordDelimiterFilterFactory.class, params = {
@Parameter(name = "splitOnCaseChange", value = "1")
@@ -131,7 +137,10 @@
}),
@AnalyzerDef(name = "synonym_analyzer",
- tokenizer = @TokenizerDef(factory = HTMLStripStandardTokenizerFactory.class),
+ charFilters = {
+ @CharFilterDef(factory = HTMLStripCharFilterFactory.class)
+ },
+ tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
filters = {
@TokenFilterDef(factory = SynonymFilterFactory.class, params = {
@Parameter(name = "synonyms",
@@ -140,7 +149,10 @@
}),
@AnalyzerDef(name = "shingle_analyzer",
- tokenizer = @TokenizerDef(factory = HTMLStripStandardTokenizerFactory.class),
+ charFilters = {
+ @CharFilterDef(factory = HTMLStripCharFilterFactory.class)
+ },
+ tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
filters = {
@TokenFilterDef(factory = ShingleFilterFactory.class)
}),
@@ -152,7 +164,23 @@
@Parameter(name = "encoder", value = "Metaphone"),
@Parameter(name = "inject", value = "false")
})
- })
+ }),
+
+ @AnalyzerDef(name = "html_char_analyzer",
+ charFilters = {
+ @CharFilterDef(factory = HTMLStripCharFilterFactory.class)
+ },
+ tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class)
+ ),
+
+ @AnalyzerDef(name = "mapping_char_analyzer",
+ charFilters = {
+ @CharFilterDef(factory = MappingCharFilterFactory.class, params = {
+ @Parameter(name = "mapping", value = "org/hibernate/search/test/analyzer/solr/mapping-chars.properties")
+ })
+ },
+ tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class)
+ )
})
public class Team {
@Id
Added: search/trunk/hibernate-search/src/test/resources/org/hibernate/search/test/analyzer/solr/mapping-chars.properties
===================================================================
--- search/trunk/hibernate-search/src/test/resources/org/hibernate/search/test/analyzer/solr/mapping-chars.properties (rev 0)
+++ search/trunk/hibernate-search/src/test/resources/org/hibernate/search/test/analyzer/solr/mapping-chars.properties 2010-04-05 15:21:34 UTC (rev 19171)
@@ -0,0 +1,80 @@
+# À => A
+"\u00C0" => "A"
+
+# Á => A
+"\u00C1" => "A"
+
+# Â => A
+"\u00C2" => "A"
+
+# Ã => A
+"\u00C3" => "A"
+
+# Ä => A
+"\u00C4" => "A"
+
+# Å => A
+"\u00C5" => "A"
+
+# Æ => AE
+"\u00C6" => "AE"
+
+# Ç => C
+"\u00C7" => "C"
+
+# È => E
+"\u00C8" => "E"
+
+# É => E
+"\u00C9" => "E"
+
+# Ê => E
+"\u00CA" => "E"
+
+# Ë => E
+"\u00CB" => "E"
+
+# Ì => I
+"\u00CC" => "I"
+
+# Í => I
+"\u00CD" => "I"
+
+# Î => I
+"\u00CE" => "I"
+
+# Ï => I
+"\u00CF" => "I"
+
+# IJ => IJ
+"\u0132" => "IJ"
+
+# Ð => D
+"\u00D0" => "D"
+
+# Ñ => N
+"\u00D1" => "N"
+
+# Ò => O
+"\u00D2" => "O"
+
+# Ó => O
+"\u00D3" => "O"
+
+# Ô => O
+"\u00D4" => "O"
+
+# Õ => O
+"\u00D5" => "O"
+
+# Ö => O
+"\u00D6" => "O"
+
+# Ø => O
+"\u00D8" => "O"
+
+# Œ => OE
+"\u0152" => "OE"
+
+# Þ
+"\u00DE" => "TH"
\ No newline at end of file
15 years, 5 months
Hibernate SVN: r19170 - core/trunk/core/src/main/java/org/hibernate/dialect.
by hibernate-commits@lists.jboss.org
Author: stliu
Date: 2010-04-05 10:08:35 -0400 (Mon, 05 Apr 2010)
New Revision: 19170
Modified:
core/trunk/core/src/main/java/org/hibernate/dialect/Ingres9Dialect.java
Log:
HHH-5045 org.hibernate.test.hql.HQLTest failure running testConcatenation with Ingres
Modified: core/trunk/core/src/main/java/org/hibernate/dialect/Ingres9Dialect.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/dialect/Ingres9Dialect.java 2010-04-05 14:08:04 UTC (rev 19169)
+++ core/trunk/core/src/main/java/org/hibernate/dialect/Ingres9Dialect.java 2010-04-05 14:08:35 UTC (rev 19170)
@@ -5,6 +5,7 @@
import org.hibernate.Hibernate;
import org.hibernate.cfg.Environment;
import org.hibernate.dialect.function.NoArgSQLFunction;
+import org.hibernate.dialect.function.VarArgsSQLFunction;
/**
* A SQL dialect for Ingres 9.3 and later versions.
@@ -17,6 +18,7 @@
* <li>Added support for pooled sequences</li>
* <li>Added support for SELECT queries with limit and offset</li>
* <li>Added getIdentitySelectString</li>
+ * <li>Modified concatination operator</li>
* </ul>
*
* @author Enrico Schenk, Raymond Fan
@@ -26,6 +28,7 @@
super();
registerDateTimeFunctions();
registerDateTimeColumnTypes();
+ registerFunction( "concat", new VarArgsSQLFunction( Hibernate.STRING, "(", "||", ")" ) );
}
/**
15 years, 5 months
Hibernate SVN: r19169 - core/trunk/testsuite/src/test/java/org/hibernate/test/hql.
by hibernate-commits@lists.jboss.org
Author: stliu
Date: 2010-04-05 10:08:04 -0400 (Mon, 05 Apr 2010)
New Revision: 19169
Modified:
core/trunk/testsuite/src/test/java/org/hibernate/test/hql/HQLTest.java
Log:
HHH-5045 org.hibernate.test.hql.HQLTest failure running testConcatenation with Ingres
Modified: core/trunk/testsuite/src/test/java/org/hibernate/test/hql/HQLTest.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/hql/HQLTest.java 2010-04-05 13:37:52 UTC (rev 19168)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/hql/HQLTest.java 2010-04-05 14:08:04 UTC (rev 19169)
@@ -15,6 +15,7 @@
import org.hibernate.QueryException;
import org.hibernate.dialect.DB2Dialect;
import org.hibernate.dialect.HSQLDialect;
+import org.hibernate.dialect.IngresDialect;
import org.hibernate.dialect.MySQLDialect;
import org.hibernate.dialect.Oracle8iDialect;
import org.hibernate.dialect.PostgreSQLDialect;
@@ -640,12 +641,19 @@
}
public void testConcatenation() {
- if ( getDialect() instanceof MySQLDialect || getDialect() instanceof SybaseDialect || getDialect() instanceof Sybase11Dialect || getDialect() instanceof SybaseASE15Dialect || getDialect() instanceof SybaseAnywhereDialect || getDialect() instanceof SQLServerDialect ) {
+ if ( getDialect() instanceof MySQLDialect || getDialect() instanceof SybaseDialect
+ || getDialect() instanceof Sybase11Dialect
+ || getDialect() instanceof SybaseASE15Dialect
+ || getDialect() instanceof SybaseAnywhereDialect
+ || getDialect() instanceof SQLServerDialect
+ || getDialect() instanceof IngresDialect) {
// SybaseASE15Dialect and SybaseAnywhereDialect support '||'
// MySQL uses concat(x, y, z)
// SQL Server replaces '||' with '+'
//
// this is syntax checked in {@link ASTParserLoadingTest#testConcatenation}
+ // Ingres supports both "||" and '+' but IngresDialect originally
+ // uses '+' operator; updated Ingres9Dialect to use "||".
return;
}
assertTranslation("from Human h where h.nickName = '1' || 'ov' || 'tha' || 'few'");
15 years, 5 months