Search in sources :

Example 1 with RelationRequest

use of io.openk9.entity.manager.model.payload.RelationRequest in project openk9 by smclab.

the class GetOrAddEntitiesConsumer method writeRelations.

public Mono<ResponseList> writeRelations(List<EntityContext> entityContext) {
    return Mono.defer(() -> {
        List<Statement> statementList = new ArrayList<>();
        for (EntityContext context : entityContext) {
            EntityRequest entityRequest = context.getEntityRequest();
            List<RelationRequest> relations = entityRequest.getRelations();
            if (relations == null || relations.isEmpty()) {
                continue;
            }
            Entity currentEntity = context.getEntity();
            List<Tuple2<String, Entity>> entityRelations = entityContext.stream().flatMap(entry -> {
                for (RelationRequest relation : relations) {
                    if (entry.getEntityRequest().getTmpId() == relation.getTo()) {
                        return Stream.of(Tuples.of(relation.getName(), entry.getEntity()));
                    }
                }
                return Stream.empty();
            }).collect(Collectors.toList());
            Node currentEntityNode = Cypher.node(currentEntity.getType()).named("a");
            List<Statement> currentStatementList = entityRelations.stream().map(t2 -> {
                Entity entityRelation = t2.getT2();
                Node entityRelationNode = Cypher.node(entityRelation.getType()).named("b");
                return Cypher.match(currentEntityNode, entityRelationNode).where(Functions.id(currentEntityNode).eq(literalOf(currentEntity.getId())).and(Functions.id(entityRelationNode).eq(literalOf(entityRelation.getId())))).merge(currentEntityNode.relationshipTo(entityRelationNode, t2.getT1())).build();
            }).collect(Collectors.toList());
            statementList.addAll(currentStatementList);
        }
        List<Response> response = entityContext.stream().map(context -> Response.builder().entity(Entity.builder().name(context.getEntity().getName()).id(context.getEntity().getId()).tenantId(context.getEntity().getTenantId()).type(context.getEntity().getType()).build()).tmpId(context.getEntityRequest().getTmpId()).build()).collect(Collectors.toList());
        if (statementList.size() > 1) {
            return _graphClient.write(Cypher.unionAll(statementList.toArray(new Statement[0]))).then(Mono.just(ResponseList.of("", response)));
        } else if (statementList.size() == 1) {
            return _graphClient.write(statementList.get(0)).then(Mono.just(ResponseList.of("", response)));
        } else {
            return Mono.just(ResponseList.of("", response));
        }
    });
}
Also used : Response(io.openk9.entity.manager.model.payload.Response) SenderReactor(io.openk9.ingestion.api.SenderReactor) Disposable(reactor.core.Disposable) JsonNode(io.openk9.json.api.JsonNode) LoggerFactory(org.slf4j.LoggerFactory) Tuples(reactor.util.function.Tuples) Tuple2(reactor.util.function.Tuple2) TimeoutException(java.util.concurrent.TimeoutException) EntityRequest(io.openk9.entity.manager.model.payload.EntityRequest) GraphClient(io.openk9.relationship.graph.api.client.GraphClient) ArrayNode(io.openk9.json.api.ArrayNode) JsonFactory(io.openk9.json.api.JsonFactory) ArrayList(java.util.ArrayList) Component(org.osgi.service.component.annotations.Component) Statement(org.neo4j.cypherdsl.core.Statement) Duration(java.time.Duration) OutboundMessageFactory(io.openk9.ingestion.api.OutboundMessageFactory) Schedulers(reactor.core.scheduler.Schedulers) Request(io.openk9.entity.manager.model.payload.Request) Cypher(org.neo4j.cypherdsl.core.Cypher) Activate(org.osgi.service.component.annotations.Activate) Node(org.neo4j.cypherdsl.core.Node) Binding(io.openk9.ingestion.api.Binding) Logger(org.slf4j.Logger) Deactivate(org.osgi.service.component.annotations.Deactivate) Functions(org.neo4j.cypherdsl.core.Functions) RelationRequest(io.openk9.entity.manager.model.payload.RelationRequest) Mono(reactor.core.publisher.Mono) Entity(io.openk9.entity.manager.model.Entity) Collectors(java.util.stream.Collectors) Flux(reactor.core.publisher.Flux) List(java.util.List) Stream(java.util.stream.Stream) ResponseList(io.openk9.entity.manager.model.payload.ResponseList) ReceiverReactor(io.openk9.ingestion.api.ReceiverReactor) Modified(org.osgi.service.component.annotations.Modified) Optional(java.util.Optional) ObjectNode(io.openk9.json.api.ObjectNode) Reference(org.osgi.service.component.annotations.Reference) Cypher.literalOf(org.neo4j.cypherdsl.core.Cypher.literalOf) Entity(io.openk9.entity.manager.model.Entity) Statement(org.neo4j.cypherdsl.core.Statement) RelationRequest(io.openk9.entity.manager.model.payload.RelationRequest) JsonNode(io.openk9.json.api.JsonNode) ArrayNode(io.openk9.json.api.ArrayNode) Node(org.neo4j.cypherdsl.core.Node) ObjectNode(io.openk9.json.api.ObjectNode) ArrayList(java.util.ArrayList) Response(io.openk9.entity.manager.model.payload.Response) EntityRequest(io.openk9.entity.manager.model.payload.EntityRequest) Tuple2(reactor.util.function.Tuple2)

