Details
diff --git a/account/src/main/java/com/ning/billing/account/dao/DefaultAccountDao.java b/account/src/main/java/com/ning/billing/account/dao/DefaultAccountDao.java
index 15809c7..f0dbd25 100644
--- a/account/src/main/java/com/ning/billing/account/dao/DefaultAccountDao.java
+++ b/account/src/main/java/com/ning/billing/account/dao/DefaultAccountDao.java
@@ -111,7 +111,12 @@ public class DefaultAccountDao extends EntityDaoBase<AccountModelDao, Account, A
return paginationHelper.getPagination(AccountSqlDao.class,
new PaginationIteratorBuilder<AccountModelDao, Account, AccountSqlDao>() {
@Override
- public Iterator<AccountModelDao> build(final AccountSqlDao accountSqlDao, final Long limit) {
+ public Long getCount(final AccountSqlDao accountSqlDao, final InternalTenantContext context) {
+ return accountSqlDao.getSearchCount(searchKey, String.format("%%%s%%", searchKey), context);
+ }
+
+ @Override
+ public Iterator<AccountModelDao> build(final AccountSqlDao accountSqlDao, final Long limit, final InternalTenantContext context) {
return accountSqlDao.search(searchKey, String.format("%%%s%%", searchKey), offset, limit, context);
}
},
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
index e10b94a..678df99 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
@@ -58,6 +58,7 @@ import com.google.common.base.Function;
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
+import com.google.common.collect.Iterators;
import com.google.common.collect.Ordering;
import com.google.inject.Inject;
@@ -252,11 +253,29 @@ public class DefaultInvoiceDao extends EntityDaoBase<InvoiceModelDao, Invoice, I
@Override
public Pagination<InvoiceModelDao> searchInvoices(final String searchKey, final Long offset, final Long limit, final InternalTenantContext context) {
+ Integer invoiceNumberParsed = null;
+ try {
+ invoiceNumberParsed = Integer.parseInt(searchKey);
+ } catch (final NumberFormatException ignored) {
+ }
+
+ final Integer invoiceNumber = invoiceNumberParsed;
return paginationHelper.getPagination(InvoiceSqlDao.class,
new PaginationIteratorBuilder<InvoiceModelDao, Invoice, InvoiceSqlDao>() {
@Override
- public Iterator<InvoiceModelDao> build(final InvoiceSqlDao invoiceSqlDao, final Long limit) {
- return invoiceSqlDao.search(searchKey, String.format("%%%s%%", searchKey), offset, limit, context);
+ public Long getCount(final InvoiceSqlDao invoiceSqlDao, final InternalTenantContext context) {
+ return invoiceNumber != null ? 1L : invoiceSqlDao.getSearchCount(searchKey, String.format("%%%s%%", searchKey), context);
+ }
+
+ @Override
+ public Iterator<InvoiceModelDao> build(final InvoiceSqlDao invoiceSqlDao, final Long limit, final InternalTenantContext context) {
+ try {
+ return invoiceNumber != null ?
+ ImmutableList.<InvoiceModelDao>of(getByNumber(invoiceNumber, context)).iterator() :
+ invoiceSqlDao.search(searchKey, String.format("%%%s%%", searchKey), offset, limit, context);
+ } catch (final InvoiceApiException ignored) {
+ return Iterators.<InvoiceModelDao>emptyIterator();
+ }
}
},
offset,
diff --git a/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoiceSqlDao.sql.stg b/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoiceSqlDao.sql.stg
index aabe831..8daa8b1 100644
--- a/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoiceSqlDao.sql.stg
+++ b/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoiceSqlDao.sql.stg
@@ -38,9 +38,8 @@ getInvoicesBySubscription() ::= <<
searchQuery(prefix) ::= <<
<idField(prefix)> = :searchKey
- or <recordIdField(prefix)> = :searchKey
- or <prefix>.account_id = :searchKey
- or <prefix>.currency = :searchKey
+ or <prefix>account_id = :searchKey
+ or <prefix>currency = :searchKey
>>
getInvoiceIdByPaymentId() ::= <<
diff --git a/payment/src/main/java/com/ning/billing/payment/dao/DefaultPaymentDao.java b/payment/src/main/java/com/ning/billing/payment/dao/DefaultPaymentDao.java
index 0aedc0c..e6c87d1 100644
--- a/payment/src/main/java/com/ning/billing/payment/dao/DefaultPaymentDao.java
+++ b/payment/src/main/java/com/ning/billing/payment/dao/DefaultPaymentDao.java
@@ -170,7 +170,12 @@ public class DefaultPaymentDao implements PaymentDao {
return paginationHelper.getPagination(RefundSqlDao.class,
new PaginationIteratorBuilder<RefundModelDao, Refund, RefundSqlDao>() {
@Override
- public Iterator<RefundModelDao> build(final RefundSqlDao refundSqlDao, final Long limit) {
+ public Long getCount(final RefundSqlDao refundSqlDao, final InternalTenantContext context) {
+ return refundSqlDao.getCountByPluginName(pluginName, context);
+ }
+
+ @Override
+ public Iterator<RefundModelDao> build(final RefundSqlDao refundSqlDao, final Long limit, final InternalTenantContext context) {
return refundSqlDao.getByPluginName(pluginName, offset, limit, context);
}
},
@@ -244,7 +249,12 @@ public class DefaultPaymentDao implements PaymentDao {
return paginationHelper.getPagination(PaymentMethodSqlDao.class,
new PaginationIteratorBuilder<PaymentMethodModelDao, PaymentMethod, PaymentMethodSqlDao>() {
@Override
- public Iterator<PaymentMethodModelDao> build(final PaymentMethodSqlDao paymentMethodSqlDao, final Long limit) {
+ public Long getCount(final PaymentMethodSqlDao paymentMethodSqlDao, final InternalTenantContext context) {
+ return paymentMethodSqlDao.getCountByPluginName(pluginName, context);
+ }
+
+ @Override
+ public Iterator<PaymentMethodModelDao> build(final PaymentMethodSqlDao paymentMethodSqlDao, final Long limit, final InternalTenantContext context) {
return paymentMethodSqlDao.getByPluginName(pluginName, offset, limit, context);
}
},
@@ -309,7 +319,12 @@ public class DefaultPaymentDao implements PaymentDao {
return paginationHelper.getPagination(PaymentSqlDao.class,
new PaginationIteratorBuilder<PaymentModelDao, Payment, PaymentSqlDao>() {
@Override
- public Iterator<PaymentModelDao> build(final PaymentSqlDao paymentSqlDao, final Long limit) {
+ public Long getCount(final PaymentSqlDao paymentSqlDao, final InternalTenantContext context) {
+ return paymentSqlDao.getCountByPluginName(pluginName, context);
+ }
+
+ @Override
+ public Iterator<PaymentModelDao> build(final PaymentSqlDao paymentSqlDao, final Long limit, final InternalTenantContext context) {
return paymentSqlDao.getByPluginName(pluginName, offset, limit, context);
}
},
diff --git a/payment/src/main/java/com/ning/billing/payment/dao/PaymentMethodSqlDao.java b/payment/src/main/java/com/ning/billing/payment/dao/PaymentMethodSqlDao.java
index a05f1c6..95cc60f 100644
--- a/payment/src/main/java/com/ning/billing/payment/dao/PaymentMethodSqlDao.java
+++ b/payment/src/main/java/com/ning/billing/payment/dao/PaymentMethodSqlDao.java
@@ -62,4 +62,8 @@ public interface PaymentMethodSqlDao extends EntitySqlDao<PaymentMethodModelDao,
@Bind("offset") final Long offset,
@Bind("rowCount") final Long rowCount,
@BindBean final InternalTenantContext context);
+
+ @SqlQuery
+ public Long getCountByPluginName(@Bind("pluginName") final String pluginName,
+ @BindBean final InternalTenantContext context);
}
diff --git a/payment/src/main/java/com/ning/billing/payment/dao/PaymentSqlDao.java b/payment/src/main/java/com/ning/billing/payment/dao/PaymentSqlDao.java
index 606d49a..6a213d7 100644
--- a/payment/src/main/java/com/ning/billing/payment/dao/PaymentSqlDao.java
+++ b/payment/src/main/java/com/ning/billing/payment/dao/PaymentSqlDao.java
@@ -74,5 +74,9 @@ public interface PaymentSqlDao extends EntitySqlDao<PaymentModelDao, Payment> {
@Bind("offset") final Long offset,
@Bind("rowCount") final Long rowCount,
@BindBean final InternalTenantContext context);
+
+ @SqlQuery
+ public Long getCountByPluginName(@Bind("pluginName") final String pluginName,
+ @BindBean final InternalTenantContext context);
}
diff --git a/payment/src/main/java/com/ning/billing/payment/dao/RefundSqlDao.java b/payment/src/main/java/com/ning/billing/payment/dao/RefundSqlDao.java
index 18388b0..62c2ef7 100644
--- a/payment/src/main/java/com/ning/billing/payment/dao/RefundSqlDao.java
+++ b/payment/src/main/java/com/ning/billing/payment/dao/RefundSqlDao.java
@@ -60,4 +60,8 @@ public interface RefundSqlDao extends EntitySqlDao<RefundModelDao, Refund> {
@Bind("offset") final Long offset,
@Bind("rowCount") final Long rowCount,
@BindBean final InternalTenantContext context);
+
+ @SqlQuery
+ public Long getCountByPluginName(@Bind("pluginName") final String pluginName,
+ @BindBean final InternalTenantContext context);
}
diff --git a/payment/src/main/resources/com/ning/billing/payment/dao/PaymentMethodSqlDao.sql.stg b/payment/src/main/resources/com/ning/billing/payment/dao/PaymentMethodSqlDao.sql.stg
index 1096c6a..a4135fb 100644
--- a/payment/src/main/resources/com/ning/billing/payment/dao/PaymentMethodSqlDao.sql.stg
+++ b/payment/src/main/resources/com/ning/billing/payment/dao/PaymentMethodSqlDao.sql.stg
@@ -73,13 +73,22 @@ where account_id = :accountId
;
>>
-getByPluginName(pluginName, offset, rowCount) ::= <<
-select SQL_CALC_FOUND_ROWS
-<allTableFields()>
-from <tableName()>
-where plugin_name = :pluginName
-and is_active = 1
-order by record_id
+getByPluginName() ::= <<
+select
+<allTableFields("t.")>
+from <tableName()> t
+where t.plugin_name = :pluginName
+and t.is_active = 1
+order by t.record_id
limit :offset, :rowCount
;
>>
+
+getCountByPluginName() ::= <<
+select
+ count(1) as count
+from <tableName()> t
+where t.plugin_name = :pluginName
+and t.is_active = 1
+;
+>>
diff --git a/payment/src/main/resources/com/ning/billing/payment/dao/PaymentSqlDao.sql.stg b/payment/src/main/resources/com/ning/billing/payment/dao/PaymentSqlDao.sql.stg
index 1d0ac63..88bb4b0 100644
--- a/payment/src/main/resources/com/ning/billing/payment/dao/PaymentSqlDao.sql.stg
+++ b/payment/src/main/resources/com/ning/billing/payment/dao/PaymentSqlDao.sql.stg
@@ -104,8 +104,8 @@ where id = :id
;
>>
-getByPluginName(pluginName, offset, rowCount) ::= <<
-select SQL_CALC_FOUND_ROWS
+getByPluginName() ::= <<
+select
<allTableFields("t.")>
from <tableName()> t
join payment_methods pm on pm.id = t.payment_method_id
@@ -114,3 +114,12 @@ order by record_id
limit :offset, :rowCount
;
>>
+
+getCountByPluginName() ::= <<
+select
+ count(1) as count
+from <tableName()> t
+join payment_methods pm on pm.id = t.payment_method_id
+where pm.plugin_name = :pluginName
+;
+>>
diff --git a/payment/src/main/resources/com/ning/billing/payment/dao/RefundSqlDao.sql.stg b/payment/src/main/resources/com/ning/billing/payment/dao/RefundSqlDao.sql.stg
index 9e381f2..ff82e80 100644
--- a/payment/src/main/resources/com/ning/billing/payment/dao/RefundSqlDao.sql.stg
+++ b/payment/src/main/resources/com/ning/billing/payment/dao/RefundSqlDao.sql.stg
@@ -64,8 +64,8 @@ where account_id = :accountId
;
>>
-getByPluginName(pluginName, offset, rowCount) ::= <<
-select SQL_CALC_FOUND_ROWS
+getByPluginName() ::= <<
+select
<allTableFields("t.")>
from <tableName()> t
join payments p on p.id = t.payment_id
@@ -75,3 +75,13 @@ order by record_id
limit :offset, :rowCount
;
>>
+
+getCountByPluginName() ::= <<
+select
+ count(1) as count
+from <tableName()> t
+join payments p on p.id = t.payment_id
+join payment_methods pm on pm.id = p.payment_method_id
+where pm.plugin_name = :pluginName
+;
+>>
diff --git a/subscription/src/main/java/com/ning/billing/subscription/engine/dao/DefaultSubscriptionDao.java b/subscription/src/main/java/com/ning/billing/subscription/engine/dao/DefaultSubscriptionDao.java
index b20328d..b28efea 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/engine/dao/DefaultSubscriptionDao.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/engine/dao/DefaultSubscriptionDao.java
@@ -194,7 +194,12 @@ public class DefaultSubscriptionDao extends EntityDaoBase<SubscriptionBundleMode
return paginationHelper.getPagination(BundleSqlDao.class,
new PaginationIteratorBuilder<SubscriptionBundleModelDao, SubscriptionBaseBundle, BundleSqlDao>() {
@Override
- public Iterator<SubscriptionBundleModelDao> build(final BundleSqlDao bundleSqlDao, final Long limit) {
+ public Long getCount(final BundleSqlDao bundleSqlDao, final InternalTenantContext context) {
+ return bundleSqlDao.getSearchCount(searchKey, String.format("%%%s%%", searchKey), context);
+ }
+
+ @Override
+ public Iterator<SubscriptionBundleModelDao> build(final BundleSqlDao bundleSqlDao, final Long limit, final InternalTenantContext context) {
return bundleSqlDao.search(searchKey, String.format("%%%s%%", searchKey), offset, limit, context);
}
},
diff --git a/util/src/main/java/com/ning/billing/util/customfield/dao/DefaultCustomFieldDao.java b/util/src/main/java/com/ning/billing/util/customfield/dao/DefaultCustomFieldDao.java
index 207a703..b18fc41 100644
--- a/util/src/main/java/com/ning/billing/util/customfield/dao/DefaultCustomFieldDao.java
+++ b/util/src/main/java/com/ning/billing/util/customfield/dao/DefaultCustomFieldDao.java
@@ -147,7 +147,12 @@ public class DefaultCustomFieldDao extends EntityDaoBase<CustomFieldModelDao, Cu
return paginationHelper.getPagination(CustomFieldSqlDao.class,
new PaginationIteratorBuilder<CustomFieldModelDao, CustomField, CustomFieldSqlDao>() {
@Override
- public Iterator<CustomFieldModelDao> build(final CustomFieldSqlDao customFieldSqlDao, final Long limit) {
+ public Long getCount(final CustomFieldSqlDao customFieldSqlDao, final InternalTenantContext context) {
+ return customFieldSqlDao.getSearchCount(searchKey, String.format("%%%s%%", searchKey), context);
+ }
+
+ @Override
+ public Iterator<CustomFieldModelDao> build(final CustomFieldSqlDao customFieldSqlDao, final Long limit, final InternalTenantContext context) {
return customFieldSqlDao.search(searchKey, String.format("%%%s%%", searchKey), offset, limit, context);
}
},
diff --git a/util/src/main/java/com/ning/billing/util/entity/dao/DefaultPaginationSqlDaoHelper.java b/util/src/main/java/com/ning/billing/util/entity/dao/DefaultPaginationSqlDaoHelper.java
index ddc138b..de81a5b 100644
--- a/util/src/main/java/com/ning/billing/util/entity/dao/DefaultPaginationSqlDaoHelper.java
+++ b/util/src/main/java/com/ning/billing/util/entity/dao/DefaultPaginationSqlDaoHelper.java
@@ -39,12 +39,12 @@ public class DefaultPaginationSqlDaoHelper {
// Note: the connection will be busy as we stream the results out: hence we cannot use
// SQL_CALC_FOUND_ROWS / FOUND_ROWS on the actual query.
// We still need to know the actual number of results, mainly for the UI so that it knows if it needs to fetch
- // more pages. To do that, we perform a dummy search query with SQL_CALC_FOUND_ROWS (but limit 1).
+ // more pages.
final Long count = transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<Long>() {
@Override
public Long inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
final EntitySqlDao<M, E> sqlDao = entitySqlDaoWrapperFactory.become(sqlDaoClazz);
- return sqlDao.getSearchCount(context);
+ return paginationIteratorBuilder.getCount((S) sqlDao, context);
}
});
@@ -52,14 +52,15 @@ public class DefaultPaginationSqlDaoHelper {
// Since we want to stream the results out, we don't want to auto-commit when this method returns.
final EntitySqlDao<M, E> sqlDao = transactionalSqlDao.onDemand(sqlDaoClazz);
final Long totalCount = sqlDao.getCount(context);
- final Iterator<M> results = paginationIteratorBuilder.build((S) sqlDao, limit);
+ final Iterator<M> results = paginationIteratorBuilder.build((S) sqlDao, limit, context);
return new DefaultPagination<M>(offset, limit, count, totalCount, results);
}
public abstract static class PaginationIteratorBuilder<M extends EntityModelDao<E>, E extends Entity, S extends EntitySqlDao<M, E>> {
- public abstract Iterator<M> build(final S sqlDao,
- final Long limit);
+ public abstract Long getCount(final S sqlDao, final InternalTenantContext context);
+
+ public abstract Iterator<M> build(final S sqlDao, final Long limit, final InternalTenantContext context);
}
}
diff --git a/util/src/main/java/com/ning/billing/util/entity/dao/EntityDaoBase.java b/util/src/main/java/com/ning/billing/util/entity/dao/EntityDaoBase.java
index a477efd..61ae426 100644
--- a/util/src/main/java/com/ning/billing/util/entity/dao/EntityDaoBase.java
+++ b/util/src/main/java/com/ning/billing/util/entity/dao/EntityDaoBase.java
@@ -136,7 +136,12 @@ public abstract class EntityDaoBase<M extends EntityModelDao<E>, E extends Entit
return paginationHelper.getPagination(realSqlDao,
new PaginationIteratorBuilder<M, E, EntitySqlDao<M, E>>() {
@Override
- public Iterator<M> build(final EntitySqlDao<M, E> sqlDao, final Long limit) {
+ public Long getCount(final EntitySqlDao<M, E> sqlDao, final InternalTenantContext context) {
+ return sqlDao.getCount(context);
+ }
+
+ @Override
+ public Iterator<M> build(final EntitySqlDao<M, E> sqlDao, final Long limit, final InternalTenantContext context) {
return sqlDao.get(offset, limit, getNaturalOrderingColumns(), context);
}
},
diff --git a/util/src/main/java/com/ning/billing/util/entity/dao/EntitySqlDao.java b/util/src/main/java/com/ning/billing/util/entity/dao/EntitySqlDao.java
index 7430327..6f331a6 100644
--- a/util/src/main/java/com/ning/billing/util/entity/dao/EntitySqlDao.java
+++ b/util/src/main/java/com/ning/billing/util/entity/dao/EntitySqlDao.java
@@ -79,7 +79,9 @@ public interface EntitySqlDao<M extends EntityModelDao<E>, E extends Entity> ext
@BindBean final InternalTenantContext context);
@SqlQuery
- public Long getSearchCount(@BindBean final InternalTenantContext context);
+ public Long getSearchCount(@Bind("searchKey") final String searchKey,
+ @Bind("likeSearchKey") final String likeSearchKey,
+ @BindBean final InternalTenantContext context);
@SqlQuery
@SmartFetchSize(shouldStream = true)
diff --git a/util/src/main/java/com/ning/billing/util/tag/dao/DefaultTagDao.java b/util/src/main/java/com/ning/billing/util/tag/dao/DefaultTagDao.java
index 7f9a1ca..caf92b0 100644
--- a/util/src/main/java/com/ning/billing/util/tag/dao/DefaultTagDao.java
+++ b/util/src/main/java/com/ning/billing/util/tag/dao/DefaultTagDao.java
@@ -222,7 +222,12 @@ public class DefaultTagDao extends EntityDaoBase<TagModelDao, Tag, TagApiExcepti
return paginationHelper.getPagination(TagSqlDao.class,
new PaginationIteratorBuilder<TagModelDao, Tag, TagSqlDao>() {
@Override
- public Iterator<TagModelDao> build(final TagSqlDao tagSqlDao, final Long limit) {
+ public Long getCount(final TagSqlDao tagSqlDao, final InternalTenantContext context) {
+ return tagSqlDao.getSearchCount(searchKey, String.format("%%%s%%", searchKey), context);
+ }
+
+ @Override
+ public Iterator<TagModelDao> build(final TagSqlDao tagSqlDao, final Long limit, final InternalTenantContext context) {
return tagSqlDao.search(searchKey, String.format("%%%s%%", searchKey), offset, limit, context);
}
},
diff --git a/util/src/main/resources/com/ning/billing/util/tag/dao/TagSqlDao.sql.stg b/util/src/main/resources/com/ning/billing/util/tag/dao/TagSqlDao.sql.stg
index 8dbc6dc..efdc434 100644
--- a/util/src/main/resources/com/ning/billing/util/tag/dao/TagSqlDao.sql.stg
+++ b/util/src/main/resources/com/ning/billing/util/tag/dao/TagSqlDao.sql.stg
@@ -58,11 +58,7 @@ and t.object_type = :objectType
;
>>
-searchTags() ::= <<
-select SQL_CALC_FOUND_ROWS
-<allTableFields("t.")>
-from <tableName()> t
-join (
+userAndSystemTagDefinitions() ::= <<
select
id
, name
@@ -75,7 +71,7 @@ join (
, \'Suspends payments until removed.\' description
union
select
- \'00000000-0000-0000-0000-000000000001\' id
+ \'00000000-0000-0000-0000-000000000002\' id
, \'AUTO_INVOICING_OFF\' name
, \'Suspends invoicing until removed.\' description
union
@@ -92,7 +88,7 @@ join (
select
\'00000000-0000-0000-0000-000000000005\' id
, \'MANUAL_PAY\' name
- , \'Indicates that Killbill doesn\\\\\'t process payments for that account (external payments only)\' description
+ , \'Indicates that Killbill doesn\\'\\'t process payments for that account (external payments only)\' description
union
select
\'00000000-0000-0000-0000-000000000006\' id
@@ -103,16 +99,33 @@ join (
\'00000000-0000-0000-0000-000000000007\' id
, \'PARTNER\' name
, \'Indicates that this is a partner account\' description
-) td on td.id = t.tag_definition_id
-where 1 = 1
-and (
- <idField("t.")> = :searchKey
- or t.object_type like :likeSearchKey
- or td.name like :likeSearchKey
- or td.description like :likeSearchKey
-)
+>>
+
+searchQuery(tagAlias, tagDefinitionAlias) ::= <<
+ <idField(tagAlias)> = :searchKey
+ or <tagAlias>object_type like :likeSearchKey
+ or <tagDefinitionAlias>name like :likeSearchKey
+ or <tagDefinitionAlias>description like :likeSearchKey
+>>
+
+search() ::= <<
+select
+<allTableFields("t.")>
+from <tableName()> t
+join (<userAndSystemTagDefinitions()>) td on td.id = t.tag_definition_id
+where (<searchQuery(tagAlias="t.", tagDefinitionAlias="td.")>)
<AND_CHECK_TENANT("t.")>
order by <recordIdField("t.")> ASC
limit :offset, :rowCount
;
>>
+
+getSearchCount() ::= <<
+select
+ count(1) as count
+from <tableName()> t
+join (<userAndSystemTagDefinitions()>) td on td.id = t.tag_definition_id
+where (<searchQuery(tagAlias="t.", tagDefinitionAlias="td.")>)
+<AND_CHECK_TENANT("t.")>
+;
+>>