Add job name input suggestion API for page history status
diff --git a/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/dao/search/JobStatusTraceLogRepository.java b/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/dao/search/JobStatusTraceLogRepository.java
index 378968d..e8165c9 100644
--- a/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/dao/search/JobStatusTraceLogRepository.java
+++ b/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/dao/search/JobStatusTraceLogRepository.java
@@ -20,6 +20,20 @@
 import org.apache.shardingsphere.elasticjob.lite.ui.domain.JobStatusTraceLog;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
+import java.util.List;
 
 public interface JobStatusTraceLogRepository extends JpaRepository<JobStatusTraceLog, String>, JpaSpecificationExecutor<JobStatusTraceLog> {
+    
+    /**
+     * Find all job names in job status trace log with specific prefix.
+     *
+     * @param prefix job name prefix
+     * @return matched job names
+     */
+    @SuppressWarnings("SpringDataRepositoryMethodReturnTypeInspection")
+    @Query("select distinct l.jobName from JobStatusTraceLog l where l.jobName like :prefix%")
+    List<String> findJobNameByJobNameLike(@Param("prefix") String prefix);
 }
diff --git a/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/domain/JobStatusTraceLog.java b/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/domain/JobStatusTraceLog.java
index 6f804b1..d0e62f3 100644
--- a/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/domain/JobStatusTraceLog.java
+++ b/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/domain/JobStatusTraceLog.java
@@ -23,10 +23,12 @@
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Id;
+import javax.persistence.Table;
 import java.util.Date;
 
 @Data
-@Entity(name = "JOB_STATUS_TRACE_LOG")
+@Table(name = "JOB_STATUS_TRACE_LOG")
+@Entity
 public class JobStatusTraceLog {
     
     @Id
diff --git a/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/service/EventTraceHistoryService.java b/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/service/EventTraceHistoryService.java
index 2630de8..c880079 100644
--- a/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/service/EventTraceHistoryService.java
+++ b/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/service/EventTraceHistoryService.java
@@ -61,4 +61,12 @@
      * @return job status trace events
      */
     Page<JobStatusTraceEvent> findJobStatusTraceEvents(FindJobStatusTraceEventsRequest findJobStatusTraceEventsRequest);
+    
+    /**
+     * Find job names with specific prefix in status trace log.
+     *
+     * @param jobNamePrefix job name prefix
+     * @return matched job names
+     */
+    List<String> findJobNamesInStatusTraceLog(String jobNamePrefix);
 }
diff --git a/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/service/impl/EventTraceHistoryServiceImpl.java b/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/service/impl/EventTraceHistoryServiceImpl.java
index 5c3c234..db55b9d 100644
--- a/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/service/impl/EventTraceHistoryServiceImpl.java
+++ b/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/service/impl/EventTraceHistoryServiceImpl.java
@@ -91,6 +91,11 @@
         return new PageImpl<>(page.getContent().stream().map(JobStatusTraceLog::toJobStatusTraceEvent).collect(Collectors.toList()), null, page.getTotalElements());
     }
     
+    @Override
+    public List<String> findJobNamesInStatusTraceLog(final String jobNamePrefix) {
+        return jobStatusTraceLogRepository.findJobNameByJobNameLike(jobNamePrefix);
+    }
+    
     private <T> Pageable getPageable(final BasePageRequest pageRequest, final Class<T> clazz) {
         int page = 0;
         int perPage = BasePageRequest.DEFAULT_PAGE_SIZE;
diff --git a/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/web/controller/EventTraceHistoryController.java b/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/web/controller/EventTraceHistoryController.java
index 19e5de8..d40c200 100644
--- a/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/web/controller/EventTraceHistoryController.java
+++ b/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/web/controller/EventTraceHistoryController.java
@@ -98,6 +98,17 @@
         return ResponseResultUtil.build(BasePageResponse.of(jobStatusTraceEvents));
     }
     
+    /**
+     * Find all job names with specific prefix in status trace log.
+     *
+     * @param jobNamePrefix job name prefix
+     * @return matched job names
+     */
+    @GetMapping(value = {"/status/jobNames", "/status/jobNames/{jobNamePrefix}"})
+    public ResponseResult<List<String>> findJobNamesByPrefixInStatusTraceLog(@PathVariable(required = false) final String jobNamePrefix) {
+        return ResponseResultUtil.build(eventTraceHistoryService.findJobNamesInStatusTraceLog(Optional.ofNullable(jobNamePrefix).orElse("")));
+    }
+    
     @ModelAttribute
     private void initDataSource() {
         eventTraceDataSourceConfigurationService.loadActivated().ifPresent(SessionEventTraceDataSourceConfiguration::setDataSourceConfiguration);