You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by ma...@apache.org on 2013/08/05 04:49:09 UTC

svn commit: r1510366 - in /db/derby/code/branches/10.9: ./ java/engine/org/apache/derby/iapi/types/

Author: mamta
Date: Mon Aug  5 02:49:09 2013
New Revision: 1510366

URL: http://svn.apache.org/r1510366
Log:
DERBY-2699(performance of like in territory based collation databases may be improved by changing way collation elements are calculated.)

Backporting to 10.9. Fix contributed by Knut Anders Hatlen



Modified:
    db/derby/code/branches/10.9/   (props changed)
    db/derby/code/branches/10.9/java/engine/org/apache/derby/iapi/types/CollationElementsInterface.java
    db/derby/code/branches/10.9/java/engine/org/apache/derby/iapi/types/CollatorSQLChar.java
    db/derby/code/branches/10.9/java/engine/org/apache/derby/iapi/types/CollatorSQLClob.java
    db/derby/code/branches/10.9/java/engine/org/apache/derby/iapi/types/CollatorSQLLongvarchar.java
    db/derby/code/branches/10.9/java/engine/org/apache/derby/iapi/types/CollatorSQLVarchar.java
    db/derby/code/branches/10.9/java/engine/org/apache/derby/iapi/types/WorkHorseForCollatorDatatypes.java

Propchange: db/derby/code/branches/10.9/
------------------------------------------------------------------------------
  Merged /db/derby/code/trunk:r1428305

Modified: db/derby/code/branches/10.9/java/engine/org/apache/derby/iapi/types/CollationElementsInterface.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.9/java/engine/org/apache/derby/iapi/types/CollationElementsInterface.java?rev=1510366&r1=1510365&r2=1510366&view=diff
==============================================================================
--- db/derby/code/branches/10.9/java/engine/org/apache/derby/iapi/types/CollationElementsInterface.java (original)
+++ db/derby/code/branches/10.9/java/engine/org/apache/derby/iapi/types/CollationElementsInterface.java Mon Aug  5 02:49:09 2013
@@ -31,22 +31,13 @@ import org.apache.derby.iapi.error.Stand
  */
 interface CollationElementsInterface
 {
-	/**
-	 * This method translates the string into a series of collation elements.
-	 * These elements will get used in the like method.
-	 * 
-	 * @return an array of collation elements for the string
-	 * @throws StandardException
-	 */
-	public int[] getCollationElementsForString() throws StandardException; 
-
-	/**
-	 * This method returns the count of collation elements for this instance of
-	 * CollationElementsInterface. This method will return the correct value only if  
-	 * method getCollationElementsForString has been called previously on this 
-	 * instance of CollationElementsInterface. 
-	 *
-	 * @return count of collation elements for this instance of CollatorSQLChar
-	 */
-	public int getCountOfCollationElements();
+    /**
+     * Check if this instance represents a value that has a single
+     * collation element.
+     *
+     * @return {@code true} if the value has exactly one collation element,
+     * or {@code false} otherwise
+     * @throws StandardException if an error occurs when accessing the value
+     */
+    boolean hasSingleCollationElement() throws StandardException;
 }

Modified: db/derby/code/branches/10.9/java/engine/org/apache/derby/iapi/types/CollatorSQLChar.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.9/java/engine/org/apache/derby/iapi/types/CollatorSQLChar.java?rev=1510366&r1=1510365&r2=1510366&view=diff
==============================================================================
--- db/derby/code/branches/10.9/java/engine/org/apache/derby/iapi/types/CollatorSQLChar.java (original)
+++ db/derby/code/branches/10.9/java/engine/org/apache/derby/iapi/types/CollatorSQLChar.java Mon Aug  5 02:49:09 2013
@@ -86,18 +86,12 @@ class CollatorSQLChar extends SQLChar im
 	{
 		return holderForCollationSensitiveInfo.getCollatorForCollation();
 	}
-	
-	/** @see CollationElementsInterface#getCollationElementsForString */
-	public int[] getCollationElementsForString() throws StandardException 
-	{
-		return holderForCollationSensitiveInfo.getCollationElementsForString();
-	}
 
