All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.unlaxer.jaddress.parser.SearchEngineDataAccessContextImpl Maven / Gradle / Ivy

package org.unlaxer.jaddress.parser;

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.unlaxer.jaddress.ElaticeSearchAccessor;
import org.unlaxer.jaddress.Indexes;
import org.unlaxer.jaddress.gremlin.GremlinUtil;
import org.unlaxer.util.Either;
import org.unlaxer.util.collection.ID;

public class SearchEngineDataAccessContextImpl implements SearchEngineDataAccessContext{
	
	ElaticeSearchAccessor elaticeSearchAccessor;
	
	AddressParser addressParser;
	
	JyuusyoJPDataAccessContext jyuusyoJPDataAccessContext;
	
	public SearchEngineDataAccessContextImpl(
			ElaticeSearchAccessor elaticeSearchAccessor,
			JyuusyoJPDataAccessContext jyuusyoJPDataAccessContext,
			AddressParser addressParser) {
		super();
		this.elaticeSearchAccessor = elaticeSearchAccessor;
		this.jyuusyoJPDataAccessContext = jyuusyoJPDataAccessContext;
		this.addressParser = addressParser;
	}

	@Override
	public CheckExistenceResponse search(CheckExistenceParameter parameter) {
		// TODO Auto-generated method stub
		return null;
	}
	
	@Override
	public CheckExistenceResponse get(ID id) {
		return null;
	}

	
	@Override
	public UpdateResponse update(Stream addresses , DataAccessContext dataAccessContext) {
		
		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 , dataAccessContext);
				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);
			DataAccessContextImpl.logger.info("terminated:" + terminated);
			
			updateResponse.addFailed(listener.failed); 
			updateResponse.addIndexError(listener.errorsIds); 
			
			return updateResponse;

		} catch (Exception e) {
			DataAccessContextImpl.logger.error("error",e);
			updateResponse.addFailed(1);
			updateResponse.addErrorMessage(e.getMessage());
			return updateResponse;
		}
	}
	
	Map createSource(AddressContext addressContext , DataAccessContext dataAccessContext) {

		ParsingContext parsingContext = new ParsingContext(
				dataAccessContext,
				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;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy