You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by mi...@apache.org on 2018/11/08 07:21:33 UTC

[incubator-dubbo-ops] branch develop updated: support wildcard search

This is an automated email from the ASF dual-hosted git repository.

min pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo-ops.git


The following commit(s) were added to refs/heads/develop by this push:
     new b36bbf2  support wildcard search
b36bbf2 is described below

commit b36bbf20522721ed2875a23a64034d0e2a6108b3
Author: nzomkxia <z8...@gmail.com>
AuthorDate: Thu Nov 8 15:21:38 2018 +0800

    support wildcard search
---
 .../dubbo/admin/controller/ServiceController.java  | 92 ++++++++++------------
 .../org/apache/dubbo/admin/dto/ServiceDTO.java     | 19 ++++-
 .../admin/governance/sync/util/SyncUtils.java      |  2 +-
 .../src/components/ServiceSearch.vue               | 47 ++++++-----
 4 files changed, 89 insertions(+), 71 deletions(-)

diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/controller/ServiceController.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/controller/ServiceController.java
index 501376d..b21f72d 100644
--- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/controller/ServiceController.java
+++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/controller/ServiceController.java
@@ -29,6 +29,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 
 @RestController
@@ -45,50 +47,55 @@ public class ServiceController {
     }
 
     @RequestMapping(method = RequestMethod.GET)
