You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@manifoldcf.apache.org by kw...@apache.org on 2010/09/19 03:11:02 UTC
svn commit: r998576 - in /incubator/lcf/trunk/modules/framework:
core/src/main/java/org/apache/acf/core/database/
core/src/main/java/org/apache/acf/core/interfaces/
pull-agent/src/main/java/org/apache/acf/crawler/jobs/
pull-agent/src/main/java/org/apac...
Author: kwright
Date: Sun Sep 19 01:11:02 2010
New Revision: 998576
URL: http://svn.apache.org/viewvc?rev=998576&view=rev
Log:
Partial fix for CONNECTORS-109. The full fix requires a feature in Derby that is on Derby's trunk but not yet in a release. Fix the report queries for queue status and result report that were due to use of the postgresql-only function 'SUBSTRING'. I also needed to restructure these queries because the GROUP BY columns are not allowed to be return column names in Derby.
Modified:
incubator/lcf/trunk/modules/framework/core/src/main/java/org/apache/acf/core/database/BaseTable.java
incubator/lcf/trunk/modules/framework/core/src/main/java/org/apache/acf/core/database/DBInterfaceDerby.java
incubator/lcf/trunk/modules/framework/core/src/main/java/org/apache/acf/core/database/DBInterfaceMySQL.java
incubator/lcf/trunk/modules/framework/core/src/main/java/org/apache/acf/core/database/DBInterfacePostgreSQL.java
incubator/lcf/trunk/modules/framework/core/src/main/java/org/apache/acf/core/interfaces/IDBInterface.java
incubator/lcf/trunk/modules/framework/pull-agent/src/main/java/org/apache/acf/crawler/jobs/JobManager.java
incubator/lcf/trunk/modules/framework/pull-agent/src/main/java/org/apache/acf/crawler/repository/RepositoryHistoryManager.java
Modified: incubator/lcf/trunk/modules/framework/core/src/main/java/org/apache/acf/core/database/BaseTable.java
URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/modules/framework/core/src/main/java/org/apache/acf/core/database/BaseTable.java?rev=998576&r1=998575&r2=998576&view=diff
==============================================================================
--- incubator/lcf/trunk/modules/framework/core/src/main/java/org/apache/acf/core/database/BaseTable.java (original)
+++ incubator/lcf/trunk/modules/framework/core/src/main/java/org/apache/acf/core/database/BaseTable.java Sun Sep 19 01:11:02 2010
@@ -294,7 +294,20 @@ public class BaseTable
{
return dbInterface.constructRegexpClause(column,regularExpression,caseInsensitive);
}
-
+
+ /** Construct a regular-expression substring clause.
+ * This method builds an expression that extracts a specified string section from a field, based on
+ * a regular expression.
+ *@param column is the column specifier string.
+ *@param regularExpression is the properly-quoted regular expression string, or "?" if a parameterized value is to be used.
+ *@param caseInsensitive is true if the regular expression match is to be case insensitive.
+ *@return the expression chunk needed, not padded with spaces on either side.
+ */
+ public String constructSubstringClause(String column, String regularExpression, boolean caseInsensitive)
+ {
+ return dbInterface.constructSubstringClause(column,regularExpression,caseInsensitive);
+ }
+
/** Construct an offset/limit clause.
* This method constructs an offset/limit clause in the proper manner for the database in question.
*@param offset is the starting offset number.
Modified: incubator/lcf/trunk/modules/framework/core/src/main/java/org/apache/acf/core/database/DBInterfaceDerby.java
URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/modules/framework/core/src/main/java/org/apache/acf/core/database/DBInterfaceDerby.java?rev=998576&r1=998575&r2=998576&view=diff
==============================================================================
--- incubator/lcf/trunk/modules/framework/core/src/main/java/org/apache/acf/core/database/DBInterfaceDerby.java (original)
+++ incubator/lcf/trunk/modules/framework/core/src/main/java/org/apache/acf/core/database/DBInterfaceDerby.java Sun Sep 19 01:11:02 2010
@@ -22,6 +22,7 @@ import org.apache.acf.core.interfaces.*;
import org.apache.acf.core.system.ACF;
import org.apache.acf.core.system.Logging;
import java.util.*;
+import java.util.regex.*;
import java.io.*;
import java.sql.*;
@@ -531,6 +532,15 @@ public class DBInterfaceDerby extends Da
{
rootDatabase.executeQuery("CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.user."+userName+"', '"+password+"')",null,invalidateKeys,null,null,false,0,null,null);
rootDatabase.executeQuery("CREATE SCHEMA "+userName+" AUTHORIZATION "+userName,null,invalidateKeys,null,null,false,0,null,null);
+ // Create user-defined functions
+ rootDatabase.executeQuery("CREATE FUNCTION caseInsensitiveRegularExpressionCompare (value varchar(255), regexp varchar(255)) returns varchar(255) "+
+ "language java parameter style java no sql external name 'org.apache.acf.core.database.DBInterfaceDerby.caseInsensitiveRegularExpressionCompare",null,invalidateKeys,null,null,false,0,null,null);
+ rootDatabase.executeQuery("CREATE FUNCTION caseSensitiveRegularExpressionCompare (value varchar(255), regexp varchar(255)) returns varchar(255) "+
+ "language java parameter style java no sql external name 'org.apache.acf.core.database.DBInterfaceDerby.caseSensitiveRegularExpressionCompare",null,invalidateKeys,null,null,false,0,null,null);
+ rootDatabase.executeQuery("CREATE FUNCTION caseInsensitiveSubstring (value varchar(255), regexp varchar(255)) returns varchar(255) "+
+ "language java parameter style java no sql external name 'org.apache.acf.core.database.DBInterfaceDerby.caseInsensitiveSubstring",null,invalidateKeys,null,null,false,0,null,null);
+ rootDatabase.executeQuery("CREATE FUNCTION caseSensitiveSubstring (value varchar(255), regexp varchar(255)) returns varchar(255) "+
+ "language java parameter style java no sql external name 'org.apache.acf.core.database.DBInterfaceDerby.caseSensitiveSubstring",null,invalidateKeys,null,null,false,0,null,null);
}
}
@@ -790,8 +800,30 @@ public class DBInterfaceDerby extends Da
*/
public String constructRegexpClause(String column, String regularExpression, boolean caseInsensitive)
{
- // MHL to invoke a stored procedure
return column + " LIKE " + regularExpression;
+ // Waiting for DERBY-4066 to be resolved in a release for the following:
+ //if (caseInsensitive)
+ // return "caseInsensitiveRegularExpressionCompare("+column+","+regularExpression+")='true'";
+ //else
+ // return "caseSensitiveRegularExpressionCompare("+column+","+regularExpression+")='true'";
+ }
+
+ /** Construct a regular-expression substring clause.
+ * This method builds an expression that extracts a specified string section from a field, based on
+ * a regular expression.
+ *@param column is the column specifier string.
+ *@param regularExpression is the properly-quoted regular expression string, or "?" if a parameterized value is to be used.
+ *@param caseInsensitive is true if the regular expression match is to be case insensitive.
+ *@return the expression chunk needed, not padded with spaces on either side.
+ */
+ public String constructSubstringClause(String column, String regularExpression, boolean caseInsensitive)
+ {
+ return "''";
+ // Waiting for DERBY-4066 to be resolved in a release for the following:
+ //if (caseInsensitive)
+ // return "caseInsensitiveSubstring("+column+","+regularExpression+")";
+ //else
+ // return "caseSensitiveSubstring("+column+","+regularExpression+")";
}
/** Construct an offset/limit clause.
@@ -1048,5 +1080,89 @@ public class DBInterfaceDerby extends Da
return rawColumnName.toLowerCase();
}
+ // Functions that correspond to user-defined functions in Derby
+
+ /** Method to compare a value using a case-insensitive regular expression.
+ */
+ public static String caseInsensitiveRegularExpressionCompare(String value, String regularExpression)
+ throws SQLException
+ {
+ try
+ {
+ Pattern p = Pattern.compile(regularExpression,Pattern.CASE_INSENSITIVE);
+ Matcher m = p.matcher(value);
+ if (m.find())
+ return "true";
+ else
+ return "false";
+ }
+ catch (PatternSyntaxException e)
+ {
+ throw new SQLException("Pattern syntax exception: "+e.getMessage());
+ }
+ }
+
+ /** Method to compare a value using a case-sensitive regular expression.
+ */
+ public static String caseSensitiveRegularExpressionCompare(String value, String regularExpression)
+ throws SQLException
+ {
+ try
+ {
+ Pattern p = Pattern.compile(regularExpression,0);
+ Matcher m = p.matcher(value);
+ if (m.find())
+ return "true";
+ else
+ return "false";
+ }
+ catch (PatternSyntaxException e)
+ {
+ throw new SQLException("Pattern syntax exception: "+e.getMessage());
+ }
+ }
+
+ /** Method to get a substring out of a case-insensitive regular expression group.
+ */
+ public static String caseInsensitiveSubstring(String value, String regularExpression)
+ throws SQLException
+ {
+ try
+ {
+ Pattern p = Pattern.compile(regularExpression,Pattern.CASE_INSENSITIVE);
+ Matcher m = p.matcher(value);
+ return m.group(1);
+ }
+ catch (IndexOutOfBoundsException e)
+ {
+ return value;
+ }
+ catch (PatternSyntaxException e)
+ {
+ throw new SQLException("Pattern syntax exception: "+e.getMessage());
+ }
+ }
+
+ /** Method to get a substring out of a case-sensitive regular expression group.
+ */
+ public static String caseSensitiveSubstring(String value, String regularExpression)
+ throws SQLException
+ {
+ try
+ {
+ Pattern p = Pattern.compile(regularExpression,0);
+ Matcher m = p.matcher(value);
+ return m.group(1);
+ }
+ catch (IndexOutOfBoundsException e)
+ {
+ return value;
+ }
+ catch (PatternSyntaxException e)
+ {
+ throw new SQLException("Pattern syntax exception: "+e.getMessage());
+ }
+ }
+
}
Modified: incubator/lcf/trunk/modules/framework/core/src/main/java/org/apache/acf/core/database/DBInterfaceMySQL.java
URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/modules/framework/core/src/main/java/org/apache/acf/core/database/DBInterfaceMySQL.java?rev=998576&r1=998575&r2=998576&view=diff
==============================================================================
--- incubator/lcf/trunk/modules/framework/core/src/main/java/org/apache/acf/core/database/DBInterfaceMySQL.java (original)
+++ incubator/lcf/trunk/modules/framework/core/src/main/java/org/apache/acf/core/database/DBInterfaceMySQL.java Sun Sep 19 01:11:02 2010
@@ -549,6 +549,20 @@ public class DBInterfaceMySQL extends Da
return column + " LIKE " + regularExpression;
}
+ /** Construct a regular-expression substring clause.
+ * This method builds an expression that extracts a specified string section from a field, based on
+ * a regular expression.
+ *@param column is the column specifier string.
+ *@param regularExpression is the properly-quoted regular expression string, or "?" if a parameterized value is to be used.
+ *@param caseInsensitive is true if the regular expression match is to be case insensitive.
+ *@return the expression chunk needed, not padded with spaces on either side.
+ */
+ public String constructSubstringClause(String column, String regularExpression, boolean caseInsensitive)
+ {
+ // MHL for mysql
+ return quoteSQLString("");
+ }
+
/** Construct an offset/limit clause.
* This method constructs an offset/limit clause in the proper manner for the database in question.
*@param offset is the starting offset number.
Modified: incubator/lcf/trunk/modules/framework/core/src/main/java/org/apache/acf/core/database/DBInterfacePostgreSQL.java
URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/modules/framework/core/src/main/java/org/apache/acf/core/database/DBInterfacePostgreSQL.java?rev=998576&r1=998575&r2=998576&view=diff
==============================================================================
--- incubator/lcf/trunk/modules/framework/core/src/main/java/org/apache/acf/core/database/DBInterfacePostgreSQL.java (original)
+++ incubator/lcf/trunk/modules/framework/core/src/main/java/org/apache/acf/core/database/DBInterfacePostgreSQL.java Sun Sep 19 01:11:02 2010
@@ -820,6 +820,31 @@ public class DBInterfacePostgreSQL exten
return column + "~" + (caseInsensitive?"*":"") + regularExpression;
}
+ /** Construct a regular-expression substring clause.
+ * This method builds an expression that extracts a specified string section from a field, based on
+ * a regular expression.
+ *@param column is the column specifier string.
+ *@param regularExpression is the properly-quoted regular expression string, or "?" if a parameterized value is to be used.
+ *@param caseInsensitive is true if the regular expression match is to be case insensitive.
+ *@return the expression chunk needed, not padded with spaces on either side.
+ */
+ public String constructSubstringClause(String column, String regularExpression, boolean caseInsensitive)
+ {
+ StringBuffer sb = new StringBuffer();
+ sb.append("SUBSTRING(");
+ if (caseInsensitive)
+ sb.append("LOWER(").append(column).append(")");
+ else
+ sb.append(column);
+ sb.append(" FROM ");
+ if (caseInsensitive)
+ sb.append("LOWER(").append(regularExpression).append(")");
+ else
+ sb.append(regularExpression);
+ sb.append(")");
+ return sb.toString();
+ }
+
/** Construct an offset/limit clause.
* This method constructs an offset/limit clause in the proper manner for the database in question.
*@param offset is the starting offset number.
Modified: incubator/lcf/trunk/modules/framework/core/src/main/java/org/apache/acf/core/interfaces/IDBInterface.java
URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/modules/framework/core/src/main/java/org/apache/acf/core/interfaces/IDBInterface.java?rev=998576&r1=998575&r2=998576&view=diff
==============================================================================
--- incubator/lcf/trunk/modules/framework/core/src/main/java/org/apache/acf/core/interfaces/IDBInterface.java (original)
+++ incubator/lcf/trunk/modules/framework/core/src/main/java/org/apache/acf/core/interfaces/IDBInterface.java Sun Sep 19 01:11:02 2010
@@ -257,14 +257,24 @@ public interface IDBInterface
throws ACFException;
/** Construct a regular-expression match clause.
- * This method builds both the text part of a regular-expression match.
+ * This method builds a regular-expression match expression.
*@param column is the column specifier string.
*@param regularExpression is the properly-quoted regular expression string, or "?" if a parameterized value is to be used.
- *@param caseInsensitive is true of the regular expression match is to be case insensitive.
+ *@param caseInsensitive is true if the regular expression match is to be case insensitive.
*@return the query chunk needed, not padded with spaces on either side.
*/
public String constructRegexpClause(String column, String regularExpression, boolean caseInsensitive);
+ /** Construct a regular-expression substring clause.
+ * This method builds an expression that extracts a specified string section from a field, based on
+ * a regular expression.
+ *@param column is the column specifier string.
+ *@param regularExpression is the properly-quoted regular expression string, or "?" if a parameterized value is to be used.
+ *@param caseInsensitive is true if the regular expression match is to be case insensitive.
+ *@return the expression chunk needed, not padded with spaces on either side.
+ */
+ public String constructSubstringClause(String column, String regularExpression, boolean caseInsensitive);
+
/** Construct an offset/limit clause.
* This method constructs an offset/limit clause in the proper manner for the database in question.
*@param offset is the starting offset number.
Modified: incubator/lcf/trunk/modules/framework/pull-agent/src/main/java/org/apache/acf/crawler/jobs/JobManager.java
URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/modules/framework/pull-agent/src/main/java/org/apache/acf/crawler/jobs/JobManager.java?rev=998576&r1=998575&r2=998576&view=diff
==============================================================================
--- incubator/lcf/trunk/modules/framework/pull-agent/src/main/java/org/apache/acf/crawler/jobs/JobManager.java (original)
+++ incubator/lcf/trunk/modules/framework/pull-agent/src/main/java/org/apache/acf/crawler/jobs/JobManager.java Sun Sep 19 01:11:02 2010
@@ -5894,17 +5894,21 @@ public class JobManager implements IJobM
Long currentTime = new Long(System.currentTimeMillis());
- StringBuffer sb = new StringBuffer("SELECT ");
+ StringBuffer sb = new StringBuffer();
+ sb.append("SELECT t1.idbucket,SUM(t1.inactive) AS inactive,SUM(t1.processing) AS processing,SUM(t1.expiring) AS expiring,SUM(t1.deleting) AS deleting,")
+ .append("SUM(t1.processready) AS processready,SUM(t1.expireready) AS expireready,SUM(t1.processwaiting) AS processwaiting,SUM(t1.expirewaiting) AS expirewaiting,")
+ .append("SUM(t1.waitingforever) AS waitingforever FROM (SELECT ");
addBucketExtract(sb,"",jobQueue.docIDField,idBucketDescription);
sb.append(" AS idbucket,")
- .append("SUM(CASE")
+ .append("CASE")
.append(" WHEN ")
.append("(").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_COMPLETE)))
.append(" OR ").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PURGATORY)))
.append(")")
.append(" THEN 1 ELSE 0")
- .append(" END) AS inactive,")
- .append("SUM(CASE")
+ .append(" END")
+ .append(" AS inactive,")
+ .append("CASE")
.append(" WHEN ")
.append("(").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVE)))
.append(" OR ").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN)))
@@ -5913,8 +5917,9 @@ public class JobManager implements IJobM
.append(")")
.append(" AND (").append(jobQueue.checkActionField).append(" IS NULL OR ").append(jobQueue.checkActionField).append("=").append(database.quoteSQLString(jobQueue.actionToString(jobQueue.ACTION_RESCAN))).append(")")
.append(" THEN 1 ELSE 0")
- .append(" END) as processing,")
- .append("SUM(CASE")
+ .append(" END")
+ .append(" as processing,")
+ .append("CASE")
.append(" WHEN ")
.append("(").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVE)))
.append(" OR ").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN)))
@@ -5923,13 +5928,15 @@ public class JobManager implements IJobM
.append(")")
.append(" AND ").append(jobQueue.checkActionField).append("=").append(database.quoteSQLString(jobQueue.actionToString(jobQueue.ACTION_REMOVE)))
.append(" THEN 1 ELSE 0")
- .append(" END) as expiring,")
- .append("SUM(CASE")
+ .append(" END")
+ .append(" as expiring,")
+ .append("CASE")
.append(" WHEN ")
.append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_BEINGDELETED)))
.append(" THEN 1 ELSE 0")
- .append(" END) as deleting,")
- .append("SUM(CASE")
+ .append(" END")
+ .append(" as deleting,")
+ .append("CASE")
.append(" WHEN ")
.append("(").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDING)))
.append(" OR ").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY)))
@@ -5937,8 +5944,9 @@ public class JobManager implements IJobM
.append(" AND ").append(jobQueue.checkTimeField).append("<=").append(currentTime.toString())
.append(" AND (").append(jobQueue.checkActionField).append(" IS NULL OR ").append(jobQueue.checkActionField).append("=").append(database.quoteSQLString(jobQueue.actionToString(jobQueue.ACTION_RESCAN))).append(")")
.append(" THEN 1 ELSE 0")
- .append(" END) as processready,")
- .append("SUM(CASE")
+ .append(" END")
+ .append(" as processready,")
+ .append("CASE")
.append(" WHEN ")
.append("(").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDING)))
.append(" OR ").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY)))
@@ -5946,8 +5954,9 @@ public class JobManager implements IJobM
.append(" AND ").append(jobQueue.checkTimeField).append("<=").append(currentTime.toString())
.append(" AND ").append(jobQueue.checkActionField).append("=").append(database.quoteSQLString(jobQueue.actionToString(jobQueue.ACTION_REMOVE)))
.append(" THEN 1 ELSE 0")
- .append(" END) as expireready,")
- .append("SUM(CASE")
+ .append(" END")
+ .append(" as expireready,")
+ .append("CASE")
.append(" WHEN ")
.append("(").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDING)))
.append(" OR ").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY)))
@@ -5955,8 +5964,9 @@ public class JobManager implements IJobM
.append(" AND ").append(jobQueue.checkTimeField).append(">").append(currentTime.toString())
.append(" AND (").append(jobQueue.checkActionField).append(" IS NULL OR ").append(jobQueue.checkActionField).append("=").append(database.quoteSQLString(jobQueue.actionToString(jobQueue.ACTION_RESCAN))).append(")")
.append(" THEN 1 ELSE 0")
- .append(" END) as processwaiting,")
- .append("SUM(CASE")
+ .append(" END")
+ .append(" as processwaiting,")
+ .append("CASE")
.append(" WHEN ")
.append("(").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDING)))
.append(" OR ").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY)))
@@ -5964,18 +5974,20 @@ public class JobManager implements IJobM
.append(" AND ").append(jobQueue.checkTimeField).append(">").append(currentTime.toString())
.append(" AND ").append(jobQueue.checkActionField).append("=").append(database.quoteSQLString(jobQueue.actionToString(jobQueue.ACTION_REMOVE)))
.append(" THEN 1 ELSE 0")
- .append(" END) as expirewaiting,")
- .append("SUM(CASE")
+ .append(" END")
+ .append(" as expirewaiting,")
+ .append("CASE")
.append(" WHEN ")
.append("(").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDING)))
.append(" OR ").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY)))
.append(")")
.append(" AND ").append(jobQueue.checkTimeField).append(" IS NULL")
.append(" THEN 1 ELSE 0")
- .append(" END) as waitingforever");
+ .append(" END")
+ .append(" as waitingforever");
sb.append(" FROM ").append(jobQueue.getTableName());
addCriteria(sb,"",connectionName,filterCriteria,false);
- sb.append(" GROUP BY idbucket");
+ sb.append(") t1 GROUP BY idbucket");
addOrdering(sb,new String[]{"idbucket","inactive","processing","expiring","deleting","processready","expireready","processwaiting","expirewaiting","waitingforever"},sortOrder);
addLimits(sb,startRow,rowCount);
return database.performQuery(sb.toString(),null,null,null,rowCount,null);
@@ -5990,17 +6002,7 @@ public class JobManager implements IJobM
protected void addBucketExtract(StringBuffer sb, String columnPrefix, String columnName, BucketDescription bucketDesc)
{
boolean isSensitive = bucketDesc.isSensitive();
- sb.append("SUBSTRING(");
- if (!isSensitive)
- sb.append("LOWER(").append(columnPrefix).append(columnName).append(")");
- else
- sb.append(columnPrefix).append(columnName);
- sb.append(" FROM ");
- if (!isSensitive)
- sb.append("LOWER(").append(database.quoteSQLString(bucketDesc.getRegexp())).append(")");
- else
- sb.append(database.quoteSQLString(bucketDesc.getRegexp()));
- sb.append(")");
+ sb.append(database.constructSubstringClause(columnPrefix+columnName,database.quoteSQLString(bucketDesc.getRegexp()),!isSensitive));
}
/** Add criteria clauses to query.
Modified: incubator/lcf/trunk/modules/framework/pull-agent/src/main/java/org/apache/acf/crawler/repository/RepositoryHistoryManager.java
URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/modules/framework/pull-agent/src/main/java/org/apache/acf/crawler/repository/RepositoryHistoryManager.java?rev=998576&r1=998575&r2=998576&view=diff
==============================================================================
--- incubator/lcf/trunk/modules/framework/pull-agent/src/main/java/org/apache/acf/crawler/repository/RepositoryHistoryManager.java (original)
+++ incubator/lcf/trunk/modules/framework/pull-agent/src/main/java/org/apache/acf/crawler/repository/RepositoryHistoryManager.java Sun Sep 19 01:11:02 2010
@@ -287,7 +287,7 @@ public class RepositoryHistoryManager ex
if (set.getRowCount() < 1)
throw new ACFException("Expected at least one row");
IResultRow row = set.getRow(0);
- Long value = (Long)row.getValue("countcol");
+ Long value = new Long(row.getValue("countcol").toString());
return value.longValue();
}
@@ -477,19 +477,19 @@ public class RepositoryHistoryManager ex
{
// The query we'll use here will be:
//
- // SELECT substring(resultcode FROM '<result_regexp>') AS resultcodebucket,
+ // SELECT * FROM (SELECT substring(resultcode FROM '<result_regexp>') AS resultcodebucket,
// substring(entityidentifier FROM '<id_regexp>') AS idbucket,
- // COUNT('x') AS eventcount FROM repohistory WHERE <criteria>
- // GROUP BY resultcodebucket,idbucket
+ // COUNT('x') AS eventcount FROM repohistory WHERE <criteria>) t1
+ // GROUP BY t1.resultcodebucket,t1.idbucket
// ORDER BY xxx LIMIT yyy OFFSET zzz
- StringBuffer sb = new StringBuffer("SELECT ");
+ StringBuffer sb = new StringBuffer("SELECT t1.resultcodebucket,t1.idbucket,COUNT('x') AS eventcount FROM (SELECT ");
addBucketExtract(sb,"",resultCodeField,resultCodeBucket);
sb.append(" AS resultcodebucket, ");
addBucketExtract(sb,"",entityIdentifierField,idBucket);
- sb.append(" AS idbucket, COUNT('x') AS eventcount FROM ").append(getTableName());
+ sb.append(" AS idbucket FROM ").append(getTableName());
addCriteria(sb,"",connectionName,filterCriteria,false);
- sb.append(" GROUP BY resultcodebucket,idbucket");
+ sb.append(") t1 GROUP BY resultcodebucket,idbucket");
addOrdering(sb,new String[]{"eventcount","resultcodebucket","idbucket"},sort);
addLimits(sb,startRow,maxRowCount);
return performQuery(sb.toString(),null,null,null,maxRowCount);
@@ -502,17 +502,7 @@ public class RepositoryHistoryManager ex
protected void addBucketExtract(StringBuffer sb, String columnPrefix, String columnName, BucketDescription bucketDesc)
{
boolean isSensitive = bucketDesc.isSensitive();
- sb.append("SUBSTRING(");
- if (!isSensitive)
- sb.append("LOWER(").append(columnPrefix).append(columnName).append(")");
- else
- sb.append(columnPrefix).append(columnName);
- sb.append(" FROM ");
- if (!isSensitive)
- sb.append("LOWER(").append(quoteSQLString(bucketDesc.getRegexp())).append(")");
- else
- sb.append(quoteSQLString(bucketDesc.getRegexp()));
- sb.append(")");
+ sb.append(constructSubstringClause(columnPrefix+columnName,quoteSQLString(bucketDesc.getRegexp()),!isSensitive));
}
/** Add criteria clauses to query.