Example 2 with RelationRequest

use of io.openk9.entity.manager.model.payload.RelationRequest in project openk9 by smclab.

the class EntityManagerBus method run.

@SneakyThrows
public void run() {
    while (true) {
        Payload request = _entityManagerQueue.take();
        TransactionContext transactionContext = _hazelcastInstance.newTransactionContext();
        transactionContext.beginTransaction();
        try {
            TransactionalMap<EntityKey, Entity> entityTransactionalMap = transactionContext.getMap("entityMap");
            TransactionalMap<EntityRelationKey, EntityRelation> transactionalEntityRelationMap = transactionContext.getMap("entityRelationMap");
            TransactionalMultiMap<DocumentKey, String> documentEntityMap = transactionContext.getMultiMap("documentEntityMap");
            EntityManagerRequest payload = request.getPayload();
            _loggerAggregator.emitLog("process ingestionId", payload.getIngestionId());
            long tenantId = payload.getTenantId();
            String ingestionId = payload.getIngestionId();
            List<EntityRequest> entities = request.getEntities();
            Map<EntityKey, Entity> localEntityMap = new HashMap<>(entities.size());
            for (EntityRequest entityRequest : entities) {
                String name = entityRequest.getName();
                String type = entityRequest.getType();
                String cacheId = Long.toString(_entityFlakeId.newId());
                EntityKey key = EntityKey.of(tenantId, name, type, cacheId, ingestionId);
                Entity entity = new Entity(null, cacheId, tenantId, name, type, null, ingestionId, false, true, entityRequest.getContext());
                entityTransactionalMap.set(key, entity);
                localEntityMap.put(key, entity);
                for (EntityRequest entityRequest2 : entities) {
                    for (RelationRequest relation : entityRequest2.getRelations()) {
                        if (relation.getTo().equals(entityRequest.getTmpId())) {
                            relation.setTo(entity.getCacheId());
                        }
                    }
                }
            }
            for (EntityRequest entity : entities) {
                List<RelationRequest> relations = entity.getRelations();
                if (relations == null || relations.isEmpty()) {
                    continue;
                }
                Collection<Entity> values = localEntityMap.values();
                Entity current = values.stream().filter(e -> e.getName().equals(entity.getName()) && e.getType().equals(entity.getType())).findFirst().orElse(null);
                if (current == null) {
                    continue;
                }
                for (RelationRequest relation : relations) {
                    String to = relation.getTo();
                    String name = relation.getName();
                    for (Entity value : values) {
                        if (value.getCacheId().equals(to)) {
                            long entityRelationId = _entityRelationFlakeId.newId();
                            EntityRelation entityRelation = new EntityRelation(entityRelationId, current.getCacheId(), ingestionId, name, value.getCacheId());
                            transactionalEntityRelationMap.set(EntityRelationKey.of(entityRelationId, current.getCacheId(), ingestionId), entityRelation);
                        }
                    }
                }
            }
            if (!localEntityMap.isEmpty()) {
                DocumentKey key = DocumentKey.of(payload.getDatasourceId(), payload.getContentId(), tenantId);
                for (Entity value : localEntityMap.values()) {
                    documentEntityMap.put(key, value.getCacheId());
                }
            }
        } catch (Exception e) {
            _log.error(e.getMessage(), e);
            transactionContext.rollbackTransaction();
        } finally {
            transactionContext.commitTransaction();
        }
    }
}
Also used : Entity(io.openk9.entity.manager.cache.model.Entity) HashMap(java.util.HashMap) RelationRequest(io.openk9.entity.manager.dto.RelationRequest) EntityRelationKey(io.openk9.entity.manager.cache.model.EntityRelationKey) EntityKey(io.openk9.entity.manager.cache.model.EntityKey) EntityRelation(io.openk9.entity.manager.cache.model.EntityRelation) EntityRequest(io.openk9.entity.manager.dto.EntityRequest) TransactionContext(com.hazelcast.transaction.TransactionContext) DocumentKey(io.openk9.entity.manager.cache.model.DocumentKey) Payload(io.openk9.entity.manager.dto.Payload) EntityManagerRequest(io.openk9.entity.manager.dto.EntityManagerRequest) SneakyThrows(lombok.SneakyThrows)

