Selaa lähdekoodia

fix #2060 use url pattern in ds

Shinsuke Sugaya 6 vuotta sitten
vanhempi
commit
36c963c224

+ 12 - 0
src/main/java/org/codelibs/fess/ds/callback/IndexUpdateCallbackImpl.java

@@ -15,11 +15,14 @@
  */
  */
 package org.codelibs.fess.ds.callback;
 package org.codelibs.fess.ds.callback;
 
 
+import java.util.HashSet;
 import java.util.Map;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.atomic.AtomicLong;
 
 
 import javax.annotation.PostConstruct;
 import javax.annotation.PostConstruct;
 
 
+import org.codelibs.core.stream.StreamUtil;
 import org.codelibs.fess.es.client.FessEsClient;
 import org.codelibs.fess.es.client.FessEsClient;
 import org.codelibs.fess.exception.DataStoreException;
 import org.codelibs.fess.exception.DataStoreException;
 import org.codelibs.fess.helper.CrawlingInfoHelper;
 import org.codelibs.fess.helper.CrawlingInfoHelper;
@@ -82,6 +85,15 @@ public class IndexUpdateCallbackImpl implements IndexUpdateCallback {
             addFavoriteCountField(dataMap, url, fessConfig.getIndexFieldFavoriteCount());
             addFavoriteCountField(dataMap, url, fessConfig.getIndexFieldFavoriteCount());
         }
         }
 
 
+        final Set<String> matchedLabelSet = ComponentUtil.getLabelTypeHelper().getMatchedLabelValueSet(url);
+        if (!matchedLabelSet.isEmpty()) {
+            final Set<String> newLabelSet = new HashSet<>();
+            final String[] oldLabels = DocumentUtil.getValue(dataMap, fessConfig.getIndexFieldLabel(), String[].class);
+            StreamUtil.stream(oldLabels).of(stream -> stream.forEach(newLabelSet::add));
+            matchedLabelSet.stream().forEach(newLabelSet::add);
+            dataMap.put(fessConfig.getIndexFieldLabel(), newLabelSet.toArray(new String[newLabelSet.size()]));
+        }
+
         if (!dataMap.containsKey(fessConfig.getIndexFieldDocId())) {
         if (!dataMap.containsKey(fessConfig.getIndexFieldDocId())) {
             final SystemHelper systemHelper = ComponentUtil.getSystemHelper();
             final SystemHelper systemHelper = ComponentUtil.getSystemHelper();
             dataMap.put(fessConfig.getIndexFieldDocId(), systemHelper.generateDocId(dataMap));
             dataMap.put(fessConfig.getIndexFieldDocId(), systemHelper.generateDocId(dataMap));

+ 19 - 0
src/main/java/org/codelibs/fess/util/DocumentUtil.java

@@ -17,6 +17,7 @@ package org.codelibs.fess.util;
 
 
 import java.io.UnsupportedEncodingException;
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
 import java.net.URLEncoder;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.Date;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
@@ -53,6 +54,8 @@ public final class DocumentUtil {
         if (value instanceof List) {
         if (value instanceof List) {
             if (clazz.isAssignableFrom(List.class)) {
             if (clazz.isAssignableFrom(List.class)) {
                 return (T) value;
                 return (T) value;
+            } else if (clazz.isAssignableFrom(String[].class)) {
+                return (T) ((List<?>) value).stream().filter(s -> s != null).map(s -> s.toString()).toArray(n -> new String[n]);
             }
             }
 
 
             if (((List<?>) value).isEmpty()) {
             if (((List<?>) value).isEmpty()) {
@@ -60,6 +63,22 @@ public final class DocumentUtil {
             }
             }
 
 
             return convertObj(((List<?>) value).get(0), clazz);
             return convertObj(((List<?>) value).get(0), clazz);
+        } else if (value instanceof String[]) {
+            if (clazz.isAssignableFrom(String[].class)) {
+                return (T) value;
+            } else if (clazz.isAssignableFrom(List.class)) {
+                final List<String> list = new ArrayList<>();
+                for (final String s : (String[]) value) {
+                    list.add(s);
+                }
+                return (T) list;
+            }
+
+            if (((String[]) value).length == 0) {
+                return null;
+            }
+
+            return convertObj(((String[]) value)[0], clazz);
         }
         }
 
 
         return convertObj(value, clazz);
         return convertObj(value, clazz);

+ 18 - 0
src/test/java/org/codelibs/fess/util/DocumentUtilTest.java

@@ -15,13 +15,17 @@
  */
  */
 package org.codelibs.fess.util;
 package org.codelibs.fess.util;
 
 
+import static org.junit.Assert.assertArrayEquals;
+
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Map;
 
 
 import org.codelibs.fess.unit.UnitFessTestCase;
 import org.codelibs.fess.unit.UnitFessTestCase;
+import org.junit.jupiter.api.Assertions;
 
 
 public class DocumentUtilTest extends UnitFessTestCase {
 public class DocumentUtilTest extends UnitFessTestCase {
 
 
@@ -39,6 +43,20 @@ public class DocumentUtilTest extends UnitFessTestCase {
         assertNull(DocumentUtil.getValue(doc, "key2", String.class));
         assertNull(DocumentUtil.getValue(doc, "key2", String.class));
     }
     }
 
 
+    public void test_strings() {
+        Map<String, Object> doc = new HashMap<>();
+        doc.put("key1", new String[] { "aaa", "bbb" });
+        assertArrayEquals(new String[] { "aaa", "bbb" }, DocumentUtil.getValue(doc, "key1", String[].class));
+        assertEquals(Arrays.asList("aaa", "bbb"), (List<String>) DocumentUtil.getValue(doc, "key1", List.class));
+    }
+
+    public void test_list() {
+        Map<String, Object> doc = new HashMap<>();
+        doc.put("key1", Arrays.asList("aaa", "bbb"));
+        assertArrayEquals(new String[] { "aaa", "bbb" }, DocumentUtil.getValue(doc, "key1", String[].class));
+        assertEquals(Arrays.asList("aaa", "bbb"), (List<String>) DocumentUtil.getValue(doc, "key1", List.class));
+    }
+
     public void test_integer() {
     public void test_integer() {
         Map<String, Object> doc = new HashMap<>();
         Map<String, Object> doc = new HashMap<>();