@Override
  public List<SyncDLObject> findByModifiedTime(
      long modifiedTime, long repositoryId, long parentFolderId, String type, int start, int end) {

    Session session = null;

    try {
      session = openSession();

      String sql = CustomSQLUtil.get(getClass(), FIND_BY_MODIFIED_TIME);

      if (modifiedTime <= 0) {
        sql = StringUtil.replace(sql, "(SyncDLObject.modifiedTime > ?) AND", StringPool.BLANK);
      }

      if (parentFolderId == 0) {
        sql = StringUtil.replace(sql, "AND (SyncDLObject.treePath LIKE ?)", StringPool.BLANK);
      }

      if (type == null) {
        sql = StringUtil.replace(sql, "AND (SyncDLObject.type_ = ?)", StringPool.BLANK);
      }

      if ((start == QueryUtil.ALL_POS) && (end == QueryUtil.ALL_POS)) {
        sql = CustomSQLUtil.removeOrderBy(sql);
      }

      SQLQuery sqlQuery = session.createSynchronizedSQLQuery(sql);

      sqlQuery.addEntity("SyncDLObject", SyncDLObjectImpl.class);

      QueryPos qPos = QueryPos.getInstance(sqlQuery);

      if (modifiedTime > 0) {
        qPos.add(modifiedTime);
      }

      qPos.add(repositoryId);

      if (parentFolderId != 0) {
        qPos.add("%/" + parentFolderId + "/%");
      }

      if (type != null) {
        qPos.add(type);
      }

      return (List<SyncDLObject>) QueryUtil.list(sqlQuery, getDialect(), start, end);
    } catch (Exception e) {
      throw new SystemException(e);
    } finally {
      closeSession(session);
    }
  }
  @Override
  public List<BookmarksFolder> findByNoAssets() {
    Session session = null;

    try {
      session = openSession();

      String sql = CustomSQLUtil.get(getClass(), FIND_BY_NO_ASSETS);

      SQLQuery q = session.createSynchronizedSQLQuery(sql);

      q.addEntity("BookmarksFolder", BookmarksFolderImpl.class);

      return q.list(true);
    } catch (Exception e) {
      throw new SystemException(e);
    } finally {
      closeSession(session);
    }
  }
  @Override
  public List<Long> filterFindByR_U_T(long groupId, long userId, long[] typePKs) {

    if (ArrayUtil.isEmpty(typePKs)) {
      return Collections.emptyList();
    }

    Session session = null;

    try {
      session = openSession();

      String sql = CustomSQLUtil.get(getClass(), FIND_BY_TYPE_PKS);

      sql =
          StringUtil.replace(
              sql,
              new String[] {"[$TYPE_PKS$]", "[$ROLE_IDS_OR_OWNER_ID$]"},
              new String[] {getTypePKsSQL(typePKs), getRoleOwnerIdsSQL(groupId, userId)});

      SQLQuery sqlQuery = session.createSynchronizedSQLQuery(sql);

      sqlQuery.addScalar("primKey", Type.LONG);

      QueryPos qPos = QueryPos.getInstance(sqlQuery);

      qPos.add(CompanyThreadLocal.getCompanyId());
      qPos.add(ResourceConstants.SCOPE_INDIVIDUAL);

      return (List<Long>) sqlQuery.list();
    } catch (Exception e) {
      throw new SystemException(e);
    } finally {
      closeSession(session);
    }
  }
  protected List<Object> doFindF_E_ByG_F(
      long groupId, long folderId, QueryDefinition<?> queryDefinition, boolean inlineSQLHelper) {

    Session session = null;

    try {
      session = openSession();

      StringBundler sb = new StringBundler(5);

      sb.append("SELECT * FROM (");

      String sql = null;

      if (queryDefinition.getStatus() == WorkflowConstants.STATUS_ANY) {
        sql = CustomSQLUtil.get(getClass(), FIND_F_BY_G_P);
      } else {
        sql = CustomSQLUtil.get(getClass(), FIND_F_BY_G_P_S);

        sql = replaceExcludeStatus(sql, queryDefinition);
      }

      if (inlineSQLHelper) {
        sql =
            InlineSQLHelperUtil.replacePermissionCheck(
                sql, BookmarksFolder.class.getName(), "BookmarksFolder.folderId", groupId);
      }

      sb.append(sql);
      sb.append(" UNION ALL ");

      if (queryDefinition.getStatus() == WorkflowConstants.STATUS_ANY) {
        sql = CustomSQLUtil.get(getClass(), FIND_E_BY_G_F);
      } else {
        sql = CustomSQLUtil.get(getClass(), FIND_E_BY_G_F_S);

        sql = replaceExcludeStatus(sql, queryDefinition);
      }

      if (inlineSQLHelper) {
        sql =
            InlineSQLHelperUtil.replacePermissionCheck(
                sql, BookmarksEntry.class.getName(), "BookmarksEntry.fileEntryId", groupId);
      }

      sb.append(sql);
      sb.append(") TEMP_TABLE ORDER BY modelName ASC");

      sql = sb.toString();

      SQLQuery q = session.createSynchronizedSQLQuery(sql);

      q.addScalar("modelId", Type.LONG);
      q.addScalar("modelName", Type.STRING);
      q.addScalar("modelFolder", Type.LONG);

      QueryPos qPos = QueryPos.getInstance(q);

      qPos.add(groupId);
      qPos.add(folderId);

      if (queryDefinition.getStatus() != WorkflowConstants.STATUS_ANY) {
        qPos.add(queryDefinition.getStatus());
      }

      qPos.add(groupId);
      qPos.add(folderId);

      if (queryDefinition.getStatus() != WorkflowConstants.STATUS_ANY) {
        qPos.add(queryDefinition.getStatus());
      }

      List<Object> models = new ArrayList<>();

      Iterator<Object[]> itr =
          (Iterator<Object[]>)
              QueryUtil.iterate(
                  q, getDialect(), queryDefinition.getStart(), queryDefinition.getEnd());

      while (itr.hasNext()) {
        Object[] array = itr.next();

        long modelId = (Long) array[0];
        // String name = (String)array[1];
        long modelFolder = (Long) array[2];

        Object obj = null;

        if (modelFolder == 0) {
          obj = BookmarksFolderUtil.findByPrimaryKey(modelId);
        } else {
          obj = BookmarksEntryUtil.findByPrimaryKey(modelId);
        }

        models.add(obj);
      }

      return models;
    } catch (Exception e) {
      throw new SystemException(e);
    } finally {
      closeSession(session);
    }
  }
  protected int doCountF_E_ByG_F(
      long groupId, long folderId, QueryDefinition<?> queryDefinition, boolean inlineSQLHelper) {

    Session session = null;

    try {
      session = openSession();

      StringBundler sb = new StringBundler(5);

      sb.append(StringPool.OPEN_PARENTHESIS);

      String sql = null;

      if (queryDefinition.getStatus() == WorkflowConstants.STATUS_ANY) {
        sql = CustomSQLUtil.get(getClass(), COUNT_F_BY_G_P);
      } else {
        sql = CustomSQLUtil.get(getClass(), COUNT_F_BY_G_P_S);

        sql = replaceExcludeStatus(sql, queryDefinition);
      }

      if (inlineSQLHelper) {
        sql =
            InlineSQLHelperUtil.replacePermissionCheck(
                sql, BookmarksFolder.class.getName(), "BookmarksFolder.folderId", groupId);
      }

      sb.append(sql);
      sb.append(") UNION ALL (");

      if (queryDefinition.getStatus() == WorkflowConstants.STATUS_ANY) {
        sql = CustomSQLUtil.get(getClass(), COUNT_E_BY_G_F);
      } else {
        sql = CustomSQLUtil.get(getClass(), COUNT_E_BY_G_F_S);

        sql = replaceExcludeStatus(sql, queryDefinition);
      }

      if (inlineSQLHelper) {
        sql =
            InlineSQLHelperUtil.replacePermissionCheck(
                sql, BookmarksEntry.class.getName(), "BookmarksEntry.fileEntryId", groupId);
      }

      sb.append(sql);
      sb.append(StringPool.CLOSE_PARENTHESIS);

      sql = sb.toString();

      SQLQuery q = session.createSynchronizedSQLQuery(sql);

      q.addScalar(COUNT_COLUMN_NAME, Type.LONG);

      QueryPos qPos = QueryPos.getInstance(q);

      qPos.add(groupId);
      qPos.add(folderId);

      if (queryDefinition.getStatus() != WorkflowConstants.STATUS_ANY) {
        qPos.add(queryDefinition.getStatus());
      }

      qPos.add(groupId);
      qPos.add(folderId);

      if (queryDefinition.getStatus() != WorkflowConstants.STATUS_ANY) {
        qPos.add(queryDefinition.getStatus());
      }

      int count = 0;

      Iterator<Long> itr = q.iterate();

      while (itr.hasNext()) {
        Long l = itr.next();

        if (l != null) {
          count += l.intValue();
        }
      }

      return count;
    } catch (Exception e) {
      throw new SystemException(e);
    } finally {
      closeSession(session);
    }
  }