Sfoglia il codice sorgente

增加接口:获取索引中的数据写入json文件

sunyj 8 anni fa
parent
commit
35daa4109b

+ 1 - 1
search-console-b2b/src/main/java/com/uas/search/console/b2b/aop/ServiceLogAspect.java

@@ -26,7 +26,7 @@ public class ServiceLogAspect {
 
 	private Logger logger = LoggerFactory.getLogger(getClass());
 
-	@Pointcut("execution(public * com.uas.search.console.b2b.service.impl.*.*(..))")
+	@Pointcut("execution(public * com.uas.search.console.b2b.service.impl.*.*(..)) && !execution(public * com.uas.search.console.b2b.service.InnerSearchService.getAllObjects(..))")
 	public void log() {
 
 	}

+ 10 - 0
search-console-b2b/src/main/java/com/uas/search/console/b2b/controller/SearchController.java

@@ -140,4 +140,14 @@ public class SearchController {
 				size == null ? 0 : size);
 	}
 
+	@RequestMapping("/objectsToFiles")
+	@ResponseBody
+	public String writeObjectsToFiles(String tableName) {
+		Table_name tbName = null;
+		if (!StringUtils.isEmpty(tableName)) {
+			tbName = Table_name.valueOf(tableName.toUpperCase());
+		}
+		return innerSearchService.writeObjectsToFiles(ClassAndTableNameUtils.toClass(tbName));
+	}
+
 }

+ 13 - 0
search-console-b2b/src/main/java/com/uas/search/console/b2b/service/InnerSearchService.java

@@ -23,6 +23,8 @@ public interface InnerSearchService {
 	/**
 	 * 分页获取本地指定实体类的索引中的所有数据
 	 * 
+	 * @param <T>
+	 * 
 	 * @param clazz
 	 *            指定的实体类
 	 * @param page
@@ -30,4 +32,15 @@ public interface InnerSearchService {
 	 * @return
 	 */
 	public <T> SPage<T> getAllObjects(Class<T> clazz, int page, int size);
+
+	/**
+	 * 获取本地指定实体类的索引中的所有数据,写入文件
+	 * 
+	 * @param <T>
+	 * 
+	 * @param clazz
+	 *            指定的实体类
+	 * @return
+	 */
+	public <T> String writeObjectsToFiles(Class<T> clazz);
 }

+ 96 - 7
search-console-b2b/src/main/java/com/uas/search/console/b2b/service/impl/SearchServiceImpl.java

@@ -1,6 +1,9 @@
 package com.uas.search.console.b2b.service.impl;
 
+import java.io.File;
+import java.io.FileNotFoundException;
 import java.io.IOException;
+import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Calendar;
@@ -27,6 +30,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
+import com.alibaba.fastjson.JSONObject;
 import com.uas.search.b2b.exception.SearchException;
 import com.uas.search.b2b.model.MultiValue;
 import com.uas.search.b2b.model.PageParams;
@@ -35,6 +39,7 @@ import com.uas.search.b2b.service.SearchService;
 import com.uas.search.console.b2b.service.InnerSearchService;
 import com.uas.search.console.b2b.util.ClassAndTableNameUtils;
 import com.uas.search.console.b2b.util.DocumentToObjectUtils;
+import com.uas.search.console.b2b.util.FileUtils;
 import com.uas.search.console.b2b.util.SearchUtils;
 
 /**
@@ -179,13 +184,40 @@ public class SearchServiceImpl implements SearchService, InnerSearchService {
 	 * @param tokenized
 	 *            可为空,模糊搜索时,是否对关键词进行分词,为空时,不分词
 	 * @param pageParams
-	 *            可为空,可能含有翻页信息,filters中可能有过滤信息,包括:1.状态、所属企业uu、其他状态(如已采纳、未采纳等),
-	 *            该部分参数的键为数据库表中相应的字段名称,值为字段对应的值,若值有多个,则使用com.uas.search.b2b.
-	 *            model.MultiValue,则;2.开始时间(Long)、截止时间(Long),
-	 *            这两个参数用于对时间范围进行筛选(包含开始和截止时间),键为com.uas.search.b2b.util.
-	 *            SearchConstants中的常量;3.排序方式(ArrayList(Sort)),键为com.uas.search.
-	 *            b2b.util.SearchConstants中的常量,值为List(com.uas.search.b2b.model.
-	 *            Sort)
+	 *            可为空,翻页、过滤、排序、排除过滤等信息
+	 *            <p>
+	 *            关于过滤,通过键值对指定过滤条件,值的类型由键决定:
+	 *            </p>
+	 * 
+	 *            <table border=1 cellpadding=5 cellspacing=0 summary=
+	 *            "Fields and types">
+	 *            <tr>
+	 *            <th>Description</th>
+	 *            <th>Field</th>
+	 *            <th>Type</th>
+	 *            </tr>
+	 *            <tr>
+	 *            <td>状态、所属企业uu、其他状态(如已采纳、未采纳等)</td>
+	 *            <td>键为数据库表中相应的字段名称</td>
+	 *            <td>值为字段对应的值,若值有多个,则使用
+	 *            {@link com.uas.search.b2b.model.MultiValue}</td>
+	 *            </tr>
+	 *            <tr>
+	 *            <td>开始时间、截止时间, 这两个参数用于对时间范围进行筛选</td>
+	 *            <td>{@link com.uas.search.b2b.util.SearchConstants}</td>
+	 *            <td>Long</td>
+	 *            </tr>
+	 *            <tr>
+	 *            <td>排序方式</td>
+	 *            <td>{@link com.uas.search.b2b.util.SearchConstants}</td>
+	 *            <td>List({@link com.uas.search.b2b.model.Sort})</td>
+	 *            </tr>
+	 *            </table>
+	 * 
+	 *            <p>
+	 *            关于排除过滤,键为数据库表中相应的字段名称,值为需排除的值,若值有多个,则使用
+	 *            {@link com.uas.search.b2b.model.MultiValue}
+	 *            </p>
 	 * @return 单据数据
 	 * @throws IOException
 	 */
