Preparing for an Upgrade
ご覧のページは、お客様の利便性のために一部機械翻訳されています。また、ドキュメントは頻繁に更新が加えられており、翻訳は未完成の部分が含まれることをご了承ください。最新情報は都度公開されておりますため、必ず英語版をご参照ください。翻訳に問題がある場合は、 こちら までご連絡ください。

例:ジャーナル記事の中間バージョンの削除

ここでは、ジャーナル記事の中間バージョンを削除する手順とコードサンプルを示します。 スクリプト コンソールでは、Java または Groovy コードを実行して、不要なオブジェクト バージョンを削除できます。

ジャーナル記事の中間バージョンを削除する手順の例を次に示します。

  1. 最新バージョンをいくつ保存するかを決定します。 元のバージョンと最新バージョンを保持する必要がありますが、追加の最新バージョンも保持できます。 たとえば、最新の 2 つのバージョンを保持したり、最新のバージョンのみを保持したりすることができます。

  2. エンティティ バージョンを削除する方法を見つけます。

Liferay DXP App APIcom.liferay.portal.kernel API が利用可能なオプションです。

If it's a [Service Builder](https://help.liferay.com/hc/en-us/articles/360030958811-Running-Service-Builder) entity, examine the `delete*` methods in the entity's `*LocalServiceUtil` class.

For example, this `deleteArticle` in `JournalArticleLocalServiceUtil` deletes a Journal Article version:

```java
deleteArticle(long groupId, java.lang.String articleId, double version,
    java.lang.String articleURL,
    com.liferay.portal.kernel.service.ServiceContext serviceContext)
```
  1. 削除するエンティティ バージョンと、それらを削除するために必要な情報を集約します。

    たとえば、削除条件に一致する範囲内のすべての JournalArticle バージョンを取得し、それらのエンティティ ID とグループ ID を関連付けます (上記の deleteArticle メソッドでは、エンティティ ID とグループ ID が必要です)。

    エンティティオブジェクト(JournalArticleなど)には通常、バージョンフィールドがあります。 JournalArticleResourceには、各JournalArticleの記事ID(エンティティのID)とグループIDがあります。 JournalArticleResourceは各JournalArticleを取得するための鍵で、複数のバージョンを持つことができます。 削除するJournalArticleバージョンを特定する手順は次のとおりです。

    すべてのJournalArticleResourceオブジェクトを取得します。

    List<JournalArticleResource> journalArticleResources =
       JournalArticleLocalServiceUtil.getJournalArticleResources(start, end);
    

    JournalArticleResourceに関連付けられたJournalArticleオブジェクトを介して、各JournalArticleバージョンのワークフローステータスを取得します。 動的クエリ は、各オブジェクトから必要なデータを正確に取得する効率的な方法です。

    for (JournalArticleResource
       journalArticeResource : journalArticleResources) {
    
       List<Double> journalArticlesVersionsToDelete =
             new ArrayList<Double>();
    
       DynamicQuery dq =
             DynamicQueryFactoryUtil.forClass(JournalArticle.class)
                .setProjection(ProjectionFactoryUtil.projectionList()
                   .add(ProjectionFactoryUtil.property("id"))
                   .add(ProjectionFactoryUtil.property("version"))
                   .add(ProjectionFactoryUtil.property("status")))
                .add(PropertyFactoryUtil.forName("groupId")
                   .eq(journalArticeResource.getGroupId()))
                .add(PropertyFactoryUtil.forName("articleId")
                   .eq(journalArticeResource.getArticleId()))
                .addOrder(OrderFactoryUtil.asc("version"));
    
       List<Object[]> result =
             JournalArticleLocalServiceUtil.dynamicQuery(dq);
    
       // See the next step for the sample code that goes here
    }
    

    JournalArticleResourceごとに(JournalArticleエンティティごとに1つあります)、保持する最初のバージョンと最新バージョンの範囲内にあり、かつステータスが削除に適している中間バージョンのリストを作成します。 たとえば、承認済みまたは期限切れの中間記事バージョン (つまり、 WorkflowConstants.STATUS_APPROVED または WorkflowConstants.STATUS_EXPIRED) を削除するとします。 MIN_NUMBER_FIRST_VERSIONS_KEPTおよびMIN_NUMBER_LATEST_VERSIONS_KEPT変数は、保持する最初の(最も古い)バージョンと最新の(最も新しい)バージョンの最小数と最大数をマークします。

    List<Double> journalArticlesVersionsToDelete =
       new ArrayList<Double>();
    
    for (int i=0; i < result.size(); i++) {
       long id = (long) result.get(i)[0];
       double version = (double) result.get(i)[1];
       int status = (int) result.get(i)[2];
    
       if ((status == WorkflowConstants.STATUS_APPROVED) || (status == WorkflowConstants.STATUS_EXPIRED) {
    
             if (i < MIN_NUMBER_FIRST_VERSIONS_KEPT) {
                continue;
             }
    
             if (i >= (result.size() -
                MIN_NUMBER_LATEST_VERSIONS_KEPT)) {
                continue;
             }
    
             journalArticlesVersionsToDelete.add(version);
       }
    }
    
    // See the next step for the sample code that goes here
    
  2. 最後に、集計したバージョンに一致する各ジャーナル記事を削除します。

    for (double version : journalArticlesVersionsToDelete) {
    {
       JournalArticleLocalServiceUtil.deleteArticle(journalArticeResource.getGroupId(),
          journalArticeResource.getArticleId(),
          journalArticlesVersionsToDelete(i), null, null);
    }
    

同様のコードを記述して、他のエンティティの中間バージョンを削除できます。 コードの準備ができたら、サンプルモジュールを使用するか、スクリプトコンソールを使用してスクリプトとして実行します。

ヒント

削除する各オブジェクトのバージョン(およびその他の必要な情報)を印刷します。 削除をコミットする前に、オブジェクト削除呼び出しをコメントアウトし、テストとして削除するバージョンのプリントアウトを読み取ることもできます。