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/4286c92a Tree: http://git-wip-us.apache.org/repos/asf/oodt/tree/4286c92a Diff: http://git-wip-us.apache.org/repos/asf/oodt/diff/4286c92a Branch: refs/heads/master Commit: 4286c92a1329319c6ab0d317523c85bb1e924c15 Parents: 631cd23 Author: Tom Barber <[email protected]> Authored: Sat Oct 10 16:32:43 2015 +0100 Committer: Tom Barber <[email protected]> Committed: Sat Oct 10 16:32:43 2015 +0100 ---------------------------------------------------------------------- .../view/prompts/QueryBuilderPrompt.java | 39 ++-- .../cas/filemgr/catalog/DataSourceCatalog.java | 223 +++++++++---------- 2 files changed, 122 insertions(+), 140 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/oodt/blob/4286c92a/app/fmbrowser/src/main/java/org/apache/oodt/cas/filemgr/browser/view/prompts/QueryBuilderPrompt.java ---------------------------------------------------------------------- diff --git a/app/fmbrowser/src/main/java/org/apache/oodt/cas/filemgr/browser/view/prompts/QueryBuilderPrompt.java b/app/fmbrowser/src/main/java/org/apache/oodt/cas/filemgr/browser/view/prompts/QueryBuilderPrompt.java index 5204db5..b030ee6 100644 --- a/app/fmbrowser/src/main/java/org/apache/oodt/cas/filemgr/browser/view/prompts/QueryBuilderPrompt.java +++ b/app/fmbrowser/src/main/java/org/apache/oodt/cas/filemgr/browser/view/prompts/QueryBuilderPrompt.java @@ -17,35 +17,22 @@ package org.apache.oodt.cas.filemgr.browser.view.prompts; +import org.apache.oodt.cas.filemgr.browser.controller.WindowListener; +import org.apache.oodt.cas.filemgr.browser.model.CasDB; import org.apache.oodt.cas.filemgr.structs.RangeQueryCriteria; import org.apache.oodt.cas.filemgr.structs.TermQueryCriteria; -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.Font; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; -import javax.swing.BoxLayout; -import javax.swing.JButton; -import javax.swing.JComboBox; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; -import javax.swing.JTextField; +import javax.swing.*; import javax.swing.border.CompoundBorder; import javax.swing.border.EmptyBorder; import javax.swing.border.LineBorder; -import org.apache.oodt.cas.filemgr.browser.controller.WindowListener; -import org.apache.oodt.cas.filemgr.browser.model.CasDB; - public class QueryBuilderPrompt extends JFrame { protected CasDB database; @@ -292,22 +279,22 @@ public class QueryBuilderPrompt extends JFrame { } public String getQuery() { - String q = new String(); + StringBuilder q = new StringBuilder(); for (int i = 0; i < this.getComponentCount(); i++) { Component c = this.getComponent(i); if (c instanceof TermQueryPanel) { - q += ((TermQueryPanel) c).getOp() + " "; - q += ((TermQueryPanel) c).getElement() + ":"; - q += ((TermQueryPanel) c).getText() + " "; + q.append(((TermQueryPanel) c).getOp()).append(" "); + q.append(((TermQueryPanel) c).getElement()).append(":"); + q.append(((TermQueryPanel) c).getText()).append(" "); } else if (c instanceof RangeQueryPanel) { - q += ((RangeQueryPanel) c).getOp() + " "; - q += ((RangeQueryPanel) c).getElement() + ":["; - q += ((RangeQueryPanel) c).getStart() + " TO "; - q += ((RangeQueryPanel) c).getStop() + "] "; + q.append(((RangeQueryPanel) c).getOp()).append(" "); + q.append(((RangeQueryPanel) c).getElement()).append(":["); + q.append(((RangeQueryPanel) c).getStart()).append(" TO "); + q.append(((RangeQueryPanel) c).getStop()).append("] "); } } - return q; + return q.toString(); } public org.apache.oodt.cas.filemgr.structs.Query getCasQuery() { http://git-wip-us.apache.org/repos/asf/oodt/blob/4286c92a/filemgr/src/main/java/org/apache/oodt/cas/filemgr/catalog/DataSourceCatalog.java ---------------------------------------------------------------------- diff --git a/filemgr/src/main/java/org/apache/oodt/cas/filemgr/catalog/DataSourceCatalog.java b/filemgr/src/main/java/org/apache/oodt/cas/filemgr/catalog/DataSourceCatalog.java index 155e263..5a01e1f 100644 --- a/filemgr/src/main/java/org/apache/oodt/cas/filemgr/catalog/DataSourceCatalog.java +++ b/filemgr/src/main/java/org/apache/oodt/cas/filemgr/catalog/DataSourceCatalog.java @@ -828,15 +828,15 @@ public class DataSourceCatalog implements Catalog { conn = dataSource.getConnection(); statement = conn.createStatement(); - String getProductRefSql = "SELECT * FROM " + StringBuilder getProductRefSql = new StringBuilder("SELECT * FROM " + product.getProductType().getName() + "_reference" - + " WHERE product_id = " + quoteIt(product.getProductId()); + + " WHERE product_id = " + quoteIt(product.getProductId())); - if(this.orderedValues) getProductRefSql += " ORDER BY pkey"; + if(this.orderedValues) getProductRefSql.append(" ORDER BY pkey"); LOG.log(Level.FINE, "getProductReferences: Executing: " + getProductRefSql); - rs = statement.executeQuery(getProductRefSql); + rs = statement.executeQuery(getProductRefSql.toString()); references = new Vector<Reference>(); while (rs.next()) { @@ -1067,14 +1067,14 @@ public class DataSourceCatalog implements Catalog { conn = dataSource.getConnection(); statement = conn.createStatement(); - String metadataSql = "SELECT * FROM " + StringBuilder metadataSql = new StringBuilder("SELECT * FROM " + product.getProductType().getName() + "_metadata" - + " WHERE product_id = " + quoteIt(product.getProductId()); + + " WHERE product_id = " + quoteIt(product.getProductId())); - if(this.orderedValues) metadataSql += " ORDER BY pkey"; + if(this.orderedValues) metadataSql.append(" ORDER BY pkey"); LOG.log(Level.FINE, "getMetadata: Executing: " + metadataSql); - rs = statement.executeQuery(metadataSql); + rs = statement.executeQuery(metadataSql.toString()); m = new Metadata(); List<Element> elements = null; @@ -1153,20 +1153,23 @@ public class DataSourceCatalog implements Catalog { conn = dataSource.getConnection(); statement = conn.createStatement(); - String elementIds = ""; + StringBuilder elementIds = new StringBuilder(""); if (elems.size() > 0) { - elementIds += " AND (element_id = '" + this.validationLayer.getElementByName(elems.get(0)).getElementId() + "'"; + elementIds.append(" AND (element_id = '") + .append(this.validationLayer.getElementByName(elems.get(0)).getElementId + ()).append("'"); for (int i = 1; i < elems.size(); i++) - elementIds += " OR element_id = '" + this.validationLayer.getElementByName(elems.get(i)).getElementId() + "'"; - elementIds += ")"; + elementIds.append(" OR element_id = '").append(this.validationLayer.getElementByName(elems.get(i)) + .getElementId()).append("'"); + elementIds.append(")"); } - String metadataSql = "SELECT element_id,metadata_value FROM " + StringBuilder metadataSql = new StringBuilder("SELECT element_id,metadata_value FROM " + product.getProductType().getName() + "_metadata" - + " WHERE product_id = " + quoteIt(product.getProductId()) + elementIds; - if(this.orderedValues) metadataSql += " ORDER BY pkey"; + + " WHERE product_id = " + quoteIt(product.getProductId()) + elementIds); + if(this.orderedValues) metadataSql.append(" ORDER BY pkey"); LOG.log(Level.FINE, "getMetadata: Executing: " + metadataSql); - rs = statement.executeQuery(metadataSql); + rs = statement.executeQuery(metadataSql.toString()); m = new Metadata(); List<Element> elements = null; @@ -1274,24 +1277,24 @@ public class DataSourceCatalog implements Catalog { statement = conn.createStatement(); statement.setMaxRows(n); - String getProductSql = "SELECT products.* " + "FROM products "; + StringBuilder getProductSql = new StringBuilder("SELECT products.* " + "FROM products "); if (type != null && type.getProductTypeId() != null) { if (fieldIdStringFlag) { - getProductSql += "WHERE products.product_type_id = '" - + type.getProductTypeId() + "' "; + getProductSql.append("WHERE products.product_type_id = '").append(type.getProductTypeId()) + .append("' "); } else { - getProductSql += "WHERE products.product_type_id = " - + type.getProductTypeId() + " "; + getProductSql.append("WHERE products.product_type_id = ").append(type.getProductTypeId()) + .append(" "); } } - getProductSql += "ORDER BY products.product_id DESC"; + getProductSql.append("ORDER BY products.product_id DESC"); - LOG.log(Level.FINE, "getTopNProducts: executing: " + getProductSql); + LOG.log(Level.FINE, "getTopNProducts: executing: " + getProductSql.toString()); - rs = statement.executeQuery(getProductSql); + rs = statement.executeQuery(getProductSql.toString()); products = new Vector<Product>(); while (rs.next()) { @@ -1374,23 +1377,21 @@ public class DataSourceCatalog implements Catalog { statement = conn.createStatement(); // build up the sql statement - StringBuffer insertClauseSql = new StringBuffer(); - StringBuffer valueClauseSql = new StringBuffer(); + StringBuilder valueClauseSql = new StringBuilder(); - insertClauseSql.append("INSERT INTO " + metadataTable - + " (product_id, element_id, metadata_value) "); - valueClauseSql.append("VALUES "); + valueClauseSql.append("VALUES "); // now do the value clause if (fieldIdStringFlag) { - valueClauseSql.append("(" + product.getProductId() + ", '" - + element.getElementId() + "', '" + value + "')"); + valueClauseSql.append("(").append(product.getProductId()).append(", '").append(element.getElementId()) + .append("', '").append(value).append("')"); } else { - valueClauseSql.append("(" + product.getProductId() + ", " - + element.getElementId() + ", '" + value + "')"); + valueClauseSql.append("(").append(product.getProductId()).append(", ").append(element.getElementId()) + .append(", '").append(value).append("')"); } - String metaIngestSql = insertClauseSql.toString() + String metaIngestSql = ("INSERT INTO " + metadataTable + + " (product_id, element_id, metadata_value) ") + valueClauseSql.toString(); LOG .log(Level.FINE, "addMetadataValue: Executing: " @@ -1445,24 +1446,20 @@ public class DataSourceCatalog implements Catalog { statement = conn.createStatement(); // build up the sql statement - String metRemoveSql = "DELETE FROM " + metadataTable + " WHERE "; + StringBuilder metRemoveSql = new StringBuilder("DELETE FROM " + metadataTable + " WHERE "); if (fieldIdStringFlag) { - metRemoveSql += "PRODUCT_ID = '" + product.getProductId() - + "' AND "; - metRemoveSql += "ELEMENT_ID = '" + element.getElementId() - + "' AND "; - metRemoveSql += "METADATA_VALUE = '" + value + "'"; + metRemoveSql.append("PRODUCT_ID = '").append(product.getProductId()).append("' AND "); + metRemoveSql.append("ELEMENT_ID = '").append(element.getElementId()).append("' AND "); + metRemoveSql.append("METADATA_VALUE = '").append(value).append("'"); } else { - metRemoveSql += "PRODUCT_ID = " + product.getProductId() - + " AND "; - metRemoveSql += "ELEMENT_ID = " + element.getElementId() - + " AND "; - metRemoveSql += "METADATA_VALUE = " + value; + metRemoveSql.append("PRODUCT_ID = ").append(product.getProductId()).append(" AND "); + metRemoveSql.append("ELEMENT_ID = ").append(element.getElementId()).append(" AND "); + metRemoveSql.append("METADATA_VALUE = ").append(value); } LOG.log(Level.FINE, "removeMetadataValue: Executing: " + metRemoveSql); - statement.execute(metRemoveSql); + statement.execute(metRemoveSql.toString()); conn.commit(); } catch (Exception e) { e.printStackTrace(); @@ -1516,20 +1513,18 @@ public class DataSourceCatalog implements Catalog { conn.setAutoCommit(false); statement = conn.createStatement(); - String getProductSql = "SELECT COUNT(products.product_id) AS numProducts " - + "FROM products "; + StringBuilder getProductSql = new StringBuilder("SELECT COUNT(products.product_id) AS numProducts " + + "FROM products "); if (fieldIdStringFlag) { - getProductSql += "WHERE products.product_type_id = '" - + type.getProductTypeId() + "' "; + getProductSql.append("WHERE products.product_type_id = '").append(type.getProductTypeId()).append("' "); } else { - getProductSql += "WHERE products.product_type_id = " - + type.getProductTypeId() + " "; + getProductSql.append("WHERE products.product_type_id = ").append(type.getProductTypeId()).append(" "); } - LOG.log(Level.FINE, "getNumProducts: executing: " + getProductSql); + LOG.log(Level.FINE, "getNumProducts: executing: " + getProductSql.toString()); - rs = statement.executeQuery(getProductSql); + rs = statement.executeQuery(getProductSql.toString()); while (rs.next()) { numProducts = rs.getInt("numProducts"); @@ -1726,15 +1721,15 @@ public class DataSourceCatalog implements Catalog { conn = dataSource.getConnection(); statement = conn.createStatement(); - String getProductSql = ""; + StringBuilder getProductSql = new StringBuilder(""); String tableName = type.getName() + "_metadata"; String subSelectQueryBase = "SELECT product_id FROM " + tableName + " "; - StringBuffer selectClause = new StringBuffer( + StringBuilder selectClause = new StringBuilder( "SELECT COUNT(DISTINCT p.product_id) AS numResults "); - StringBuffer fromClause = new StringBuffer("FROM " + tableName + StringBuilder fromClause = new StringBuilder("FROM " + tableName + " p "); - StringBuffer whereClause = new StringBuffer("WHERE "); + StringBuilder whereClause = new StringBuilder("WHERE "); boolean gotFirstClause = false; int clauseNum = 0; @@ -1752,14 +1747,13 @@ public class DataSourceCatalog implements Catalog { elementIdStr = this.validationLayer.getElementByName(criteria.getElementName()).getElementId(); } - String clause = null; + StringBuilder clause = new StringBuilder(); if (!gotFirstClause) { - clause = "(p.element_id = " + elementIdStr + " AND "; + clause.append("(p.element_id = ").append(elementIdStr).append(" AND "); if (criteria instanceof TermQueryCriteria) { - clause += " metadata_value LIKE '%" - + ((TermQueryCriteria) criteria).getValue() - + "%') "; + clause.append(" metadata_value LIKE '%").append(((TermQueryCriteria) criteria).getValue()) + .append("%') "); } else if (criteria instanceof RangeQueryCriteria) { String startVal = ((RangeQueryCriteria) criteria) .getStartValue(); @@ -1770,46 +1764,43 @@ public class DataSourceCatalog implements Catalog { if ((startVal != null && !startVal.equals("")) || (endVal != null && !endVal.equals(""))) { - clause += " metadata_value "; + clause.append(" metadata_value "); boolean gotStart = false; if (startVal != null && !startVal.equals("")) { if (inclusive) - clause += ">= '" + startVal + "'"; + clause.append(">= '" + startVal + "'"); else - clause += "> '" + startVal + "'"; + clause.append("> '" + startVal + "'"); gotStart = true; } if (endVal != null && !endVal.equals("")) { if (gotStart) { if (inclusive) - clause += " AND metadata_value <= '" - + endVal + "'"; + clause.append(" AND metadata_value <= '").append(endVal).append("'"); else - clause += " AND metadata_value < '" - + endVal + "'"; + clause.append(" AND metadata_value < '").append(endVal).append("'"); } else if (inclusive) - clause += "<= '" + endVal + "'"; + clause.append("<= '").append(endVal).append("'"); else - clause += "< '" + endVal + "'"; + clause.append("< '").append(endVal).append("'"); } - clause += ") "; + clause.append(") "); } } whereClause.append(clause); gotFirstClause = true; } else { String subSelectTblName = "p" + clauseNum; - String subSelectQuery = subSelectQueryBase + StringBuilder subSelectQuery = new StringBuilder(subSelectQueryBase + "WHERE (element_id = " + elementIdStr - + " AND "; + + " AND "); if (criteria instanceof TermQueryCriteria) { - subSelectQuery += " metadata_value LIKE '%" - + ((TermQueryCriteria) criteria).getValue() - + "%')"; + subSelectQuery.append(" metadata_value LIKE '%") + .append(((TermQueryCriteria) criteria).getValue()).append("%')"); } else if (criteria instanceof RangeQueryCriteria) { String startVal = ((RangeQueryCriteria) criteria) .getStartValue(); @@ -1817,29 +1808,28 @@ public class DataSourceCatalog implements Catalog { .getEndValue(); if (startVal != null || endVal != null) { - subSelectQuery += " metadata_value "; + subSelectQuery.append(" metadata_value "); boolean gotStart = false; if (startVal != null && !startVal.equals("")) { - subSelectQuery += ">= '" + startVal + "'"; + subSelectQuery.append(">= '").append(startVal).append("'"); gotStart = true; } if (endVal != null && !endVal.equals("")) { if (gotStart) { - subSelectQuery += " AND metadata_value <= '" - + endVal + "'"; + subSelectQuery.append(" AND metadata_value <= '").append(endVal).append("'"); } else - subSelectQuery += "<= '" + endVal + "'"; + subSelectQuery.append("<= '").append(endVal).append("'"); } - subSelectQuery += ") "; + subSelectQuery.append(") "); } } - fromClause.append("INNER JOIN (" + subSelectQuery + fromClause.append("INNER JOIN (" + subSelectQuery.toString() + ") " + subSelectTblName + " ON " + subSelectTblName + ".product_id = p.product_id "); @@ -1848,16 +1838,16 @@ public class DataSourceCatalog implements Catalog { } } - getProductSql = selectClause.toString() + fromClause.toString(); + getProductSql.append(selectClause.toString() + fromClause.toString()); if (gotFirstClause) { - getProductSql += whereClause.toString(); + getProductSql.append(whereClause.toString()); } LOG.log(Level.FINE, "catalog get num results: executing: " - + getProductSql); + + getProductSql.toString()); - rs = statement.executeQuery(getProductSql); + rs = statement.executeQuery(getProductSql.toString()); while (rs.next()) { resultCount = rs.getInt("numResults"); @@ -2014,36 +2004,38 @@ public class DataSourceCatalog implements Catalog { statement = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); - String getProductSql = null; + StringBuilder getProductSql = new StringBuilder(); if (!productIdString) { if (query.getCriteria().size() == 0) { - getProductSql = "SELECT DISTINCT product_id FROM " + type.getName() + "_metadata"; + getProductSql.append("SELECT DISTINCT product_id FROM " + type.getName() + "_metadata"); }else if (query.getCriteria().size() == 1) { - getProductSql = this.getSqlQuery(query.getCriteria().get(0), type); + getProductSql.append(this.getSqlQuery(query.getCriteria().get(0), type)); }else { - getProductSql = this.getSqlQuery(new BooleanQueryCriteria(query.getCriteria(), BooleanQueryCriteria.AND), type); + getProductSql.append(this.getSqlQuery(new BooleanQueryCriteria(query.getCriteria(), BooleanQueryCriteria + .AND), type)); } - getProductSql += " ORDER BY product_id DESC "; + getProductSql.append(" ORDER BY product_id DESC "); } else { if (query.getCriteria().size() == 0) { - getProductSql = "SELECT DISTINCT products.product_id FROM products, " + type.getName() + "_metadata" - + " WHERE products.product_id="+type.getName() + "_metadata.product_id"; + getProductSql.append("SELECT DISTINCT products.product_id FROM products, " + type.getName() + "_metadata" + + " WHERE products.product_id="+type.getName() + "_metadata.product_id"); } else if (query.getCriteria().size() == 1) { - getProductSql = this.getSqlQuery(query.getCriteria().get(0), type); + getProductSql.append(this.getSqlQuery(query.getCriteria().get(0), type)); } else { - getProductSql = this.getSqlQuery(new BooleanQueryCriteria(query.getCriteria(), BooleanQueryCriteria.AND), type); + getProductSql.append(this.getSqlQuery(new BooleanQueryCriteria(query.getCriteria(), BooleanQueryCriteria + .AND), type)); } - getProductSql += " ORDER BY products.product_datetime DESC "; + getProductSql.append(" ORDER BY products.product_datetime DESC "); } - LOG.log(Level.FINE, "catalog query: executing: " + getProductSql); + LOG.log(Level.FINE, "catalog query: executing: " + getProductSql.toString()); - rs = statement.executeQuery(getProductSql); + rs = statement.executeQuery(getProductSql.toString()); List<String> productIds = new Vector<String>(); if (doSkip) { @@ -2133,37 +2125,40 @@ public class DataSourceCatalog implements Catalog { } protected String getSqlQuery(QueryCriteria queryCriteria, ProductType type) throws ValidationLayerException, CatalogException { - String sqlQuery = null; + StringBuilder sqlQuery = new StringBuilder(); if (queryCriteria instanceof BooleanQueryCriteria) { BooleanQueryCriteria bqc = (BooleanQueryCriteria) queryCriteria; if (bqc.getOperator() == BooleanQueryCriteria.NOT) { if (!this.productIdString) { - sqlQuery = "SELECT DISTINCT product_id FROM " + type.getName() + "_metadata WHERE product_id NOT IN (" + this.getSqlQuery(bqc.getTerms().get(0), type) + ")"; + sqlQuery.append("SELECT DISTINCT product_id FROM " + type.getName() + "_metadata WHERE product_id " + + "NOT IN (" + this.getSqlQuery(bqc.getTerms().get(0), type) + ")"); } else { - sqlQuery = "SELECT DISTINCT products.product_id FROM products," + type.getName() + "_metadata" + sqlQuery.append("SELECT DISTINCT products.product_id FROM products," + type.getName() + "_metadata" + " WHERE products.product_id="+type.getName() + "_metadata.product_id" - + " AND products.product_id NOT IN (" + this.getSqlQuery(bqc.getTerms().get(0), type) + ")"; + + " AND products.product_id NOT IN (" + this.getSqlQuery(bqc.getTerms().get + (0), type) + ")"); } }else { - sqlQuery = "(" + this.getSqlQuery(bqc.getTerms().get(0), type); + sqlQuery.append("(" + this.getSqlQuery(bqc.getTerms().get(0), type)); String op = bqc.getOperator() == BooleanQueryCriteria.AND ? "INTERSECT" : "UNION"; for (int i = 1; i < bqc.getTerms().size(); i++) - sqlQuery += ") " + op + " (" + this.getSqlQuery(bqc.getTerms().get(i), type); - sqlQuery += ")"; + sqlQuery.append(") " + op + " (" + this.getSqlQuery(bqc.getTerms().get(i), type)); + sqlQuery.append(")"); } }else { String elementIdStr = this.validationLayer.getElementByName(queryCriteria.getElementName()).getElementId(); if (fieldIdStringFlag) elementIdStr = "'" + elementIdStr + "'"; if (!this.productIdString) { - sqlQuery = "SELECT DISTINCT product_id FROM " + type.getName() + "_metadata WHERE element_id = " + elementIdStr + " AND "; + sqlQuery.append("SELECT DISTINCT product_id FROM " + type.getName() + "_metadata WHERE element_id = " + + elementIdStr + " AND "); } else { - sqlQuery = "SELECT DISTINCT products.product_id FROM products," + type.getName() + "_metadata" + sqlQuery.append("SELECT DISTINCT products.product_id FROM products," + type.getName() + "_metadata" + " WHERE products.product_id="+type.getName() + "_metadata.product_id" - + " AND element_id = " + elementIdStr + " AND "; + + " AND element_id = " + elementIdStr + " AND "); } if (queryCriteria instanceof TermQueryCriteria) { - sqlQuery += "metadata_value = '" + ((TermQueryCriteria) queryCriteria).getValue() + "'"; + sqlQuery.append("metadata_value = '" + ((TermQueryCriteria) queryCriteria).getValue() + "'"); } else if (queryCriteria instanceof RangeQueryCriteria) { RangeQueryCriteria rqc = (RangeQueryCriteria) queryCriteria; String rangeSubQuery = null; @@ -2175,13 +2170,13 @@ public class DataSourceCatalog implements Catalog { else rangeSubQuery = "(" + rangeSubQuery + " AND metadata_value" + (rqc.getInclusive() ? " <= " : " < ") + "'" + rqc.getEndValue() + "')"; } - sqlQuery += rangeSubQuery; + sqlQuery.append(rangeSubQuery); } else { throw new CatalogException("Invalid QueryCriteria [" + queryCriteria.getClass().getCanonicalName() + "]"); } } - return sqlQuery; + return sqlQuery.toString(); } private synchronized void updateReferences(Product product)
