org.unlaxer.jaddress.parser.DataAccessContextImpl Maven / Gradle / Ivy
package org.unlaxer.jaddress.parser;
import java.nio.file.Path;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;
import org.apache.tinkerpop.gremlin.driver.remote.DriverRemoteConnection;
import org.apache.tinkerpop.gremlin.process.traversal.AnonymousTraversalSource;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
import org.elasticsearch.action.bulk.BulkProcessor;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.seasar.doma.jdbc.Config;
import org.seasar.doma.jdbc.tx.TransactionManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.unlaxer.jaddress.ElaticeSearchAccessor;
import org.unlaxer.jaddress.Indexes;
import org.unlaxer.jaddress.JyuusyoJPDomaConfig;
import org.unlaxer.jaddress.UserHomeContext;
import org.unlaxer.jaddress.dao.JyuusyoJPDao;
import org.unlaxer.jaddress.dao.JyuusyoJPDaoImpl;
import org.unlaxer.jaddress.entity.jyuusyojp.JyuusyoJP;
import org.unlaxer.jaddress.entity.standard.郵便番号;
import org.unlaxer.jaddress.gremlin.GremlinUtil;
import org.unlaxer.util.Either;
import org.unlaxer.util.collection.ID;
public class DataAccessContextImpl implements DataAccessContext{
ElaticeSearchAccessor elaticeSearchAccessor;
AddressParser addressParser = new AddressParserImpl();
static Logger logger = LoggerFactory.getLogger(DataAccessContextImpl.class);
public static final Path DEFAULT_SQLITE_PATH = UserHomeContext.getPathWithFolderAndFile("jyuusyojp","zenkoku.sqlite3");
JyuusyoJPDao jyuusyoJPDao;
TransactionManager transactionManager;
Config config;
public DataAccessContextImpl(Path pathToJyuusyoJpSqlite) {
super();
config = new JyuusyoJPDomaConfig(pathToJyuusyoJpSqlite);
jyuusyoJPDao = new JyuusyoJPDaoImpl(config);
transactionManager = config.getTransactionManager();
elaticeSearchAccessor = new ElaticeSearchAccessor();
}
public DataAccessContextImpl() {
this(DEFAULT_SQLITE_PATH);
}
@Override
public List extends JyuusyoJP> selectJyuusyoJPsByZip(郵便番号 zip){
List extends JyuusyoJP> addresses = transactionManager.required(() -> {
List extends JyuusyoJP> selectAll = jyuusyoJPDao.selectByZip(zip);
return selectAll;
});
return addresses;
}
@Override
public Stream extends JyuusyoJP> selectAllJyuusyoJP() {
Stream extends JyuusyoJP> addresses = transactionManager.required(() -> {
List extends JyuusyoJP> selectAll = jyuusyoJPDao.selectAll();
return selectAll.stream();
});
return addresses;
}
@Override
public void addIndexToJyuusyoJP() {
transactionManager.required(() -> {
jyuusyoJPDao.addIndex();
});
}
@Override
public void dropIndexFromJyuusyoJP() {
transactionManager.required(() -> {
jyuusyoJPDao.dropIndex();
});
}
// elastic search
@Override
public CheckExistenceResponse search(CheckExistenceParameter parameter) {
// TODO Auto-generated method stub
return null;
}
@Override
public UpdateResponse update(Stream extends AddressContext> addresses) {
UpdateResponse updateResponse = new UpdateResponse();
RestHighLevelClient client = elaticeSearchAccessor.get();
CountableBulkProcessorListerner listener = new CountableBulkProcessorListerner();
try (BulkProcessor bulkProcessor = BulkProcessor
.builder((request, bulkListener) -> client.bulkAsync(request, RequestOptions.DEFAULT, bulkListener),
listener)
.build();
DriverRemoteConnection conn = DriverRemoteConnection.using("localhost", 8182, "g");
GraphTraversalSource g = AnonymousTraversalSource.traversal().withRemote(conn);) {
GremlinUtil gremlinUtil = new GremlinUtil(g);
addresses.forEach(addressContext->{
IndexRequest indexRequest = Indexes.ad_address.createIndexRequest();
indexRequest.id(addressContext.id.toString());
Map source = createSource(addressContext);
if(source.isEmpty()) {
updateResponse.addFailed(1);
updateResponse.addParseError(addressContext.id);
}else {
indexRequest.source(source);
bulkProcessor.add(indexRequest);
updateResponse.addSucceded(1);
}
gremlinUtil.create(addressContext);
});
boolean terminated = bulkProcessor.awaitClose(30L, TimeUnit.SECONDS);
logger.info("terminated:" + terminated);
updateResponse.addFailed(listener.failed);
updateResponse.addIndexError(listener.errorsIds);
return updateResponse;
} catch (Exception e) {
logger.error("error",e);
updateResponse.addFailed(1);
updateResponse.addErrorMessage(e.getMessage());
return updateResponse;
}
}
private Map createSource(AddressContext addressContext) {
ParsingContext parsingContext = new ParsingContext(
new DataAccessContextImpl(),
addressContext
);
addressParser.parse(parsingContext);
AddressContext returning = parsingContext.addressContext;
// var id = returning.id.getName();
Map valueByKey = new TreeMap<>();
valueByKey.put("zip", returning.zip.hyphonated);
valueByKey.put("input", addressContext.addressString.joined());
Either results = parsingContext.addressContext.results();
results.right.ifPresent(result -> {
result.get().stream().forEach(as -> {
as.get().forEach(addressElement -> {
String value = addressElement.asString();
if (value != null && !value.isBlank()) {
valueByKey.put(String.valueOf(addressElement.階層要素().level), value);
}
});
});
});
return valueByKey;
}
@Override
public CheckExistenceResponse get(ID id) {
return null;
}
} © 2015 - 2025 Weber Informatics LLC | Privacy Policy