View Javadoc
1   /*
2    * Copyright 2012-2025 CodeLibs Project and the Others.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
13   * either express or implied. See the License for the specific language
14   * governing permissions and limitations under the License.
15   */
16  package org.codelibs.fess.app.service;
17  
18  import java.util.Collections;
19  import java.util.List;
20  
21  import org.codelibs.core.beans.util.BeanUtil;
22  import org.codelibs.fess.Constants;
23  import org.codelibs.fess.app.pager.StemmerOverridePager;
24  import org.codelibs.fess.dict.DictionaryFile.PagingList;
25  import org.codelibs.fess.dict.DictionaryManager;
26  import org.codelibs.fess.dict.stemmeroverride.StemmerOverrideFile;
27  import org.codelibs.fess.dict.stemmeroverride.StemmerOverrideItem;
28  import org.codelibs.fess.mylasta.direction.FessConfig;
29  import org.dbflute.optional.OptionalEntity;
30  
31  import jakarta.annotation.Resource;
32  
33  /**
34   * Service class for managing stemmer override dictionary operations.
35   *
36   * This service provides functionality for CRUD operations on stemmer override
37   * dictionaries. Stemmer override dictionaries allow administrators to define
38   * custom stemming rules that override the default stemming behavior for
39   * specific terms, improving search accuracy for domain-specific vocabularies.
40   */
41  public class StemmerOverrideService {
42  
43      /** Dictionary manager for accessing dictionary files. */
44      @Resource
45      protected DictionaryManager dictionaryManager;
46  
47      /** Fess configuration for accessing system settings. */
48      @Resource
49      protected FessConfig fessConfig;
50  
51      /**
52       * Default constructor.
53       */
54      public StemmerOverrideService() {
55          // Default constructor
56      }
57  
58      /**
59       * Retrieves a paginated list of stemmer override items from the specified dictionary.
60       *
61       * This method fetches stemmer override entries with pagination support, updating
62       * the provided pager with the current page state and navigation information.
63       *
64       * @param dictId The ID of the stemmer override dictionary to query
65       * @param stemmerOvberridePager The pager object for pagination control and state
66       * @return A list of stemmer override items for the current page, or empty list if dictionary not found
67       */
68      public List<StemmerOverrideItem> getStemmerOverrideList(final String dictId, final StemmerOverridePager stemmerOvberridePager) {
69          return getStemmerOverrideFile(dictId).map(file -> {
70              final int pageSize = stemmerOvberridePager.getPageSize();
71              final PagingList<StemmerOverrideItem> stemmerOvberrideList =
72                      file.selectList((stemmerOvberridePager.getCurrentPageNumber() - 1) * pageSize, pageSize);
73  
74              // update pager
75              BeanUtil.copyBeanToBean(stemmerOvberrideList, stemmerOvberridePager, option -> option.include(Constants.PAGER_CONVERSION_RULE));
76              stemmerOvberrideList.setPageRangeSize(fessConfig.getPagingPageRangeSizeAsInteger());
77              stemmerOvberridePager.setPageNumberList(stemmerOvberrideList.createPageNumberList());
78  
79              return (List<StemmerOverrideItem>) stemmerOvberrideList;
80          }).orElse(Collections.emptyList());
81      }
82  
83      /**
84       * Retrieves the stemmer override dictionary file by ID.
85       *
86       * @param dictId The ID of the stemmer override dictionary to retrieve
87       * @return An OptionalEntity containing the stemmer override file if found, empty otherwise
88       */
89      public OptionalEntity<StemmerOverrideFile> getStemmerOverrideFile(final String dictId) {
90          return dictionaryManager.getDictionaryFile(dictId)
91                  .filter(StemmerOverrideFile.class::isInstance)
92                  .map(file -> OptionalEntity.of((StemmerOverrideFile) file))
93                  .orElse(OptionalEntity.empty());
94      }
95  
96      /**
97       * Retrieves a specific stemmer override item by dictionary ID and item ID.
98       *
99       * @param dictId The ID of the stemmer override dictionary
100      * @param id The unique ID of the stemmer override item to retrieve
101      * @return An OptionalEntity containing the stemmer override item if found, empty otherwise
102      */
103     public OptionalEntity<StemmerOverrideItem> getStemmerOverrideItem(final String dictId, final long id) {
104         return getStemmerOverrideFile(dictId).map(file -> file.get(id).get());
105     }
106 
107     /**
108      * Stores (creates or updates) a stemmer override item in the specified dictionary.
109      *
110      * If the item ID is 0, this method performs an insert operation. Otherwise,
111      * it performs an update operation for the existing item.
112      *
113      * @param dictId The ID of the stemmer override dictionary
114      * @param stemmerOvberrideItem The stemmer override item to store
115      */
116     public void store(final String dictId, final StemmerOverrideItem stemmerOvberrideItem) {
117         getStemmerOverrideFile(dictId).ifPresent(file -> {
118             if (stemmerOvberrideItem.getId() == 0) {
119                 file.insert(stemmerOvberrideItem);
120             } else {
121                 file.update(stemmerOvberrideItem);
122             }
123         });
124     }
125 
126     /**
127      * Deletes a stemmer override item from the specified dictionary.
128      *
129      * @param dictId The ID of the stemmer override dictionary
130      * @param stemmerOvberrideItem The stemmer override item to delete
131      */
132     public void delete(final String dictId, final StemmerOverrideItem stemmerOvberrideItem) {
133         getStemmerOverrideFile(dictId).ifPresent(file -> {
134             file.delete(stemmerOvberrideItem);
135         });
136     }
137 }