From 36c963c224b42d1ca1e03d6a36fa939a045a6509 Mon Sep 17 00:00:00 2001
From: Shinsuke Sugaya <shinsuke@apache.org>
Date: Fri, 22 Mar 2019 22:29:32 +0900
Subject: [PATCH] fix #2060 use url pattern in ds
---
.../ds/callback/IndexUpdateCallbackImpl.java | 12 ++++++++++++
.../org/codelibs/fess/util/DocumentUtil.java | 19 +++++++++++++++++++
.../codelibs/fess/util/DocumentUtilTest.java | 18 ++++++++++++++++++
3 files changed, 49 insertions(+)
diff --git a/src/main/java/org/codelibs/fess/ds/callback/IndexUpdateCallbackImpl.java b/src/main/java/org/codelibs/fess/ds/callback/IndexUpdateCallbackImpl.java
index 73cc1ace5..c85c6e033 100644
--- a/src/main/java/org/codelibs/fess/ds/callback/IndexUpdateCallbackImpl.java
+++ b/src/main/java/org/codelibs/fess/ds/callback/IndexUpdateCallbackImpl.java
@@ -15,11 +15,14 @@
*/
package org.codelibs.fess.ds.callback;
+import java.util.HashSet;
import java.util.Map;
+import java.util.Set;
import java.util.concurrent.atomic.AtomicLong;
import javax.annotation.PostConstruct;
+import org.codelibs.core.stream.StreamUtil;
import org.codelibs.fess.es.client.FessEsClient;
import org.codelibs.fess.exception.DataStoreException;
import org.codelibs.fess.helper.CrawlingInfoHelper;
@@ -82,6 +85,15 @@ public class IndexUpdateCallbackImpl implements IndexUpdateCallback {
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())) {
final SystemHelper systemHelper = ComponentUtil.getSystemHelper();
dataMap.put(fessConfig.getIndexFieldDocId(), systemHelper.generateDocId(dataMap));
diff --git a/src/main/java/org/codelibs/fess/util/DocumentUtil.java b/src/main/java/org/codelibs/fess/util/DocumentUtil.java
index 93047d578..2a9c25fb9 100644
--- a/src/main/java/org/codelibs/fess/util/DocumentUtil.java
+++ b/src/main/java/org/codelibs/fess/util/DocumentUtil.java
@@ -17,6 +17,7 @@ package org.codelibs.fess.util;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
+import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
@@ -53,6 +54,8 @@ public final class DocumentUtil {
if (value instanceof List) {
if (clazz.isAssignableFrom(List.class)) {
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()) {
@@ -60,6 +63,22 @@ public final class DocumentUtil {
}
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);
diff --git a/src/test/java/org/codelibs/fess/util/DocumentUtilTest.java b/src/test/java/org/codelibs/fess/util/DocumentUtilTest.java
index a6cdf4892..93d163ab4 100644
--- a/src/test/java/org/codelibs/fess/util/DocumentUtilTest.java
+++ b/src/test/java/org/codelibs/fess/util/DocumentUtilTest.java
@@ -15,13 +15,17 @@
*/
package org.codelibs.fess.util;
+import static org.junit.Assert.assertArrayEquals;
+
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import org.codelibs.fess.unit.UnitFessTestCase;
+import org.junit.jupiter.api.Assertions;
public class DocumentUtilTest extends UnitFessTestCase {
@@ -39,6 +43,20 @@ public class DocumentUtilTest extends UnitFessTestCase {
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() {
Map<String, Object> doc = new HashMap<>();
--
GitLab