Ver código fonte

#2862 Add comprehensive Javadoc comments and refine SearchLogHelper structure

Shinsuke Sugaya 6 meses atrás
pai
commit
07bd6aa6a5

+ 157 - 15
src/main/java/org/codelibs/fess/helper/SearchLogHelper.java

@@ -67,25 +67,39 @@ import com.google.common.cache.LoadingCache;
 
 
 import jakarta.annotation.PostConstruct;
 import jakarta.annotation.PostConstruct;
 
 
+/**
+ * Helper class for managing search logs.
+ */
 public class SearchLogHelper {
 public class SearchLogHelper {
     private static final Logger logger = LogManager.getLogger(SearchLogHelper.class);
     private static final Logger logger = LogManager.getLogger(SearchLogHelper.class);
 
 
-    protected long userCheckInterval = 10 * 60 * 1000L;// 10 min
+    /** Interval for checking user information in milliseconds (default: 10 minutes). */
+    protected long userCheckInterval = 10 * 60 * 1000L; // 10 min
 
 
+    /** Maximum size of the user information cache. */
     protected int userInfoCacheSize = 10000;
     protected int userInfoCacheSize = 10000;
 
 
+    /** Queue for storing search logs. */
     protected Queue<SearchLog> searchLogQueue = new ConcurrentLinkedQueue<>();
     protected Queue<SearchLog> searchLogQueue = new ConcurrentLinkedQueue<>();
 
 
+    /** Queue for storing click logs. */
     protected Queue<ClickLog> clickLogQueue = new ConcurrentLinkedQueue<>();
     protected Queue<ClickLog> clickLogQueue = new ConcurrentLinkedQueue<>();
 
 
+    /** Cache for storing user information. */
     protected LoadingCache<String, UserInfo> userInfoCache;
     protected LoadingCache<String, UserInfo> userInfoCache;
 
 
+    /** Name of the logger for search logs. */
     protected String loggerName = "fess.log.searchlog";
     protected String loggerName = "fess.log.searchlog";
 
 
+    /** Logger for search logs. */
     protected Logger searchLogLogger = null;
     protected Logger searchLogLogger = null;
 
 
+    /** ObjectMapper for JSON processing. */
     protected ObjectMapper objectMapper = new ObjectMapper();
     protected ObjectMapper objectMapper = new ObjectMapper();
 
 
+    /**
+     * Initializes the SearchLogHelper.
+     */
     @PostConstruct
     @PostConstruct
     public void init() {
     public void init() {
         if (logger.isDebugEnabled()) {
         if (logger.isDebugEnabled()) {
@@ -103,6 +117,17 @@ public class SearchLogHelper {
         searchLogLogger = LogManager.getLogger(loggerName);
         searchLogLogger = LogManager.getLogger(loggerName);
     }
     }
 
 
+    /**
+     * Adds a search log to the queue.
+     *
+     * @param params The search request parameters.
+     * @param requestedTime The time the search was requested.
+     * @param queryId The ID of the search query.
+     * @param query The search query.
+     * @param pageStart The starting page number.
+     * @param pageSize The size of the page.
+     * @param queryResponseList The list of query responses.
+     */
     public void addSearchLog(final SearchRequestParams params, final LocalDateTime requestedTime, final String queryId, final String query,
     public void addSearchLog(final SearchRequestParams params, final LocalDateTime requestedTime, final String queryId, final String query,
             final int pageStart, final int pageSize, final QueryResponseList queryResponseList) {
             final int pageStart, final int pageSize, final QueryResponseList queryResponseList) {
 
 
@@ -188,6 +213,12 @@ public class SearchLogHelper {
         searchLogQueue.add(searchLog);
         searchLogQueue.add(searchLog);
     }
     }
 
 
+    /**
+     * Adds documents in the response to the search log.
+     *
+     * @param queryResponseList The list of query responses.
+     * @param searchLog The search log.
+     */
     protected void addDocumentsInResponse(final QueryResponseList queryResponseList, final SearchLog searchLog) {
     protected void addDocumentsInResponse(final QueryResponseList queryResponseList, final SearchLog searchLog) {
         if (ComponentUtil.getFessConfig().isLoggingSearchDocsEnabled()) {
         if (ComponentUtil.getFessConfig().isLoggingSearchDocsEnabled()) {
             queryResponseList.stream().forEach(res -> {
             queryResponseList.stream().forEach(res -> {
@@ -198,27 +229,47 @@ public class SearchLogHelper {
         }
         }
     }
     }
 
 
+    /**
+     * Adds a click log to the queue.
+     *
+     * @param clickLog The click log.
+     */
     public void addClickLog(final ClickLog clickLog) {
     public void addClickLog(final ClickLog clickLog) {
         clickLogQueue.add(clickLog);
         clickLogQueue.add(clickLog);
     }
     }
 
 
+    /**
+     * Stores search logs from the queue.
+     */
     public void storeSearchLog() {
     public void storeSearchLog() {
         storeSearchLogFromQueue();
         storeSearchLogFromQueue();
         storeClickLogFromQueue();
         storeClickLogFromQueue();
     }
     }
 
 
+    /**
+     * Stores click logs from the queue.
+     */
     protected void storeClickLogFromQueue() {
     protected void storeClickLogFromQueue() {
         if (!clickLogQueue.isEmpty()) {
         if (!clickLogQueue.isEmpty()) {
             processClickLogQueue(clickLogQueue);
             processClickLogQueue(clickLogQueue);
         }
         }
     }
     }
 
 
+    /**
+     * Stores search logs from the queue.
+     */
     protected void storeSearchLogFromQueue() {
     protected void storeSearchLogFromQueue() {
         if (!searchLogQueue.isEmpty()) {
         if (!searchLogQueue.isEmpty()) {
             processSearchLogQueue(searchLogQueue);
             processSearchLogQueue(searchLogQueue);
         }
         }
     }
     }
 
 
+    /**
+    * Gets the click count for a URL.
+    *
+    * @param url The URL.
+    * @return The click count.
+    */
     public int getClickCount(final String url) {
     public int getClickCount(final String url) {
         final ClickLogBhv clickLogBhv = ComponentUtil.getComponent(ClickLogBhv.class);
         final ClickLogBhv clickLogBhv = ComponentUtil.getComponent(ClickLogBhv.class);
         return clickLogBhv.selectCount(cb -> {
         return clickLogBhv.selectCount(cb -> {
@@ -226,6 +277,12 @@ public class SearchLogHelper {
         });
         });
     }
     }
 
 
+    /**
+     * Gets the favorite count for a URL.
+     *
+     * @param url The URL.
+     * @return The favorite count.
+     */
     public long getFavoriteCount(final String url) {
     public long getFavoriteCount(final String url) {
         final FavoriteLogBhv favoriteLogBhv = ComponentUtil.getComponent(FavoriteLogBhv.class);
         final FavoriteLogBhv favoriteLogBhv = ComponentUtil.getComponent(FavoriteLogBhv.class);
         return favoriteLogBhv.selectCount(cb -> {
         return favoriteLogBhv.selectCount(cb -> {
@@ -233,6 +290,12 @@ public class SearchLogHelper {
         });
         });
     }
     }
 
 
+    /**
+     * Stores user information.
+     *
+     * @param userCode The user code.
+     * @return The user information.
+     */
     protected UserInfo storeUserInfo(final String userCode) {
     protected UserInfo storeUserInfo(final String userCode) {
         final UserInfoBhv userInfoBhv = ComponentUtil.getComponent(UserInfoBhv.class);
         final UserInfoBhv userInfoBhv = ComponentUtil.getComponent(UserInfoBhv.class);
 
 
@@ -251,6 +314,12 @@ public class SearchLogHelper {
         return userInfo;
         return userInfo;
     }
     }
 
 
+    /**
+     * Gets user information.
+     *
+     * @param userCode The user code.
+     * @return The user information.
+     */
     public OptionalEntity<UserInfo> getUserInfo(final String userCode) {
     public OptionalEntity<UserInfo> getUserInfo(final String userCode) {
         if (StringUtil.isNotBlank(userCode)) {
         if (StringUtil.isNotBlank(userCode)) {
             try {
             try {
@@ -264,6 +333,11 @@ public class SearchLogHelper {
         return OptionalEntity.empty();
         return OptionalEntity.empty();
     }
     }
 
 
+    /**
+     * Processes the search log queue.
+     *
+     * @param queue The search log queue.
+     */
     protected void processSearchLogQueue(final Queue<SearchLog> queue) {
     protected void processSearchLogQueue(final Queue<SearchLog> queue) {
         final FessConfig fessConfig = ComponentUtil.getFessConfig();
         final FessConfig fessConfig = ComponentUtil.getFessConfig();
         final String value = fessConfig.getPurgeByBots();
         final String value = fessConfig.getPurgeByBots();
@@ -274,7 +348,7 @@ public class SearchLogHelper {
             botNames = value.split(",");
             botNames = value.split(",");
         }
         }
 
 
-        final int batchSize = ComponentUtil.getFessConfig().getSearchlogProcessBatchSizeAsInteger();
+        final int batchSize = fessConfig.getSearchlogProcessBatchSizeAsInteger();
 
 
         final List<SearchLog> searchLogList = new ArrayList<>();
         final List<SearchLog> searchLogList = new ArrayList<>();
         final Map<String, UserInfo> userInfoMap = new HashMap<>();
         final Map<String, UserInfo> userInfoMap = new HashMap<>();
@@ -310,20 +384,34 @@ public class SearchLogHelper {
         }
         }
     }
     }
 
 
-    private void processSearchLog(final List<SearchLog> searchLogList) {
+    /**
+     * Processes the search log list.
+     *
+     * @param searchLogList The search log list.
+     */
+    protected void processSearchLog(final List<SearchLog> searchLogList) {
         if (!searchLogList.isEmpty()) {
         if (!searchLogList.isEmpty()) {
             final FessConfig fessConfig = ComponentUtil.getFessConfig();
             final FessConfig fessConfig = ComponentUtil.getFessConfig();
+            // write log
+            if (fessConfig.isLoggingSearchUseLogfile()) {
+                searchLogList.forEach(this::writeSearchLogEvent);
+            }
+            // insert search log
             storeSearchLogList(searchLogList);
             storeSearchLogList(searchLogList);
+            // update suggest index
             if (fessConfig.isSuggestSearchLog()) {
             if (fessConfig.isSuggestSearchLog()) {
                 final SuggestHelper suggestHelper = ComponentUtil.getSuggestHelper();
                 final SuggestHelper suggestHelper = ComponentUtil.getSuggestHelper();
                 suggestHelper.indexFromSearchLog(searchLogList);
                 suggestHelper.indexFromSearchLog(searchLogList);
             }
             }
-            if (fessConfig.isLoggingSearchUseLogfile()) {
-                searchLogList.forEach(this::writeSearchLogEvent);
-            }
         }
         }
     }
     }
 
 
+    /**
+     * Processes user information logs.
+     *
+     * @param searchLogList The search log list.
+     * @param userInfoMap The user information map.
+     */
     protected void processUserInfoLog(final List<SearchLog> searchLogList, final Map<String, UserInfo> userInfoMap) {
     protected void processUserInfoLog(final List<SearchLog> searchLogList, final Map<String, UserInfo> userInfoMap) {
         if (!userInfoMap.isEmpty()) {
         if (!userInfoMap.isEmpty()) {
             final FessConfig fessConfig = ComponentUtil.getFessConfig();
             final FessConfig fessConfig = ComponentUtil.getFessConfig();
@@ -341,20 +429,28 @@ public class SearchLogHelper {
                 updateList.add(entity);
                 updateList.add(entity);
                 insertList.remove(entity);
                 insertList.remove(entity);
             });
             });
+            // write log
+            if (fessConfig.isLoggingSearchUseLogfile()) {
+                insertList.forEach(this::writeSearchLogEvent);
+                updateList.forEach(this::writeSearchLogEvent);
+            }
+            // insert/update user info
             userInfoBhv.batchInsert(insertList);
             userInfoBhv.batchInsert(insertList);
             userInfoBhv.batchUpdate(updateList);
             userInfoBhv.batchUpdate(updateList);
+            // update search log
             searchLogList.stream().forEach(searchLog -> {
             searchLogList.stream().forEach(searchLog -> {
                 searchLog.getUserInfo().ifPresent(userInfo -> {
                 searchLog.getUserInfo().ifPresent(userInfo -> {
                     searchLog.setUserInfoId(userInfo.getId());
                     searchLog.setUserInfoId(userInfo.getId());
                 });
                 });
             });
             });
-            if (fessConfig.isLoggingSearchUseLogfile()) {
-                insertList.forEach(this::writeSearchLogEvent);
-                updateList.forEach(this::writeSearchLogEvent);
-            }
         }
         }
     }
     }
 
 
+    /**
+    * Stores a list of search logs.
+    *
+    * @param searchLogList The search log list.
+    */
     protected void storeSearchLogList(final List<SearchLog> searchLogList) {
     protected void storeSearchLogList(final List<SearchLog> searchLogList) {
         final SearchLogBhv searchLogBhv = ComponentUtil.getComponent(SearchLogBhv.class);
         final SearchLogBhv searchLogBhv = ComponentUtil.getComponent(SearchLogBhv.class);
         searchLogBhv.batchUpdate(searchLogList, op -> {
         searchLogBhv.batchUpdate(searchLogList, op -> {
@@ -362,6 +458,11 @@ public class SearchLogHelper {
         });
         });
     }
     }
 
 
+    /**
+     * Processes the click log queue.
+     *
+     * @param queue The click log queue.
+     */
     protected void processClickLogQueue(final Queue<ClickLog> queue) {
     protected void processClickLogQueue(final Queue<ClickLog> queue) {
         final FessConfig fessConfig = ComponentUtil.getFessConfig();
         final FessConfig fessConfig = ComponentUtil.getFessConfig();
         final int batchSize = fessConfig.getSearchlogProcessBatchSizeAsInteger();
         final int batchSize = fessConfig.getSearchlogProcessBatchSizeAsInteger();
@@ -405,6 +506,11 @@ public class SearchLogHelper {
         }
         }
     }
     }
 
 
+    /**
+     * Updates the click field in the index.
+     *
+     * @param clickCountMap The click count map.
+     */
     protected void updateClickFieldInIndex(final Map<String, Integer> clickCountMap) {
     protected void updateClickFieldInIndex(final Map<String, Integer> clickCountMap) {
         if (!clickCountMap.isEmpty()) {
         if (!clickCountMap.isEmpty()) {
             final SearchHelper searchHelper = ComponentUtil.getSearchHelper();
             final SearchHelper searchHelper = ComponentUtil.getSearchHelper();
@@ -440,21 +546,30 @@ public class SearchLogHelper {
         }
         }
     }
     }
 
 
+    /**
+     * Processes a list of click logs.
+     *
+     * @param clickLogList The click log list.
+     */
     protected void processClickLog(final List<ClickLog> clickLogList) {
     protected void processClickLog(final List<ClickLog> clickLogList) {
         if (!clickLogList.isEmpty()) {
         if (!clickLogList.isEmpty()) {
             final FessConfig fessConfig = ComponentUtil.getFessConfig();
             final FessConfig fessConfig = ComponentUtil.getFessConfig();
+            if (fessConfig.isLoggingSearchUseLogfile()) {
+                clickLogList.forEach(this::writeSearchLogEvent);
+            }
             try {
             try {
-                final ClickLogBhv clickLogBhv = ComponentUtil.getComponent(ClickLogBhv.class);
-                clickLogBhv.batchInsert(clickLogList);
+                ComponentUtil.getComponent(ClickLogBhv.class).batchInsert(clickLogList);
             } catch (final Exception e) {
             } catch (final Exception e) {
                 logger.warn("Failed to insert: {}", clickLogList, e);
                 logger.warn("Failed to insert: {}", clickLogList, e);
             }
             }
-            if (fessConfig.isLoggingSearchUseLogfile()) {
-                clickLogList.forEach(this::writeSearchLogEvent);
-            }
         }
         }
     }
     }
 
 
+    /**
+     * Writes a search log event.
+     *
+     * @param event The search log event.
+     */
     public void writeSearchLogEvent(final SearchLogEvent event) {
     public void writeSearchLogEvent(final SearchLogEvent event) {
         try {
         try {
             final Map<String, Object> source = toSource(event);
             final Map<String, Object> source = toSource(event);
@@ -464,6 +579,12 @@ public class SearchLogHelper {
         }
         }
     }
     }
 
 
+    /**
+    * Converts a search log event to a source map.
+    *
+    * @param searchLogEvent The search log event.
+    * @return The source map.
+    */
     protected Map<String, Object> toSource(final SearchLogEvent searchLogEvent) {
     protected Map<String, Object> toSource(final SearchLogEvent searchLogEvent) {
         final Map<String, Object> source = toLowerHyphen(searchLogEvent.toSource());
         final Map<String, Object> source = toLowerHyphen(searchLogEvent.toSource());
         source.put("_id", searchLogEvent.getId());
         source.put("_id", searchLogEvent.getId());
@@ -472,6 +593,12 @@ public class SearchLogHelper {
         return source;
         return source;
     }
     }
 
 
+    /**
+     * Converts a map to lower hyphen case.
+     *
+     * @param source The source map.
+     * @return The converted map.
+     */
     protected Map<String, Object> toLowerHyphen(final Map<String, Object> source) {
     protected Map<String, Object> toLowerHyphen(final Map<String, Object> source) {
         return source.entrySet().stream()
         return source.entrySet().stream()
                 .collect(Collectors.toMap(e -> CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, e.getKey()), e -> {
                 .collect(Collectors.toMap(e -> CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, e.getKey()), e -> {
@@ -485,14 +612,29 @@ public class SearchLogHelper {
                 }));
                 }));
     }
     }
 
 
+    /**
+     * Sets the user check interval.
+     *
+     * @param userCheckInterval The user check interval.
+     */
     public void setUserCheckInterval(final long userCheckInterval) {
     public void setUserCheckInterval(final long userCheckInterval) {
         this.userCheckInterval = userCheckInterval;
         this.userCheckInterval = userCheckInterval;
     }
     }
 
 
+    /**
+     * Sets the user information cache size.
+     *
+     * @param userInfoCacheSize The user information cache size.
+     */
     public void setUserInfoCacheSize(final int userInfoCacheSize) {
     public void setUserInfoCacheSize(final int userInfoCacheSize) {
         this.userInfoCacheSize = userInfoCacheSize;
         this.userInfoCacheSize = userInfoCacheSize;
     }
     }
 
 
+    /**
+     * Sets the logger name.
+     *
+     * @param loggerName The logger name.
+     */
     public void setLoggerName(final String loggerName) {
     public void setLoggerName(final String loggerName) {
         this.loggerName = loggerName;
         this.loggerName = loggerName;
     }
     }