Example 3 with RelationRequest

use of io.openk9.entity.manager.model.payload.RelationRequest in project openk9 by smclab.

the class GetOrAddEntitiesHttpHandler method writeRelations.

public Mono<ResponseList> writeRelations(List<EntityContext> entityContext) {
    return Mono.defer(() -> {
        List<Statement> statementList = new ArrayList<>();
        for (EntityContext context : entityContext) {
            EntityRequest entityRequest = context.getEntityRequest();
            List<RelationRequest> relations = entityRequest.getRelations();
            if (relations == null || relations.isEmpty()) {
                continue;
            }
            Entity currentEntity = context.getEntity();
            List<Tuple2<String, Entity>> entityRelations = entityContext.stream().flatMap(entry -> {
                for (RelationRequest relation : relations) {
                    if (entry.getEntityRequest().getTmpId() == relation.getTo()) {
                        return Stream.of(Tuples.of(relation.getName(), entry.getEntity()));
                    }
                }
                return Stream.empty();
            }).collect(Collectors.toList());
            Node currentEntityNode = Cypher.node(currentEntity.getType()).named("a");
            List<Statement> currentStatementList = entityRelations.stream().map(t2 -> {
                Entity entityRelation = t2.getT2();
                Node entityRelationNode = Cypher.node(entityRelation.getType()).named("b");
                return Cypher.match(currentEntityNode, entityRelationNode).where(Functions.id(currentEntityNode).eq(literalOf(currentEntity.getId())).and(Functions.id(entityRelationNode).eq(literalOf(entityRelation.getId())))).merge(currentEntityNode.relationshipTo(entityRelationNode, t2.getT1())).build();
            }).collect(Collectors.toList());
            statementList.addAll(currentStatementList);
        }
        List<Response> response = entityContext.stream().map(context -> Response.builder().entity(Entity.builder().name(context.getEntity().getName()).id(context.getEntity().getId()).tenantId(context.getEntity().getTenantId()).type(context.getEntity().getType()).build()).tmpId(context.getEntityRequest().getTmpId()).build()).collect(Collectors.toList());
        if (statementList.size() > 1) {
            return _graphClient.write(Cypher.unionAll(statementList.toArray(new Statement[0]))).then(Mono.just(ResponseList.of("", response)));
        } else if (statementList.size() == 1) {
            return _graphClient.write(statementList.get(0)).then(Mono.just(ResponseList.of("", response)));
        } else {
            return Mono.just(ResponseList.of("", response));
        }
    });
}
Also used : HttpServerResponse(reactor.netty.http.server.HttpServerResponse) Response(io.openk9.entity.manager.model.payload.Response) Tuples(reactor.util.function.Tuples) Tuple2(reactor.util.function.Tuple2) HttpResponseWriter(io.openk9.http.util.HttpResponseWriter) EntityRequest(io.openk9.entity.manager.model.payload.EntityRequest) GraphClient(io.openk9.relationship.graph.api.client.GraphClient) JsonFactory(io.openk9.json.api.JsonFactory) ArrayList(java.util.ArrayList) ReactorNettyUtils(io.openk9.reactor.netty.util.ReactorNettyUtils) Component(org.osgi.service.component.annotations.Component) Statement(org.neo4j.cypherdsl.core.Statement) Request(io.openk9.entity.manager.model.payload.Request) Cypher(org.neo4j.cypherdsl.core.Cypher) Activate(org.osgi.service.component.annotations.Activate) Node(org.neo4j.cypherdsl.core.Node) RouterHandler(io.openk9.http.web.RouterHandler) Deactivate(org.osgi.service.component.annotations.Deactivate) Publisher(org.reactivestreams.Publisher) Functions(org.neo4j.cypherdsl.core.Functions) RelationRequest(io.openk9.entity.manager.model.payload.RelationRequest) Mono(reactor.core.publisher.Mono) Entity(io.openk9.entity.manager.model.Entity) Collectors(java.util.stream.Collectors) Flux(reactor.core.publisher.Flux) HttpServerRequest(reactor.netty.http.server.HttpServerRequest) List(java.util.List) HttpHandler(io.openk9.http.web.HttpHandler) Stream(java.util.stream.Stream) ResponseList(io.openk9.entity.manager.model.payload.ResponseList) Modified(org.osgi.service.component.annotations.Modified) Reference(org.osgi.service.component.annotations.Reference) Cypher.literalOf(org.neo4j.cypherdsl.core.Cypher.literalOf) HttpServerRoutes(reactor.netty.http.server.HttpServerRoutes) Entity(io.openk9.entity.manager.model.Entity) Statement(org.neo4j.cypherdsl.core.Statement) RelationRequest(io.openk9.entity.manager.model.payload.RelationRequest) Node(org.neo4j.cypherdsl.core.Node) ArrayList(java.util.ArrayList) HttpServerResponse(reactor.netty.http.server.HttpServerResponse) Response(io.openk9.entity.manager.model.payload.Response) EntityRequest(io.openk9.entity.manager.model.payload.EntityRequest) Tuple2(reactor.util.function.Tuple2)