@@ -453,4 +485,61 @@ public class SearchServiceImpl implements SearchService, InnerSearchService {
 		}
 	}
 
+	@Override
+	public <T> String writeObjectsToFiles(Class<T> clazz) {
+		// 不能边更新索引边分页获取索引中的数据,因为索引更新后,分页顺序可能也会变化,
+		// 所以要先把数据保存到本地,等待全部获取之后重建索引
+		Long startTime = new Date().getTime();
+		Table_name tableName = ClassAndTableNameUtils.toTableName(clazz);
+		// 先删除旧的文件
+		FileUtils.deleteSubFiles(new File(SearchUtils.getDataPath(tableName)));
+
+		int page = PAGE_INDEX;
+		int size = 1000;
+		SPage<T> sPage = getAllObjects(clazz, page, size);
+
+		// 索引中数据的总数目
+		long totalElements = sPage.getTotalElement();
+		logger.info("发现数据:" + totalElements + "条");
+		int fileIndex = 1;
+		PrintWriter printWriter = null;
+		int count = 0;
+		try {
+			File file = new File(SearchUtils.getDataPath(tableName));
+			if (!file.exists()) {
+				file.mkdirs();
+			}
+			printWriter = new PrintWriter(SearchUtils.getDataPath(tableName) + "/" + fileIndex + ".txt");
+			while (true) {
+				// 一个文件存放100000条数据,一旦超过,写入新的文件
+				if (count > IndexServiceImpl.SINGLE_FILE_MAX_SIZE) {
+					count = 1;
+					printWriter.flush();
+					printWriter.close();
+					fileIndex++;
+					printWriter = new PrintWriter(SearchUtils.getDataPath(tableName) + "/" + fileIndex + ".txt");
+				}
+				List<T> content = sPage.getContent();
+				for (T element : content) {
+					printWriter.println(JSONObject.toJSONString(element));
+					count++;
+				}
+				logger.info(String.format(tableName.value() + "...................%.2f%%",
+						((page - 1) * size + content.size()) * 100.0 / totalElements));
+
+				if (++page > sPage.getTotalPage()) {
+					break;
+				}
+				sPage = getAllObjects(clazz, page, size);
+			}
+			printWriter.flush();
+			printWriter.close();
+		} catch (FileNotFoundException | SecurityException | IllegalArgumentException e) {
+			throw new SearchException(e).setDetailedMessage(e);
+		}
+		Long endTime = new Date().getTime();
+		String message = String.format("写入数据%s条,耗时%.2fs\n ", totalElements, (endTime - startTime) / 1000.0);
+		logger.info(message);
+		return message;
+	}
 }

+ 1 - 89
search-console-b2b/src/main/java/com/uas/search/console/b2b/service/impl/UpdateVirtualColumnServiceImpl.java

@@ -1,28 +1,14 @@
 package com.uas.search.console.b2b.service.impl;
 
-import java.io.File;
-import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.NotSerializableException;
-import java.io.PrintWriter;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
 import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
-import com.alibaba.fastjson.JSONObject;
-import com.uas.search.b2b.exception.SearchException;
-import com.uas.search.b2b.model.SPage;
 import com.uas.search.b2b.service.SearchService.Table_name;
 import com.uas.search.console.b2b.core.util.ContextUtils;
 import com.uas.search.console.b2b.jms.AQListener;
@@ -33,9 +19,7 @@ import com.uas.search.console.b2b.service.IndexService;
 import com.uas.search.console.b2b.service.InnerSearchService;
 import com.uas.search.console.b2b.service.UpdateVirtualColumnService;
 import com.uas.search.console.b2b.util.ClassAndTableNameUtils;
-import com.uas.search.console.b2b.util.FileUtils;
 import com.uas.search.console.b2b.util.ObjectUtil;
