JSON exporter fixed, JsonExporterTest added
This commit is contained in:
parent
e81c5e1dcf
commit
61d8892318
6 changed files with 151 additions and 7 deletions
|
|
@ -11,6 +11,11 @@ public interface Exporter {
|
||||||
"RU_SETTLED",
|
"RU_SETTLED",
|
||||||
"RU_OTHERLEGAL",
|
"RU_OTHERLEGAL",
|
||||||
"RU_CAPABILITY",
|
"RU_CAPABILITY",
|
||||||
"RU_DEBT_BURDEN_INFO"
|
"RU_DEBT_BURDEN_INFO",
|
||||||
|
"ACCOUNT",
|
||||||
|
"INFORMATION",
|
||||||
|
"BANKRUPTCY",
|
||||||
|
"CONSUMER_BANKRUPTCY",
|
||||||
|
"LEGAL"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
@ -20,6 +21,7 @@ import org.springframework.stereotype.Component;
|
||||||
import ru.nbch.indicsearchservice.config.settings.ApplicationSettings;
|
import ru.nbch.indicsearchservice.config.settings.ApplicationSettings;
|
||||||
import ru.nbch.indicsearchservice.model.TableData;
|
import ru.nbch.indicsearchservice.model.TableData;
|
||||||
import ru.nbch.indicsearchservice.model.TableMetaData;
|
import ru.nbch.indicsearchservice.model.TableMetaData;
|
||||||
|
import ru.nbch.indicsearchservice.model.enums.SearchParameter;
|
||||||
import tools.jackson.core.JsonGenerator;
|
import tools.jackson.core.JsonGenerator;
|
||||||
import tools.jackson.databind.json.JsonMapper;
|
import tools.jackson.databind.json.JsonMapper;
|
||||||
|
|
||||||
|
|
@ -36,11 +38,18 @@ public class JsonExporter implements Exporter {
|
||||||
this.jsonMapper = jsonMapper;
|
this.jsonMapper = jsonMapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void writeJsonFile(@Nullable Path aggregatedFile, UUID taskId, Map<String, TableMetaData> tableMetaDataMap) {
|
public void writeJsonFile(@Nullable Path aggregatedFile,
|
||||||
|
UUID taskId,
|
||||||
|
SearchParameter searchParameter,
|
||||||
|
Map<String, TableMetaData> tableMetaDataMap) {
|
||||||
if (aggregatedFile == null) {
|
if (aggregatedFile == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean isPassportOgrnFid = searchParameter == SearchParameter.PASSPORT ||
|
||||||
|
searchParameter == SearchParameter.OGRN ||
|
||||||
|
searchParameter == SearchParameter.FID;
|
||||||
|
|
||||||
Path jsonFile = settings.getStorageDirectory().toPath().resolve(taskId.toString() + ".json");
|
Path jsonFile = settings.getStorageDirectory().toPath().resolve(taskId.toString() + ".json");
|
||||||
|
|
||||||
try (BufferedReader reader = Files.newBufferedReader(aggregatedFile);
|
try (BufferedReader reader = Files.newBufferedReader(aggregatedFile);
|
||||||
|
|
@ -48,12 +57,14 @@ public class JsonExporter implements Exporter {
|
||||||
jsonGenerator.writeStartObject();
|
jsonGenerator.writeStartObject();
|
||||||
jsonGenerator.writeName("datasheets");
|
jsonGenerator.writeName("datasheets");
|
||||||
jsonGenerator.writeStartArray();
|
jsonGenerator.writeStartArray();
|
||||||
jsonGenerator.writeStartArray();
|
|
||||||
|
|
||||||
Iterator<String> iterator = reader.lines().iterator();
|
Iterator<String> iterator = reader.lines().iterator();
|
||||||
List<String> rows = new ArrayList<>();
|
List<String> rows = new ArrayList<>();
|
||||||
boolean isFirst = true;
|
boolean isFirst = true;
|
||||||
|
boolean isFirstArray = true;
|
||||||
|
boolean isFileEmpty = true;
|
||||||
|
|
||||||
|
AtomicReference<Integer> previousFid = new AtomicReference<>();
|
||||||
while (iterator.hasNext()) {
|
while (iterator.hasNext()) {
|
||||||
String line = iterator.next();
|
String line = iterator.next();
|
||||||
|
|
||||||
|
|
@ -67,7 +78,30 @@ public class JsonExporter implements Exporter {
|
||||||
if (!isFirst && (FIRST_LEVEL_TABLES.contains(tableName) || line.equals("EOF"))) {
|
if (!isFirst && (FIRST_LEVEL_TABLES.contains(tableName) || line.equals("EOF"))) {
|
||||||
TableData parentData = buildTableDataHierarchy(rows, tableMetaDataMap);
|
TableData parentData = buildTableDataHierarchy(rows, tableMetaDataMap);
|
||||||
if (parentData != null) {
|
if (parentData != null) {
|
||||||
jsonMapper.writeValue(jsonGenerator, parentData);
|
if (isPassportOgrnFid) {
|
||||||
|
Object currentFidField = parentData.getFieldData().stream()
|
||||||
|
.filter(fd -> fd.columnName().equals("FID") && fd.columnValue() != null)
|
||||||
|
.findFirst()
|
||||||
|
.orElse(new TableData.FieldData("FID", null))
|
||||||
|
.columnValue();
|
||||||
|
|
||||||
|
if (previousFid.get() == null || (currentFidField != null && Integer.parseInt(currentFidField.toString()) != previousFid.get())) {
|
||||||
|
previousFid.set(Integer.parseInt(currentFidField.toString()));
|
||||||
|
if (!isFirstArray) {
|
||||||
|
jsonGenerator.writeEndArray();
|
||||||
|
}
|
||||||
|
jsonGenerator.writeStartArray();
|
||||||
|
jsonMapper.writeValue(jsonGenerator, parentData);
|
||||||
|
isFirstArray = false;
|
||||||
|
isFileEmpty = false;
|
||||||
|
} else {
|
||||||
|
jsonMapper.writeValue(jsonGenerator, parentData);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
jsonGenerator.writeStartArray();
|
||||||
|
jsonMapper.writeValue(jsonGenerator, parentData);
|
||||||
|
jsonGenerator.writeEndArray();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
rows.clear();
|
rows.clear();
|
||||||
}
|
}
|
||||||
|
|
@ -76,8 +110,14 @@ public class JsonExporter implements Exporter {
|
||||||
isFirst = false;
|
isFirst = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
jsonGenerator.writeEndArray();
|
if (!isPassportOgrnFid) {
|
||||||
jsonGenerator.writeEndArray();
|
jsonGenerator.writeEndArray(); // Закрываем массив объекта
|
||||||
|
} else if (!isFileEmpty) {
|
||||||
|
jsonGenerator.writeEndArray(); // Закрываем массивы объектов с одним FID для PASSPORT, OGRN, FID
|
||||||
|
jsonGenerator.writeEndArray(); // Закрываем общий массив
|
||||||
|
} else {
|
||||||
|
jsonGenerator.writeEndArray(); // Если файл пуст, закрываем только общий массив
|
||||||
|
}
|
||||||
jsonGenerator.writeEndObject();
|
jsonGenerator.writeEndObject();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
log.error(e.getMessage(), e);
|
log.error(e.getMessage(), e);
|
||||||
|
|
|
||||||
|
|
@ -143,7 +143,7 @@ public class IndicSearchService {
|
||||||
sw.start();
|
sw.start();
|
||||||
|
|
||||||
if (rowCounter.longValue() < rowLimit && !IS_EXPORT_AS_EXCEL) {
|
if (rowCounter.longValue() < rowLimit && !IS_EXPORT_AS_EXCEL) {
|
||||||
jsonExporter.writeJsonFile(aggregatedFile, taskId, tableMetaDataMap);
|
jsonExporter.writeJsonFile(aggregatedFile, taskId, request.getSearchParameter(), tableMetaDataMap);
|
||||||
} else {
|
} else {
|
||||||
fillTableMetaDataWithLocalization(tableMetaDataMap);
|
fillTableMetaDataWithLocalization(tableMetaDataMap);
|
||||||
excelExporter.writeExcelFile(aggregatedFile, taskId, rowCounter.longValue(), tableMetaDataMap);
|
excelExporter.writeExcelFile(aggregatedFile, taskId, rowCounter.longValue(), tableMetaDataMap);
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,75 @@
|
||||||
|
package ru.nbch.indicsearchservice.exporter;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
import ru.nbch.indicsearchservice.config.settings.ApplicationSettings;
|
||||||
|
import ru.nbch.indicsearchservice.model.TableMetaData;
|
||||||
|
import ru.nbch.indicsearchservice.model.enums.SearchParameter;
|
||||||
|
|
||||||
|
@SpringBootTest
|
||||||
|
class JsonExporterTest {
|
||||||
|
@Autowired
|
||||||
|
ApplicationSettings applicationSettings;
|
||||||
|
@Autowired
|
||||||
|
JsonExporter jsonExporter;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void writeJsonFile_shouldCreateJsonFilePASSPORT() throws IOException {
|
||||||
|
Path aggregatedFile = Path.of("src/test/resources/storage/test-json-aggregated.csv");
|
||||||
|
UUID uuid = UUID.fromString("c3805074-e840-4d4e-bfa3-eee1fefd4907");
|
||||||
|
|
||||||
|
TableMetaData ruUidTableTableMetaData = new TableMetaData("RU_UID");
|
||||||
|
ruUidTableTableMetaData.addField("FID");
|
||||||
|
ruUidTableTableMetaData.addField("SERIAL_NUM");
|
||||||
|
TableMetaData ruApplicationTableTableMetaData = new TableMetaData("RU_APPLICATION");
|
||||||
|
ruApplicationTableTableMetaData.addField("FID");
|
||||||
|
ruApplicationTableTableMetaData.addField("SERIAL_NUM");
|
||||||
|
|
||||||
|
Map<String, TableMetaData> tableMetaDataMap = new HashMap<>();
|
||||||
|
tableMetaDataMap.put("RU_UID", ruUidTableTableMetaData);
|
||||||
|
tableMetaDataMap.put("RU_APPLICATION", ruApplicationTableTableMetaData);
|
||||||
|
|
||||||
|
jsonExporter.writeJsonFile(aggregatedFile, uuid, SearchParameter.PASSPORT, tableMetaDataMap);
|
||||||
|
|
||||||
|
Path resultFile = applicationSettings.getStorageDirectory().toPath().resolve("c3805074-e840-4d4e-bfa3-eee1fefd4907.json");
|
||||||
|
List<String> resultFileStrings = Files.readAllLines(resultFile);
|
||||||
|
|
||||||
|
assertThat(resultFileStrings.getFirst())
|
||||||
|
.isEqualTo("{\"datasheets\":[[{\"table_name\":\"RU_UID\",\"field_data\":[{\"key\":\"FID\",\"value\":\"1\"},{\"key\":\"SERIAL_NUM\",\"value\":\"11\"}],\"related_data\":[]},{\"table_name\":\"RU_UID\",\"field_data\":[{\"key\":\"FID\",\"value\":\"1\"},{\"key\":\"SERIAL_NUM\",\"value\":\"21\"}],\"related_data\":[{\"table_name\":\"RU_TRADE\",\"field_data\":[],\"related_data\":[]}]}],[{\"table_name\":\"RU_APPLICATION\",\"field_data\":[{\"key\":\"FID\",\"value\":\"2\"},{\"key\":\"SERIAL_NUM\",\"value\":\"12\"}],\"related_data\":[]}],[{\"table_name\":\"RU_APPLICATION\",\"field_data\":[{\"key\":\"FID\",\"value\":\"3\"},{\"key\":\"SERIAL_NUM\",\"value\":\"22\"}],\"related_data\":[]}]]}");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void writeJsonFile_shouldCreateJsonFileUUID() throws IOException {
|
||||||
|
Path aggregatedFile = Path.of("src/test/resources/storage/test-json-aggregated.csv");
|
||||||
|
UUID uuid = UUID.fromString("c3805074-e840-4d4e-bfa3-eee1fefd4907");
|
||||||
|
|
||||||
|
TableMetaData ruUidTableTableMetaData = new TableMetaData("RU_UID");
|
||||||
|
ruUidTableTableMetaData.addField("FID");
|
||||||
|
ruUidTableTableMetaData.addField("SERIAL_NUM");
|
||||||
|
TableMetaData ruApplicationTableTableMetaData = new TableMetaData("RU_APPLICATION");
|
||||||
|
ruApplicationTableTableMetaData.addField("FID");
|
||||||
|
ruApplicationTableTableMetaData.addField("SERIAL_NUM");
|
||||||
|
|
||||||
|
Map<String, TableMetaData> tableMetaDataMap = new HashMap<>();
|
||||||
|
tableMetaDataMap.put("RU_UID", ruUidTableTableMetaData);
|
||||||
|
tableMetaDataMap.put("RU_APPLICATION", ruApplicationTableTableMetaData);
|
||||||
|
|
||||||
|
jsonExporter.writeJsonFile(aggregatedFile, uuid, SearchParameter.UUID, tableMetaDataMap);
|
||||||
|
|
||||||
|
Path resultFile = applicationSettings.getStorageDirectory().toPath().resolve("c3805074-e840-4d4e-bfa3-eee1fefd4907.json");
|
||||||
|
List<String> resultFileStrings = Files.readAllLines(resultFile);
|
||||||
|
|
||||||
|
assertThat(resultFileStrings.getFirst())
|
||||||
|
.isEqualTo("{\"datasheets\":[[{\"table_name\":\"RU_UID\",\"field_data\":[{\"key\":\"FID\",\"value\":\"1\"},{\"key\":\"SERIAL_NUM\",\"value\":\"11\"}],\"related_data\":[]}],[{\"table_name\":\"RU_UID\",\"field_data\":[{\"key\":\"FID\",\"value\":\"1\"},{\"key\":\"SERIAL_NUM\",\"value\":\"21\"}],\"related_data\":[{\"table_name\":\"RU_TRADE\",\"field_data\":[],\"related_data\":[]}]}],[{\"table_name\":\"RU_APPLICATION\",\"field_data\":[{\"key\":\"FID\",\"value\":\"2\"},{\"key\":\"SERIAL_NUM\",\"value\":\"12\"}],\"related_data\":[]}],[{\"table_name\":\"RU_APPLICATION\",\"field_data\":[{\"key\":\"FID\",\"value\":\"3\"},{\"key\":\"SERIAL_NUM\",\"value\":\"22\"}],\"related_data\":[]}]]}");
|
||||||
|
}
|
||||||
|
}
|
||||||
18
src/test/resources/application.properties
Normal file
18
src/test/resources/application.properties
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
spring.application.name=indic-search-service
|
||||||
|
|
||||||
|
logging.level.org.springframework.boot.context.config=DEBUG
|
||||||
|
|
||||||
|
# Database properties
|
||||||
|
app.data-source.driver=com.ibm.db2.jcc.DB2Driver
|
||||||
|
app.data-source.username=ros9lk
|
||||||
|
app.data-source.password=ros9lk
|
||||||
|
app.data-source.url=jdbc:db2://10.230.227.21:2667/DEVSUPPL:currentSchema=ROS9LK;
|
||||||
|
app.data-source.connection-timeout=40000
|
||||||
|
app.data-source.validation-timeout=5000
|
||||||
|
app.data-source.idle-timeout=600000
|
||||||
|
app.data-source.max-pool-size=10
|
||||||
|
app.data-source.max-lifetime=1800000
|
||||||
|
app.data-source.keep-alive-time=120000
|
||||||
|
|
||||||
|
app.storage-directory=C:\\Users\\inikolaev\\Desktop\\1
|
||||||
|
#app.storage-directory=C:\\Users\\ivan\\Desktop\\storage
|
||||||
6
src/test/resources/storage/test-json-aggregated.csv
Normal file
6
src/test/resources/storage/test-json-aggregated.csv
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
RU_UID%%%FID%%%1%%%SERIAL_NUM%%%11%%%
|
||||||
|
RU_UID%%%FID%%%1%%%SERIAL_NUM%%%21%%%
|
||||||
|
RU_TRADE%%%FID%%%1%%%SERIAL_NUM%%%31%%%ACC_SERIAL_NUM%%%21%%%
|
||||||
|
RU_APPLICATION%%%FID%%%2%%%SERIAL_NUM%%%12%%%
|
||||||
|
RU_APPLICATION%%%FID%%%3%%%SERIAL_NUM%%%22%%%
|
||||||
|
EOF
|
||||||
|
Loading…
Add table
Reference in a new issue