-	/** @see CollationElementsInterface#getCountOfCollationElements */
-	public int getCountOfCollationElements()
-	{
-		return holderForCollationSensitiveInfo.getCountOfCollationElements();
-	}
+    // Implementation of CollationElementsInterface interface
+
+    public boolean hasSingleCollationElement() throws StandardException {
+        return holderForCollationSensitiveInfo.hasSingleCollationElement();
+    }
 
 	/*
 	 * DataValueDescriptor interface

Modified: db/derby/code/branches/10.9/java/engine/org/apache/derby/iapi/types/CollatorSQLClob.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.9/java/engine/org/apache/derby/iapi/types/CollatorSQLClob.java?rev=1510366&r1=1510365&r2=1510366&view=diff
==============================================================================
--- db/derby/code/branches/10.9/java/engine/org/apache/derby/iapi/types/CollatorSQLClob.java (original)
+++ db/derby/code/branches/10.9/java/engine/org/apache/derby/iapi/types/CollatorSQLClob.java Mon Aug  5 02:49:09 2013
@@ -100,17 +100,11 @@ class CollatorSQLClob extends SQLClob im
 		return holderForCollationSensitiveInfo.getCollatorForCollation();
 	}
 	
-	/** @see CollationElementsInterface#getCollationElementsForString */
-	public int[] getCollationElementsForString() throws StandardException 
-	{
-		return holderForCollationSensitiveInfo.getCollationElementsForString();
-	}
+    // Implementation of CollationElementsInterface interface
 
-	/** @see CollationElementsInterface#getCountOfCollationElements */
-	public int getCountOfCollationElements()
-	{
-		return holderForCollationSensitiveInfo.getCountOfCollationElements();
-	}
+    public boolean hasSingleCollationElement() throws StandardException {
+        return holderForCollationSensitiveInfo.hasSingleCollationElement();
+    }
 
 	/*
 	 * DataValueDescriptor interface

Modified: db/derby/code/branches/10.9/java/engine/org/apache/derby/iapi/types/CollatorSQLLongvarchar.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.9/java/engine/org/apache/derby/iapi/types/CollatorSQLLongvarchar.java?rev=1510366&r1=1510365&r2=1510366&view=diff
==============================================================================
--- db/derby/code/branches/10.9/java/engine/org/apache/derby/iapi/types/CollatorSQLLongvarchar.java (original)
+++ db/derby/code/branches/10.9/java/engine/org/apache/derby/iapi/types/CollatorSQLLongvarchar.java Mon Aug  5 02:49:09 2013
@@ -89,17 +89,11 @@ class CollatorSQLLongvarchar extends SQL
 		return holderForCollationSensitiveInfo.getCollatorForCollation();
 	}
 	
-	/** @see CollationElementsInterface#getCollationElementsForString */
-	public int[] getCollationElementsForString() throws StandardException 
-	{
-		return holderForCollationSensitiveInfo.getCollationElementsForString();
-	}
+    // Implementation of CollationElementsInterface interface
 
-	/** @see CollationElementsInterface#getCountOfCollationElements */
-	public int getCountOfCollationElements()
-	{
-		return holderForCollationSensitiveInfo.getCountOfCollationElements();
-	}
+    public boolean hasSingleCollationElement() throws StandardException {
+        return holderForCollationSensitiveInfo.hasSingleCollationElement();
+    }
 
 	/*
 	 * DataValueDescriptor interface

Modified: db/derby/code/branches/10.9/java/engine/org/apache/derby/iapi/types/CollatorSQLVarchar.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.9/java/engine/org/apache/derby/iapi/types/CollatorSQLVarchar.java?rev=1510366&r1=1510365&r2=1510366&view=diff
==============================================================================
--- db/derby/code/branches/10.9/java/engine/org/apache/derby/iapi/types/CollatorSQLVarchar.java (original)
+++ db/derby/code/branches/10.9/java/engine/org/apache/derby/iapi/types/CollatorSQLVarchar.java Mon Aug  5 02:49:09 2013
@@ -88,17 +88,11 @@ class CollatorSQLVarchar extends SQLVarc
 		return holderForCollationSensitiveInfo.getCollatorForCollation();
 	}
 	
-	/** @see CollationElementsInterface#getCollationElementsForString */
-	public int[] getCollationElementsForString() throws StandardException 
-	{
-		return holderForCollationSensitiveInfo.getCollationElementsForString();
-	}
+    // Implementation of CollationElementsInterface interface
 
-	/** @see CollationElementsInterface#getCountOfCollationElements */
-	public int getCountOfCollationElements()
-	{
-		return holderForCollationSensitiveInfo.getCountOfCollationElements();
-	}
+    public boolean hasSingleCollationElement() throws StandardException {
+        return holderForCollationSensitiveInfo.hasSingleCollationElement();
+    }
 
 	/*
 	 * DataValueDescriptor interface

Modified: db/derby/code/branches/10.9/java/engine/org/apache/derby/iapi/types/WorkHorseForCollatorDatatypes.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.9/java/engine/org/apache/derby/iapi/types/WorkHorseForCollatorDatatypes.java?rev=1510366&r1=1510365&r2=1510366&view=diff
==============================================================================
--- db/derby/code/branches/10.9/java/engine/org/apache/derby/iapi/types/WorkHorseForCollatorDatatypes.java (original)
+++ db/derby/code/branches/10.9/java/engine/org/apache/derby/iapi/types/WorkHorseForCollatorDatatypes.java Mon Aug  5 02:49:09 2013
@@ -21,9 +21,6 @@
 
 package org.apache.derby.iapi.types;
 
-import org.apache.derby.iapi.types.DataValueDescriptor;
-import org.apache.derby.iapi.types.BooleanDataValue;
-
 import org.apache.derby.iapi.reference.SQLState;
 
 import org.apache.derby.iapi.error.StandardException;
@@ -57,21 +54,6 @@ final class WorkHorseForCollatorDatatype
 	 * This SQLChar object is passed as a parameter to the constructor.
 	 */
 	private SQLChar stringData;
