protected void addDefaultCriteria(DynamicQuery dynamicQuery) {
    if (_companyId > 0) {
      Property property = PropertyFactoryUtil.forName("companyId");

      dynamicQuery.add(property.eq(_companyId));
    }

    if (_groupId > 0) {
      Property property = PropertyFactoryUtil.forName(_groupIdPropertyName);

      dynamicQuery.add(property.eq(_groupId));
    }
  }
  protected long doPerformActions(long previousPrimaryKey) throws PortalException {

    final DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(_clazz, _classLoader);

    Property property = PropertyFactoryUtil.forName(_primaryKeyPropertyName);

    dynamicQuery.add(property.gt(previousPrimaryKey));

    dynamicQuery.addOrder(OrderFactoryUtil.asc(_primaryKeyPropertyName));

    dynamicQuery.setLimit(0, _interval);

    addDefaultCriteria(dynamicQuery);

    addCriteria(dynamicQuery);

    Callable<Long> callable =
        new Callable<Long>() {

          @Override
          public Long call() throws Exception {
            List<Object> objects =
                (List<Object>) executeDynamicQuery(_dynamicQueryMethod, dynamicQuery);

            if (objects.isEmpty()) {
              return -1L;
            }

            for (Object object : objects) {
              performAction(object);
            }

            if (objects.size() < _interval) {
              return -1L;
            }

            BaseModel<?> baseModel = (BaseModel<?>) objects.get(objects.size() - 1);

            return (Long) baseModel.getPrimaryKeyObj();
          }
        };

    TransactionAttribute transactionAttribute = getTransactionAttribute();

    try {
      if (transactionAttribute == null) {
        return callable.call();
      } else {
        return TransactionInvokerUtil.invoke(transactionAttribute, callable);
      }
    } catch (Throwable t) {
      if (t instanceof PortalException) {
        throw (PortalException) t;
      }

      if (t instanceof SystemException) {
        throw (SystemException) t;
      }

      throw new SystemException(t);
    } finally {
      indexInterval();
    }
  }