diff --git a/utils/src/com/cloud/utils/db/GenericDao.java b/utils/src/com/cloud/utils/db/GenericDao.java index 392fbe418de..5d661182a62 100755 --- a/utils/src/com/cloud/utils/db/GenericDao.java +++ b/utils/src/com/cloud/utils/db/GenericDao.java @@ -152,8 +152,23 @@ public interface GenericDao { */ List search(SearchCriteria sc, Filter filter); + + /** + * Search for the entity beans using the sql SQL_CACHE option + * @param sc + * @param filter + * @param enable_query_cache + * @return list of entity beans. + */ + List search(SearchCriteria sc, Filter filter, final boolean enable_query_cache); + + List searchIncludingRemoved(SearchCriteria sc, final Filter filter, final Boolean lock, final boolean cache); + + List searchIncludingRemoved(SearchCriteria sc, final Filter filter, final Boolean lock, final boolean cache, final boolean enable_query_cache); + + /** * Customized search with SearchCritiria * @param sc diff --git a/utils/src/com/cloud/utils/db/GenericDaoBase.java b/utils/src/com/cloud/utils/db/GenericDaoBase.java index 44bc699a7d6..9240b4083ad 100755 --- a/utils/src/com/cloud/utils/db/GenericDaoBase.java +++ b/utils/src/com/cloud/utils/db/GenericDaoBase.java @@ -126,6 +126,7 @@ public abstract class GenericDaoBase implements Gene // This is private on purpose. Everyone should use createPartialSelectSql() private final Pair _partialSelectSql; + private final Pair _partialQueryCacheSelectSql; protected StringBuilder _discriminatorClause; protected Map _discriminatorValues; protected String _selectByIdSql; @@ -176,7 +177,7 @@ public abstract class GenericDaoBase implements Gene public final Map getAllAttributes() { return _allAttributes; } - + @SuppressWarnings("unchecked") protected GenericDaoBase() { Type t = getClass().getGenericSuperclass(); @@ -199,7 +200,8 @@ public abstract class GenericDaoBase implements Gene _table = DbUtil.getTableName(_entityBeanType); final SqlGenerator generator = new SqlGenerator(_entityBeanType); - _partialSelectSql = generator.buildSelectSql(); + _partialSelectSql = generator.buildSelectSql(false); + _partialQueryCacheSelectSql = generator.buildSelectSql(true); _embeddedFields = generator.getEmbeddedFields(); _insertSqls = generator.buildInsertSqls(); final Pair> dc = generator.buildDiscriminatorClause(); @@ -324,14 +326,30 @@ public abstract class GenericDaoBase implements Gene return searchIncludingRemoved(sc, filter, lock, cache); } + @DB(txn=false) + protected List search(SearchCriteria sc, final Filter filter, final Boolean lock, final boolean cache, final boolean enable_query_cache) { + if (_removed != null) { + if (sc == null) { + sc = createSearchCriteria(); + } + sc.addAnd(_removed.second().field.getName(), SearchCriteria.Op.NULL); + } + return searchIncludingRemoved(sc, filter, lock, cache, enable_query_cache); + } + @Override public List searchIncludingRemoved(SearchCriteria sc, final Filter filter, final Boolean lock, final boolean cache) { + return searchIncludingRemoved(sc, filter, lock, cache, false) ; + } + + public List searchIncludingRemoved(SearchCriteria sc, final Filter filter, final Boolean lock, + final boolean cache, final boolean enable_query_cache) { String clause = sc != null ? sc.getWhereClause() : null; if (clause != null && clause.length() == 0) { clause = null; } - final StringBuilder str = createPartialSelectSql(sc, clause != null); + final StringBuilder str = createPartialSelectSql(sc, clause != null, enable_query_cache); if (clause != null) { str.append(clause); } @@ -354,7 +372,7 @@ public abstract class GenericDaoBase implements Gene } final String sql = str.toString(); - + PreparedStatement pstmt = null; final List result = new ArrayList(); try { @@ -1104,6 +1122,21 @@ public abstract class GenericDaoBase implements Gene } } + @DB(txn=false) + protected StringBuilder createPartialSelectSql(SearchCriteria sc, final boolean whereClause, final boolean enable_query_cache) { + StringBuilder sql = new StringBuilder(enable_query_cache ? _partialQueryCacheSelectSql.first() : _partialSelectSql.first()); + if (sc != null && !sc.isSelectAll()) { + sql.delete(7, sql.indexOf(" FROM")); + sc.getSelect(sql, 7); + } + + if (!whereClause) { + sql.delete(sql.length() - (_discriminatorClause == null ? 6 : 4), sql.length()); + } + + return sql; + } + @DB(txn=false) protected StringBuilder createPartialSelectSql(SearchCriteria sc, final boolean whereClause) { StringBuilder sql = new StringBuilder(_partialSelectSql.first()); @@ -1158,6 +1191,11 @@ public abstract class GenericDaoBase implements Gene return search(sc, filter, null, false); } + @Override @DB(txn=false) + public List search(final SearchCriteria sc, final Filter filter, final boolean enable_query_cache) { + return search(sc, filter, null, false, enable_query_cache); + } + @Override @DB(txn=false) public boolean update(ID id, T entity) { assert Enhancer.isEnhanced(entity.getClass()) : "Entity is not generated by this dao"; diff --git a/utils/src/com/cloud/utils/db/SqlGenerator.java b/utils/src/com/cloud/utils/db/SqlGenerator.java index f48320240a6..223429d1087 100755 --- a/utils/src/com/cloud/utils/db/SqlGenerator.java +++ b/utils/src/com/cloud/utils/db/SqlGenerator.java @@ -565,8 +565,10 @@ public class SqlGenerator { return sql.toString(); } - public Pair buildSelectSql() { + public Pair buildSelectSql(boolean enable_query_cache) { StringBuilder sql = new StringBuilder("SELECT "); + + sql.append(enable_query_cache ? "SQL_CACHE ": ""); ArrayList attrs = new ArrayList();