-	/**
-	 * Following is the array holding a series of collation elements for the
-	 * string. It will be used in the like method. This gets initialized when
-	 * the like method is first invoked. 
-	 */
-	private int[]	collationElementsForString;
-	/** 
-	 * Number of valid collation elements in the array above. Note that this 
-	 * might be smaller than the actual size of the array above. Gets 
-	 * initialized when the like method is first invoked.
-	 */
-	private int		countOfCollationElements;
-
-	// For null strings, cKey = null.
-	private CollationKey cKey; 
 
 	WorkHorseForCollatorDatatypes(
 			RuleBasedCollator collatorForCharacterDatatypes,
@@ -171,8 +153,7 @@ final class WorkHorseForCollatorDatatype
 
 		CollationElementsInterface escapeCharacter = (CollationElementsInterface) escape;
 
-		if (escapeCharacter.getCollationElementsForString() != null && 
-				(escapeCharacter.getCountOfCollationElements() != 1))
+		if (!escapeCharacter.hasSingleCollationElement())
 		{
 			throw StandardException.newException(SQLState.LANG_INVALID_ESCAPE_CHARACTER,
 					escapeCharacter.toString());
@@ -199,87 +180,23 @@ final class WorkHorseForCollatorDatatype
 		return(collatorForCharacterDatatypes);
 	}
 
-	/**
-	 * This method returns the count of collation elements for SQLChar object.
-	 * It method will return the correct value only if method   
-	 * getCollationElementsForString has been called previously on the SQLChar
-	 * object. 
-	 *
-	 * @return count of collation elements for this instance of CollatorSQLChar
-	 */
-	int getCountOfCollationElements()
-	{
-		return countOfCollationElements;
-	}
-
-	/**
-	 * This method translates the string into a series of collation elements.
-	 * These elements will get used in the like method.
-	 * 
-	 * @return an array of collation elements for the string
-	 * @throws StandardException
-	 */
-	int[] getCollationElementsForString()
-		throws StandardException
-	{
-		if (stringData.isNull())
-		{
-			return (int[]) null;
-		}
-
-
-
-        // Caching of collationElementsForString is not working properly, in 
-        // order to cache it needs to get invalidated everytime the container
-        // type's value is changed - through any interface, eg: readExternal, 
-        // setValue, ...  To get proper behavior, disabling caching, and will
-        // file a performance enhancement to implement correct caching.
-        collationElementsForString = null;
-        countOfCollationElements   = 0;
-
+    /**
+     * Check if the string consists of a single collation element.
+     * @return {@code true} iff it's a single collation element
+     * @see CollationElementsInterface#hasSingleCollationElement()
+     */
+    boolean hasSingleCollationElement() throws StandardException {
+        if (stringData.isNull()) {
+            return false;
+        }
 
-		if (collationElementsForString != null)
-		{
-			return collationElementsForString;
-		}
-
-		// countOfCollationElements should always be 0 when 
-        // collationElementsForString is null
-		if (SanityManager.DEBUG)
-		{
-			if (countOfCollationElements != 0)
-			{
-				SanityManager.THROWASSERT(
-					"countOfCollationElements expected to be 0, not " + 
-                    countOfCollationElements);
-			}
-		}
-        
-
-		collationElementsForString = new int[stringData.getLength()];
-
-		CollationElementIterator cei = 
+        CollationElementIterator cei =
             collatorForCharacterDatatypes.getCollationElementIterator(
                 stringData.getString());
 
-		int nextInt;
-		while ((nextInt = cei.next()) != CollationElementIterator.NULLORDER)
-		{
-			/* Believe it or not, a String might have more
-			 * collation elements than characters.
-			 * So, we handle that case by increasing the int array
-			 * by 5 and copying array elements.
-			 */
-			if (countOfCollationElements == collationElementsForString.length)
-			{
-				int[] expandedArray = new int[countOfCollationElements + 5];
-				System.arraycopy(collationElementsForString, 0, expandedArray, 
-						0, collationElementsForString.length);
-				collationElementsForString = expandedArray;
-			}
-			collationElementsForString[countOfCollationElements++] = nextInt;
-		}
-
-		return collationElementsForString;
-	}
+        // First call next() to see that there is at least one element, and
+        // then call next() to see that there is no more than one element.
+        return cei.next() != CollationElementIterator.NULLORDER &&
+                cei.next() == CollationElementIterator.NULLORDER;
+    }
 }