-import com.uas.search.console.b2b.util.SearchUtils;
 
 /**
  * @author sunyj
@@ -44,16 +28,6 @@ import com.uas.search.console.b2b.util.SearchUtils;
 @Service
 public class UpdateVirtualColumnServiceImpl implements UpdateVirtualColumnService {
 
-	/**
-	 * 默认的页码
-	 */
-	private static final int PAGE_INDEX = 1;
-
-	/**
-	 * 默认每页的大小
-	 */
-	private static final int PAGE_SIZE = 1000;
-
 	@Autowired
 	private TaskService taskService;
 
@@ -66,8 +40,6 @@ public class UpdateVirtualColumnServiceImpl implements UpdateVirtualColumnServic
 	private InnerSearchService innerSearchService = ContextUtils.getApplicationContext().getBean("searchServiceImpl",
 			InnerSearchService.class);
 
-	private Logger logger = LoggerFactory.getLogger(UpdateVirtualColumnServiceImpl.class);
-
 	/**
 	 * 更新指定实体类的虚拟列的索引
 	 * 
@@ -79,68 +51,8 @@ public class UpdateVirtualColumnServiceImpl implements UpdateVirtualColumnServic
 	 *            需更新的虚拟列,键值对(虚拟列名称:类型,实体中必须存在对应的get/set方法)
 	 */
 	private <T> void updateVirtualColumn(Class<T> clazz, Map<String, Class<?>> fields) {
-		// 不能边更新索引边分页获取索引中的数据,因为索引更新后,分页顺序可能也会变化,
-		// 所以要先把数据保存到本地,等待全部获取之后重建索引
-		Long startTime = new Date().getTime();
 		Table_name tableName = ClassAndTableNameUtils.toTableName(clazz);
-		// 先删除旧的文件
-		FileUtils.deleteSubFiles(new File(SearchUtils.getDataPath(tableName)));
-
-		int page = PAGE_INDEX;
-		SPage<T> sPage = innerSearchService.getAllObjects(clazz, page, PAGE_SIZE);
-
-		// 索引中数据的总数目
-		long totalElements = sPage.getTotalElement();
-		logger.info("发现数据:" + totalElements + "条");
-		int fileIndex = 1;
-		PrintWriter printWriter = null;
-		int count = 0;
-		try {
-			File file = new File(SearchUtils.getDataPath(tableName));
-			if (!file.exists()) {
-				file.mkdirs();
-			}
-			printWriter = new PrintWriter(SearchUtils.getDataPath(tableName) + "/" + fileIndex + ".txt");
-			while (true) {
-				// 一个文件存放100000条数据,一旦超过,写入新的文件
-				if (count > IndexServiceImpl.SINGLE_FILE_MAX_SIZE) {
-					count = 1;
-					printWriter.flush();
-					printWriter.close();
-					fileIndex++;
-					printWriter = new PrintWriter(SearchUtils.getDataPath(tableName) + "/" + fileIndex + ".txt");
-				}
-				List<T> content = sPage.getContent();
-				for (T element : content) {
-					Set<Entry<String, Class<?>>> entrySet = fields.entrySet();
-					for (Entry<String, Class<?>> entry : entrySet) {
-						String key = entry.getKey();
-						Class<?> type = entry.getValue();
-						// 首字母大写
-						key = key.substring(0, 1).toUpperCase() + key.substring(1);
-						Method getMethod = clazz.getMethod("get" + key);
-						Method setMethod = clazz.getMethod("set" + key, type);
-						setMethod.invoke(element, getMethod.invoke(element));
-					}
-					printWriter.println(JSONObject.toJSONString(element));
-					count++;
-				}
-				logger.info(String.format(tableName.value() + "...................%.2f%%",
-						(page - 1) * PAGE_SIZE * 100.0 / totalElements));
-
-				if (++page > sPage.getTotalPage()) {
-					break;
-				}
-				sPage = innerSearchService.getAllObjects(clazz, page, PAGE_SIZE);
-			}
-			printWriter.flush();
-			printWriter.close();
-		} catch (FileNotFoundException | NoSuchMethodException | SecurityException | IllegalAccessException
-				| IllegalArgumentException | InvocationTargetException e) {
-			throw new SearchException(e).setDetailedMessage(e);
-		}
-		Long endTime = new Date().getTime();
-		logger.info(String.format("修改数据%s条,耗时%.2fs\n ", totalElements, (endTime - startTime) / 1000.0));
+		innerSearchService.writeObjectsToFiles(clazz);
 		indexService.createIndexes(Arrays.asList(tableName), true, true);
 		aqListener.start(null, null);
 	}

+ 1 - 0
search-console-b2b/src/main/webapp/WEB-INF/views/console.html

@@ -27,6 +27,7 @@
 				<li><a target="_blank">search/object?id=115940&tableName=PURC$ORDERS</a></li>
 				<li><a target="_blank">search/object?id=21&tableName=MAKE$ORDERS</a></li>
 				<li><a target="_blank">search/objects?tableName=MAKE$ORDERS&page=1&size=6</a></li>
+				<li><a target="_blank">search/objectsToFiles?tableName=MAKE$ORDERS</a></li>
 			</ol>
 
 			<strong><li class="title">索引修改</li></strong>