Aggregations

Entity (io.openk9.entity.manager.model.Entity)2 EntityRequest (io.openk9.entity.manager.model.payload.EntityRequest)2 RelationRequest (io.openk9.entity.manager.model.payload.RelationRequest)2 Request (io.openk9.entity.manager.model.payload.Request)2 Response (io.openk9.entity.manager.model.payload.Response)2 ResponseList (io.openk9.entity.manager.model.payload.ResponseList)2 JsonFactory (io.openk9.json.api.JsonFactory)2 GraphClient (io.openk9.relationship.graph.api.client.GraphClient)2 ArrayList (java.util.ArrayList)2 List (java.util.List)2 Collectors (java.util.stream.Collectors)2 Stream (java.util.stream.Stream)2 Cypher (org.neo4j.cypherdsl.core.Cypher)2 Cypher.literalOf (org.neo4j.cypherdsl.core.Cypher.literalOf)2 Functions (org.neo4j.cypherdsl.core.Functions)2 Node (org.neo4j.cypherdsl.core.Node)2 Statement (org.neo4j.cypherdsl.core.Statement)2 Activate (org.osgi.service.component.annotations.Activate)2 TransactionContext (com.hazelcast.transaction.TransactionContext)1 DocumentKey (io.openk9.entity.manager.cache.model.DocumentKey)1