OODT-888 replace =+ with StringBuilder to improve concat performance
Project: http://git-wip-us.apache.org/repos/asf/oodt/repo Commit: http://git-wip-us.apache.org/repos/asf/oodt/commit/b2227f8a Tree: http://git-wip-us.apache.org/repos/asf/oodt/tree/b2227f8a Diff: http://git-wip-us.apache.org/repos/asf/oodt/diff/b2227f8a Branch: refs/heads/master Commit: b2227f8ab10276a1f66c4ae4ac81901d37405cec Parents: 616387d Author: Tom Barber <[email protected]> Authored: Sat Oct 10 14:33:57 2015 +0100 Committer: Tom Barber <[email protected]> Committed: Sat Oct 10 14:33:57 2015 +0100 ---------------------------------------------------------------------- CHANGES.txt | 2 +- .../struct/impl/index/DataSourceIndex.java | 98 ++++++++++---------- 2 files changed, 49 insertions(+), 51 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/oodt/blob/b2227f8a/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index b30b5dd..b339ec3 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -12,7 +12,7 @@ Release 0.11 - Current Development * OODT-887 Prevent DNS resolution on URL Lookup (magicaltrout) -* OODT-888 Replace =+ with StringBuilders to improve performance (magicaltrout) +* OODT-888 Replace += with StringBuilders to improve performance (magicaltrout) Release 0.10 - 08/30/2015 http://git-wip-us.apache.org/repos/asf/oodt/blob/b2227f8a/catalog/src/main/java/org/apache/oodt/cas/catalog/struct/impl/index/DataSourceIndex.java ---------------------------------------------------------------------- diff --git a/catalog/src/main/java/org/apache/oodt/cas/catalog/struct/impl/index/DataSourceIndex.java b/catalog/src/main/java/org/apache/oodt/cas/catalog/struct/impl/index/DataSourceIndex.java index a046263..e7083ed 100644 --- a/catalog/src/main/java/org/apache/oodt/cas/catalog/struct/impl/index/DataSourceIndex.java +++ b/catalog/src/main/java/org/apache/oodt/cas/catalog/struct/impl/index/DataSourceIndex.java @@ -17,26 +17,6 @@ package org.apache.oodt.cas.catalog.struct.impl.index; //JDK imports -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import java.net.URLEncoder; -import java.sql.Connection; -import java.sql.ResultSet; -import java.sql.Statement; -import java.util.Calendar; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.Vector; -import java.util.logging.Level; -import java.util.logging.Logger; - -//SQL imports -import javax.sql.DataSource; - -//OODT imports import org.apache.commons.lang.StringUtils; import org.apache.oodt.cas.catalog.exception.CatalogIndexException; import org.apache.oodt.cas.catalog.exception.IngestServiceException; @@ -45,22 +25,26 @@ import org.apache.oodt.cas.catalog.page.IndexPager; import org.apache.oodt.cas.catalog.page.IngestReceipt; import org.apache.oodt.cas.catalog.page.PageInfo; import org.apache.oodt.cas.catalog.page.ProcessedPageInfo; -import org.apache.oodt.cas.catalog.query.ComparisonQueryExpression; -import org.apache.oodt.cas.catalog.query.NotQueryExpression; -import org.apache.oodt.cas.catalog.query.QueryExpression; -import org.apache.oodt.cas.catalog.query.QueryLogicalGroup; -import org.apache.oodt.cas.catalog.query.StdQueryExpression; -import org.apache.oodt.cas.catalog.struct.Index; -import org.apache.oodt.cas.catalog.struct.IngestService; -import org.apache.oodt.cas.catalog.struct.QueryService; -import org.apache.oodt.cas.catalog.struct.TransactionId; -import org.apache.oodt.cas.catalog.struct.TransactionIdFactory; +import org.apache.oodt.cas.catalog.query.*; +import org.apache.oodt.cas.catalog.struct.*; import org.apache.oodt.cas.catalog.struct.impl.transaction.UuidTransactionIdFactory; import org.apache.oodt.cas.catalog.term.Term; import org.apache.oodt.cas.catalog.term.TermBucket; import org.apache.oodt.commons.database.DatabaseConnectionBuilder; import org.apache.oodt.commons.date.DateUtils; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.Statement; +import java.util.*; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.sql.DataSource; + /** * * DataSource Indexer which supports both ingest and query @@ -388,9 +372,11 @@ public class DataSourceIndex implements Index, IngestService, QueryService { try { conn = this.dataSource.getConnection(); stmt = conn.createStatement(); - String sqlQuery = "SELECT DISTINCT transaction_id,transaction_date FROM transactions WHERE transaction_id IN (" + this.getSqlQuery(queryExpression) + ")"; + String sqlQuery = "SELECT DISTINCT transaction_id,transaction_date FROM transactions " + + "WHERE " + + "transaction_id IN (" + this.getSqlQuery(queryExpression) + ")"; LOG.log(Level.INFO, "Performing Query: " + sqlQuery); - rs = stmt.executeQuery(sqlQuery); + rs = stmt.executeQuery(sqlQuery); List<IngestReceipt> receipts = new Vector<IngestReceipt>(); while (rs.next()) @@ -418,9 +404,10 @@ public class DataSourceIndex implements Index, IngestService, QueryService { try { conn = this.dataSource.getConnection(); stmt = conn.createStatement(); - String sqlQuery = "SELECT DISTINCT transaction_id,transaction_date FROM transactions WHERE transaction_id IN (" + this.getSqlQuery(queryExpression) + ")"; + String sqlQuery = "SELECT DISTINCT transaction_id,transaction_date FROM transactions WHERE " + + "transaction_id IN (" + this.getSqlQuery(queryExpression) + ")"; LOG.log(Level.INFO, "Performing Query: " + sqlQuery); - rs = stmt.executeQuery(sqlQuery); + rs = stmt.executeQuery(sqlQuery); List<IngestReceipt> receipts = new Vector<IngestReceipt>(); int index = 0; @@ -451,9 +438,11 @@ public class DataSourceIndex implements Index, IngestService, QueryService { try { conn = this.dataSource.getConnection(); stmt = conn.createStatement(); - String sqlQuery = "SELECT COUNT(transaction_id) AS numTransactions FROM transactions WHERE transaction_id IN (" + this.getSqlQuery(queryExpression) + ")"; + String sqlQuery = "SELECT COUNT(transaction_id) AS numTransactions FROM transactions " + + "WHERE " + + "transaction_id IN (" + this.getSqlQuery(queryExpression) + ")"; LOG.log(Level.INFO, "Performing Query: " + sqlQuery); - rs = stmt.executeQuery(sqlQuery); + rs = stmt.executeQuery(sqlQuery); int numTransactions = 0; while (rs.next()) @@ -477,21 +466,24 @@ public class DataSourceIndex implements Index, IngestService, QueryService { private String getSqlQuery(QueryExpression queryExpression) throws QueryServiceException, UnsupportedEncodingException { - String sqlQuery = null; - String bucketNameFilter = ""; + StringBuilder sqlQuery = new StringBuilder(); + StringBuilder bucketNameFilter = new StringBuilder(""); if (queryExpression.getBucketNames() != null) { if (queryExpression.getBucketNames().size() == 1) - bucketNameFilter += "bucket_name = '" + queryExpression.getBucketNames().iterator().next() + "' AND "; + bucketNameFilter.append("bucket_name = '").append(queryExpression.getBucketNames().iterator().next()) + .append("' ").append("AND "); else if (queryExpression.getBucketNames().size() > 1) - bucketNameFilter += "(bucket_name = '" + StringUtils.join(queryExpression.getBucketNames().iterator(), "' OR bucket_name = '") + "') AND "; + bucketNameFilter.append("(bucket_name = '") + .append(StringUtils.join(queryExpression.getBucketNames().iterator(), + "' OR bucket_name = '")).append("') AND "); } if (queryExpression instanceof QueryLogicalGroup) { QueryLogicalGroup qlg = (QueryLogicalGroup) queryExpression; - sqlQuery = "(" + this.getSqlQuery(qlg.getExpressions().get(0)); + sqlQuery.append("(").append(this.getSqlQuery(qlg.getExpressions().get(0))); String op = qlg.getOperator() == QueryLogicalGroup.Operator.AND ? "INTERSECT" : "UNION"; for (int i = 1; i < qlg.getExpressions().size(); i++) - sqlQuery += ") " + op + " (" + this.getSqlQuery(qlg.getExpressions().get(i)); - sqlQuery += ")"; + sqlQuery.append(") ").append(op).append(" (").append(this.getSqlQuery(qlg.getExpressions().get(i))); + sqlQuery.append(")"); }else if (queryExpression instanceof ComparisonQueryExpression){ ComparisonQueryExpression cqe = (ComparisonQueryExpression) queryExpression; String operator = null; @@ -509,23 +501,29 @@ public class DataSourceIndex implements Index, IngestService, QueryService { throw new QueryServiceException("Invalid ComparisonQueryExpression Operator '" + cqe.getOperator() + "'"); } - sqlQuery = "SELECT DISTINCT transaction_id FROM transaction_terms WHERE " + bucketNameFilter + " term_name = '" + cqe.getTerm().getName() + "' AND ("; + sqlQuery.append("SELECT DISTINCT transaction_id FROM transaction_terms WHERE ") + .append(bucketNameFilter.toString()).append(" ").append("term_name = '") + .append(cqe.getTerm().getName()).append("' AND ("); for (int i = 0; i < cqe.getTerm().getValues().size(); i++) { String value = cqe.getTerm().getValues().get(i); - sqlQuery += "term_value " + operator + " '" + (this.useUTF8 ? URLEncoder.encode(value, "UTF-8") : value) + "'"; + sqlQuery.append("term_value ").append(operator).append(" '") + .append(this.useUTF8 ? URLEncoder.encode(value, "UTF-8") : value).append("'"); if ((i + 1) < cqe.getTerm().getValues().size()) - sqlQuery += " OR "; + sqlQuery.append(" OR "); } - sqlQuery += ")"; + sqlQuery.append(")"); }else if (queryExpression instanceof NotQueryExpression) { NotQueryExpression nqe = (NotQueryExpression) queryExpression; - sqlQuery = "SELECT DISTINCT transaction_id FROM transaction_terms WHERE " + bucketNameFilter + " NOT (" + this.getSqlQuery(nqe.getQueryExpression()) + ")"; + sqlQuery.append("SELECT DISTINCT transaction_id FROM transaction_terms WHERE ") + .append(bucketNameFilter.toString()).append(" NOT (") + .append(this.getSqlQuery(nqe.getQueryExpression())).append(")"); }else if (queryExpression instanceof StdQueryExpression) { - sqlQuery = "SELECT DISTINCT transaction_id FROM transaction_terms " + bucketNameFilter; + sqlQuery.append("SELECT DISTINCT transaction_id FROM transaction_terms ") + .append(bucketNameFilter.toString()); }else { throw new QueryServiceException("Invalid QueryExpression '" + queryExpression.getClass().getCanonicalName() + "'"); } - return sqlQuery; + return sqlQuery.toString(); } }