-    public List<ServiceDTO> searchService(@RequestParam String pattern,
-                                          @RequestParam(required = false) String filter,@PathVariable String env) {
+    public Set<ServiceDTO> searchService(@RequestParam String pattern,
+                                         @RequestParam String filter,@PathVariable String env) {
 
-        List<Provider> allProviders = providerService.findAll();
-        Set<String> serviceUrl = new HashSet<>();
+        List<Provider> providers = new ArrayList<>();
+        if (!filter.contains("*") && !filter.contains("?")) {
+            if (pattern.equals("ip")) {
+                providers = providerService.findByAddress(filter);
+            } else if (pattern.equals("serviceName")) {
+                providers = providerService.findByService(filter);
+            } else if (pattern.equals("application")) {
+                providers = providerService.findByApplication(filter);
+            }
+        } else {
+            List<String> candidates = Collections.emptyList();
+            if (pattern.equals("serviceName")) {
+               candidates = providerService.findServices();
+            } else if (pattern.equals("application")) {
+                candidates = providerService.findApplications();
+            }
+            filter = filter.toLowerCase().replace(".", "\\.");
+            if (filter.startsWith("*")) {
+                filter = "." + filter;
+            }
+            Pattern regex = Pattern.compile(filter);
+            for (String candidate : candidates) {
+                Matcher matcher = regex.matcher(candidate);
+                if (matcher.matches() || matcher.lookingAt()) {
+                    if (pattern.equals("serviceName")) {
+                        providers.addAll(providerService.findByService(candidate));
+                    } else {
+                        providers.addAll(providerService.findByApplication(candidate));
+                    }
+                }
+            }
+        }
 
-        List<ServiceDTO> result = new ArrayList<>();
-        for (Provider provider : allProviders) {
+        Set<ServiceDTO> result = new TreeSet<>();
+        for (Provider provider : providers) {
             Map<String, String> map = StringUtils.parseQueryString(provider.getParameters());
             String app = provider.getApplication();
             String service = map.get(Constants.INTERFACE_KEY);
             String group = map.get(Constants.GROUP_KEY);
             String version = map.get(Constants.VERSION_KEY);
-            String url = app + service + group + version;
-            if (serviceUrl.contains(url)) {
-                continue;
-            }
             ServiceDTO s = new ServiceDTO();
-            if (org.apache.commons.lang3.StringUtils.isEmpty(filter)) {
-                s.setAppName(app);
-                s.setService(service);
-                s.setGroup(group);
-                s.setVersion(version);
-                result.add(s);
-                serviceUrl.add(url);
-            } else {
-                filter = filter.toLowerCase();
-                String key = null;
-                switch (pattern) {
-                    case "application":
-                        key = provider.getApplication().toLowerCase();
-                        break;
-                    case "serviceName":
-                        key = provider.getService().toLowerCase();
-                        break;
-                    case "ip":
-                        key = provider.getAddress().toLowerCase();
-                        break;
-                }
-                if (key != null && key.contains(filter)) {
-                    result.add(createService(provider, map));
-                    serviceUrl.add(url);
-                }
-            }
+            s.setAppName(app);
+            s.setService(service);
+            s.setGroup(group);
+            s.setVersion(version);
+            result.add(s);
         }
         return result;
     }
@@ -105,17 +112,4 @@ public class ServiceController {
         serviceDetailDTO.setProviders(providers);
         return serviceDetailDTO;
     }
-
-    private ServiceDTO createService(Provider provider, Map<String, String> map) {
-        ServiceDTO serviceDTO = new ServiceDTO();
-        serviceDTO.setAppName(provider.getApplication());
-        String service = map.get(Constants.INTERFACE_KEY);
-        String group = map.get(Constants.GROUP_KEY);
-        String version = map.get(Constants.VERSION_KEY);
-        serviceDTO.setService(service);
-        serviceDTO.setGroup(group);
-        serviceDTO.setVersion(version);
-        return serviceDTO;
-    }
-
 }
diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/dto/ServiceDTO.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/dto/ServiceDTO.java
index a510293..42e2e8c 100644
--- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/dto/ServiceDTO.java
+++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/dto/ServiceDTO.java
@@ -17,7 +17,9 @@
 
 package org.apache.dubbo.admin.dto;
 
-public class ServiceDTO {
+import org.apache.commons.lang3.StringUtils;
+
+public class ServiceDTO implements Comparable<ServiceDTO>{
     private String service;
     private String appName;
     private String group;
@@ -54,4 +56,19 @@ public class ServiceDTO {
     public void setVersion(String version) {
         this.version = version;
     }
+
+    @Override
+    public int compareTo(ServiceDTO o) {
+        int result = StringUtils.trimToEmpty(appName).compareTo(StringUtils.trimToEmpty(o.getAppName()));
+        if (result == 0) {
+            result = StringUtils.trimToEmpty(service).compareTo(StringUtils.trimToEmpty(o.getService()));
+            if (result == 0) {
+                result = StringUtils.trimToEmpty(group).compareTo(StringUtils.trimToEmpty(o.getGroup()));
+            }
+            if (result == 0) {
+                result = StringUtils.trimToEmpty(version).compareTo(StringUtils.trimToEmpty(o.getVersion()));
+            }
+        }
+        return result;
+    }
 }
diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/governance/sync/util/SyncUtils.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/governance/sync/util/SyncUtils.java
index 271e51d..418b112 100644
--- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/governance/sync/util/SyncUtils.java
+++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/governance/sync/util/SyncUtils.java
@@ -227,7 +227,7 @@ public class SyncUtils {
                 String value = e.getValue();
 
                 if (ADDRESS_FILTER_KEY.equals(key)) {
-                    if (!value.equals(url.getAddress())) {
+                    if (!value.equals(url.getIp())) {
                         match = false;
                         break;
                     }
diff --git a/dubbo-admin-frontend/src/components/ServiceSearch.vue b/dubbo-admin-frontend/src/components/ServiceSearch.vue
index 32a3a24..7b9dd51 100644
--- a/dubbo-admin-frontend/src/components/ServiceSearch.vue
+++ b/dubbo-admin-frontend/src/components/ServiceSearch.vue
@@ -23,7 +23,8 @@
           <v-card-text>
             <v-form>
               <v-layout row wrap>
-                <v-autocomplete
+                <v-combobox
+                  id="serviceSearch"
                   :loading="loading"
                   :items="typeAhead"
                   :search-input.sync="input"
@@ -33,9 +34,8 @@
                   hide-no-data
                   :suffix="queryBy"
                   :hint="hint"
-                  open-on-clear
                   label="Search Dubbo Services"
-                ></v-autocomplete>
+                ></v-combobox>
                   <v-menu class="hidden-xs-only">
                     <v-btn slot="activator" large icon>
                       <v-icon>unfold_more</v-icon>
@@ -151,10 +151,7 @@
     },
     watch: {
       input (val) {
-        console.log(val)
-        console.log(this.typeAhead)
-        if (val === undefined || val === '' || val === null || val.length < 5) {
-          this.filter = null
+        if (val === undefined || val === '' || val === null || val.length < 4) {
           this.typeAhead = []
           return
         }
@@ -163,16 +160,20 @@
     },
     methods: {
       querySelections (v) {
-        // this.loading = true
-        if (this.selected === 0) {
-          this.typeAhead = this.serviceItem.filter(e => {
-            return (e || '').toLowerCase().indexOf((v || '').toLowerCase()) > -1
-          })
-        } else if (this.selected === 2) {
-          this.typeAhead = this.appItem.filter(e => {
-            return (e || '').toLowerCase().indexOf((v || '').toLowerCase()) > -1
-          })
-        }
+        this.loading = true
+        // Simulated ajax query
+        setTimeout(() => {
+          if (this.selected === 0) {
+            this.typeAhead = this.serviceItem.filter(e => {
+              return (e || '').toLowerCase().indexOf((v || '').toLowerCase()) > -1
+            })
+          } else if (this.selected === 2) {
+            this.typeAhead = this.appItem.filter(e => {
+              return (e || '').toLowerCase().indexOf((v || '').toLowerCase()) > -1
+            })
+          }
+          this.loading = false
+        }, 500)
       },
       getHref: function (service, app, group, version) {
         let query = 'service=' + service + '&app=' + app
@@ -185,8 +186,13 @@
         return '/#/serviceDetail?' + query
       },
       submit () {
-        let pattern = this.items[this.selected].value
-        this.search(this.filter, pattern, true)
+        this.filter = document.querySelector('#serviceSearch').value.trim()
+        if (this.filter) {
+          let pattern = this.items[this.selected].value
+          this.search(this.filter, pattern, true)
+        } else {
+          return false
+        }
       },
       search: function (filter, pattern, rewrite) {
         this.$axios.get('/service', {
@@ -228,7 +234,8 @@
       }
       this.$axios.get('/service', {
         params: {
-          pattern: 'serviceName'
+          pattern: 'serviceName',
+          filter: '*'
         }
       }).then(response => {
         let length = response.data.length