@Override
  protected void doReindex(JournalArticle article) throws Exception {
    if (PortalUtil.getClassNameId(DDMStructure.class) == article.getClassNameId()) {

      Document document = getDocument(article);

      IndexWriterHelperUtil.deleteDocument(
          getSearchEngineId(), article.getCompanyId(),
          document.get(Field.UID), isCommitImmediately());

      return;
    }

    reindexArticleVersions(article);
  }
  @Override
  public void reindexDDMStructures(List<Long> ddmStructureIds) throws SearchException {

    if (IndexWriterHelperUtil.isIndexReadOnly() || !isIndexerEnabled()) {
      return;
    }

    try {
      Indexer<DLFileEntry> indexer = IndexerRegistryUtil.nullSafeGetIndexer(DLFileEntry.class);

      List<DLFileEntry> dlFileEntries =
          DLFileEntryLocalServiceUtil.getDDMStructureFileEntries(
              ArrayUtil.toLongArray(ddmStructureIds));

      for (DLFileEntry dlFileEntry : dlFileEntries) {
        indexer.reindex(dlFileEntry);
      }
    } catch (Exception e) {
      throw new SearchException(e);
    }
  }
  @Override
  protected void doDelete(JournalArticle journalArticle) throws Exception {
    long classPK = journalArticle.getId();

    if (!isIndexAllArticleVersions()) {
      if (_journalArticleLocalService.getArticlesCount(
              journalArticle.getGroupId(), journalArticle.getArticleId())
          > 0) {

        doReindex(journalArticle);

        return;
      } else {
        classPK = journalArticle.getResourcePrimKey();
      }
    }

    deleteDocument(journalArticle.getCompanyId(), classPK);

    if (!journalArticle.isApproved()) {
      return;
    }

    JournalArticle latestIndexableArticle =
        _journalArticleLocalService.fetchLatestIndexableArticle(
            journalArticle.getResourcePrimKey());

    if ((latestIndexableArticle == null)
        || (latestIndexableArticle.getVersion() > journalArticle.getVersion())) {

      return;
    }

    IndexWriterHelperUtil.updateDocument(
        getSearchEngineId(), journalArticle.getCompanyId(),
        getDocument(latestIndexableArticle), isCommitImmediately());
  }
  protected void reindexArticleVersions(JournalArticle article) throws PortalException {

    IndexWriterHelperUtil.updateDocuments(
        getSearchEngineId(), article.getCompanyId(),
        getArticleVersions(article), isCommitImmediately());
  }
  @Override
  public void reindexDDMStructures(List<Long> ddmStructureIds) throws SearchException {

    if (IndexWriterHelperUtil.isIndexReadOnly() || !isIndexerEnabled()) {
      return;
    }

    try {
      final String[] ddmStructureKeys = new String[ddmStructureIds.size()];

      for (int i = 0; i < ddmStructureIds.size(); i++) {
        long ddmStructureId = ddmStructureIds.get(i);

        DDMStructure ddmStructure = _ddmStructureLocalService.getDDMStructure(ddmStructureId);

        ddmStructureKeys[i] = ddmStructure.getStructureKey();
      }

      final Indexer<JournalArticle> indexer =
          IndexerRegistryUtil.nullSafeGetIndexer(JournalArticle.class);

      final ActionableDynamicQuery actionableDynamicQuery =
          _journalArticleLocalService.getActionableDynamicQuery();

      actionableDynamicQuery.setAddCriteriaMethod(
          new ActionableDynamicQuery.AddCriteriaMethod() {

            @Override
            public void addCriteria(DynamicQuery dynamicQuery) {
              Property ddmStructureKey = PropertyFactoryUtil.forName("DDMStructureKey");

              dynamicQuery.add(ddmStructureKey.in(ddmStructureKeys));

              if (!isIndexAllArticleVersions()) {
                Property statusProperty = PropertyFactoryUtil.forName("status");

                Integer[] statuses = {
                  WorkflowConstants.STATUS_APPROVED, WorkflowConstants.STATUS_IN_TRASH
                };

                dynamicQuery.add(statusProperty.in(statuses));
              }
            }
          });
      actionableDynamicQuery.setPerformActionMethod(
          new ActionableDynamicQuery.PerformActionMethod<JournalArticle>() {

            @Override
            public void performAction(JournalArticle article) throws PortalException {

              try {
                indexer.reindex(indexer.getClassName(), article.getResourcePrimKey());
              } catch (Exception e) {
                throw new PortalException(e);
              }
            }
          });

      actionableDynamicQuery.performActions();
    } catch (Exception e) {
      throw new SearchException(e);
    }
  }