List of usage examples for io.vertx.core.json JsonArray size
public int size()
From source file:org.entcore.feeder.dictionary.structures.DuplicateUsers.java
License:Open Source License
public void mergeBykeys(final Message<JsonObject> message) { final JsonObject error = new JsonObject().put("status", "error"); final String originalUserId = message.body().getString("originalUserId"); if (originalUserId == null || originalUserId.isEmpty()) { message.reply(error.put("message", "invalid.original.user")); return;/*from ww w . j a va2s .co m*/ } final JsonArray mergeKeys = message.body().getJsonArray("mergeKeys"); if (mergeKeys == null || mergeKeys.size() < 1) { message.reply(error.put("message", "invalid.merge.keys")); return; } final JsonObject params = new JsonObject().put("userId", originalUserId); TransactionManager.getNeo4jHelper().execute("MATCH (u:User {id: {userId}}) RETURN u.mergeKey as mergeKey", params, new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> event) { JsonArray result = event.body().getJsonArray("result"); if ("ok".equals(event.body().getString("status")) && result.size() == 1) { String mergeKey = result.getJsonObject(0).getString("mergeKey"); if (mergeKey != null && mergeKeys.contains(mergeKey)) { final JsonArray tmp = new fr.wseduc.webutils.collections.JsonArray(); for (Object o : mergeKeys) { if (!mergeKey.equals(o)) { tmp.add(o); } } if (tmp.size() > 0) { params.put("mergeKeys", tmp); } else { message.reply(error.put("message", "invalid.merge.keys")); return; } } else { params.put("mergeKeys", mergeKeys); } try { TransactionHelper tx = TransactionManager.getTransaction(); tx.add("MATCH (u:User {id: {userId}}), (mu:User)-[rin:IN]->(gin:Group) " + "WHERE HEAD(u.profiles) = 'Relative' AND HEAD(mu.profiles) = 'Relative' " + "AND NOT(HAS(u.mergedWith)) AND mu.mergeKey IN {mergeKeys} " + "MERGE u-[:IN]->gin " + "DELETE rin ", params); tx.add("MATCH (u:User {id: {userId}}), (mu:User)-[rcom:COMMUNIQUE]->(gcom:Group) " + "WHERE HEAD(u.profiles) = 'Relative' AND HEAD(mu.profiles) = 'Relative' " + "AND NOT(HAS(u.mergedWith)) AND mu.mergeKey IN {mergeKeys} " + "MERGE u-[:COMMUNIQUE]->gcom " + "DELETE rcom ", params); tx.add("MATCH (u:User {id: {userId}}), (mu:User)<-[rcomr:COMMUNIQUE]-(gcomr:Group) " + "WHERE HEAD(u.profiles) = 'Relative' AND HEAD(mu.profiles) = 'Relative' " + "AND NOT(HAS(u.mergedWith)) AND mu.mergeKey IN {mergeKeys} " + "MERGE u<-[:COMMUNIQUE]-gcomr " + "DELETE rcomr ", params); tx.add("MATCH (u:User {id: {userId}}), (mu:User)-[rr:RELATED]->(ur:User) " + "WHERE HEAD(u.profiles) = 'Relative' AND HEAD(mu.profiles) = 'Relative' " + "AND NOT(HAS(u.mergedWith)) AND mu.mergeKey IN {mergeKeys} " + "MERGE u-[:RELATED]->ur " + "DELETE rr ", params); tx.add("MATCH (u:User {id: {userId}}), (mu:User)<-[rrr:RELATED]-(urr:User) " + "WHERE HEAD(u.profiles) = 'Relative' AND HEAD(mu.profiles) = 'Relative' " + "AND NOT(HAS(u.mergedWith)) AND mu.mergeKey IN {mergeKeys} " + "MERGE u<-[:RELATED]-urr " + "DELETE rrr ", params); tx.add("MATCH (u:User {id: {userId}}), (mu:User) " + "WHERE HEAD(u.profiles) = 'Relative' AND HEAD(mu.profiles) = 'Relative' " + "AND NOT(HAS(u.mergedWith)) AND mu.mergeKey IN {mergeKeys} " + // AND LENGTH(mu.joinKey) < 2 " + "SET mu.mergedWith = {userId}, mu.mergeKey = null, u.mergedLogins = coalesce(u.mergedLogins, []) + mu.login " + // ", u.joinKey = FILTER(eId IN u.joinKey WHERE eId <> mu.externalId) + mu.externalId " + "MERGE mu-[:MERGED]->u " + "RETURN u.mergedLogins as mergedLogins ", params); tx.commit(new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> event) { message.reply(event.body()); } }); } catch (TransactionException e) { log.error("transaction.error", e); message.reply(error.put("message", "transaction.error")); } } else { message.reply(error.put("message", "user.not.found")); } } }); }
From source file:org.entcore.feeder.dictionary.structures.DuplicateUsers.java
License:Open Source License
private void searchDuplicatesByProfile(String last, final String profile, final Handler<Void> handler) { String query = "MATCH (u:User) WHERE u.modified > {lastSearchDuplicate} AND HEAD(u.profiles) = {profile} AND NOT(HAS(u.deleteDate)) " + "RETURN u.id as id, u.firstName as firstName, u.lastName as lastName, " + "u.birthDate as birthDate, u.email as email, u.source as source, u.disappearanceDate as disappearanceDate"; JsonObject params = new JsonObject().put("profile", profile).put("lastSearchDuplicate", last); TransactionManager.getNeo4jHelper().execute(query, params, new Handler<Message<JsonObject>>() { @Override/*from w w w.j av a2 s .c om*/ public void handle(Message<JsonObject> event) { JsonArray result = event.body().getJsonArray("result"); if ("ok".equals(event.body().getString("status")) && result != null && result.size() > 0) { scoreDuplicates(profile, result, handler); } else { if ("ok".equals(event.body().getString("status"))) { log.info("No users findings for search duplicates"); } else { log.error( "Error finding users for search duplicates : " + event.body().getString("message")); } handler.handle(null); } } }); }
From source file:org.entcore.feeder.dictionary.structures.DuplicateUsers.java
License:Open Source License
private void scoreDuplicates(final String profile, final JsonArray search, final Handler<Void> handler) { final String query = "START u=node:node_auto_index({luceneQuery}) " + "WHERE HEAD(u.profiles) = {profile} AND u.id <> {id} AND NOT(HAS(u.deleteDate)) " + "RETURN u.id as id, u.firstName as firstName, u.lastName as lastName, " + "u.birthDate as birthDate, u.email as email, u.source as source, u.disappearanceDate as disappearanceDate"; final JsonObject params = new JsonObject().put("profile", profile); TransactionHelper tx;/* w ww . j av a 2 s . c o m*/ try { tx = TransactionManager.getTransaction(false); } catch (TransactionException e) { log.error("Error when find duplicate users.", e); return; } final JsonArray result = new fr.wseduc.webutils.collections.JsonArray(); for (int i = 0; i < search.size(); i++) { final JsonObject json = search.getJsonObject(i); final String firstNameAttr = luceneAttribute("firstName", json.getString("firstName"), 0.6); final String lastNameAttr = luceneAttribute("lastName", json.getString("lastName"), 0.6); String luceneQuery; if (firstNameAttr != null && lastNameAttr != null && !firstNameAttr.trim().isEmpty() && !lastNameAttr.trim().isEmpty()) { luceneQuery = firstNameAttr + " AND " + lastNameAttr; result.add(json); tx.add(query, params.copy().put("luceneQuery", luceneQuery).put("id", json.getString("id"))); } } tx.commit(new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> event) { JsonArray results = event.body().getJsonArray("results"); if ("ok".equals(event.body().getString("status")) && results != null && results.size() > 0) { TransactionHelper tx; try { tx = TransactionManager.getTransaction(); tx.setAutoSend(false); } catch (TransactionException e) { log.error("Error when score duplicate users.", e); return; } for (int i = 0; i < results.size(); i++) { JsonArray findUsers = results.getJsonArray(i); if (findUsers == null || findUsers.size() == 0) continue; JsonObject searchUser = result.getJsonObject(i); calculateAndStoreScore(searchUser, findUsers, tx); } if (!tx.isEmpty()) { tx.commit(new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> event) { if ("ok".equals(event.body().getString("status"))) { log.info("Mark duplicates " + profile + " finished."); } else { log.error("Error marking duplicates : " + event.body().getString("message")); } handler.handle(null); } }); } else { log.info("No duplicate user with score > 3 found in profile " + profile); handler.handle(null); } } else { if ("ok".equals(event.body().getString("status"))) { log.info("No duplicate user found in profile " + profile); } else { log.error( "Error finding users for search duplicates : " + event.body().getString("message")); } handler.handle(null); } } }); }
From source file:org.entcore.feeder.dictionary.structures.DuplicateUsers.java
License:Open Source License
private void calculateAndStoreScore(JsonObject searchUser, JsonArray findUsers, TransactionHelper tx) { String query = "MATCH (u:User {id : {sId}}), (d:User {id : {dId}}) " + "WHERE NOT({dId} IN coalesce(u.ignoreDuplicates, [])) AND NOT({sId} IN coalesce(d.ignoreDuplicates, [])) " + "AND (has(u.activationCode) OR has(d.activationCode)) " + "MERGE u-[:DUPLICATE {score:{score}}]-d "; JsonObject params = new JsonObject().put("sId", searchUser.getString("id")); final String lastName = cleanAttribute(searchUser.getString("lastName")); final String firstName = cleanAttribute(searchUser.getString("firstName")); final String birthDate = cleanAttribute(searchUser.getString("birthDate")); final String email = cleanAttribute(searchUser.getString("email")); final String source = searchUser.getString("source"); final Long disappearanceDate = searchUser.getLong("disappearanceDate"); for (int i = 0; i < findUsers.size(); i++) { int score = 2; JsonObject fu = findUsers.getJsonObject(i); score += exactMatch(lastName, cleanAttribute(fu.getString("lastName"))); score += exactMatch(firstName, cleanAttribute(fu.getString("firstName"))); score += exactMatch(birthDate, cleanAttribute(fu.getString("birthDate"))); score += exactMatch(email, cleanAttribute(fu.getString("email"))); if (score > 3 && ((!source.equals(fu.getString("source")) && (notDeduplicateSource.contains(source) ^ notDeduplicateSource.contains(fu.getString("source")))) || disappearanceDate != null || fu.getLong("disappearanceDate") != null)) { tx.add(query, params.copy().put("dId", fu.getString("id")).put("score", score)); }/* w w w .j a v a2s . com*/ } }
From source file:org.entcore.feeder.dictionary.structures.DuplicateUsers.java
License:Open Source License
public void autoMergeDuplicatesInStructure(final Handler<AsyncResult<JsonArray>> handler) { final Handler<JsonObject> duplicatesHandler = new Handler<JsonObject>() { @Override/* w w w.j a v a 2s.c o m*/ public void handle(JsonObject duplicatesRes) { JsonArray res = duplicatesRes.getJsonArray("result"); if ("ok".equals(duplicatesRes.getString("status")) && res != null && res.size() > 0) { try { final TransactionHelper tx = TransactionManager.getTransaction(); final AtomicInteger count = new AtomicInteger(res.size()); final Handler<JsonObject> mergeHandler = new Handler<JsonObject>() { @Override public void handle(JsonObject event) { decrementCount(count, tx); } }; for (Object o : res) { if (!(o instanceof JsonObject)) { decrementCount(count, tx); continue; } JsonObject j = (JsonObject) o; JsonObject u1 = j.getJsonObject("user1"); JsonObject u2 = j.getJsonObject("user2"); if (u1 != null && u2 != null) { mergeDuplicate(new ResultMessage(mergeHandler).put("userId1", u1.getString("id")) .put("userId2", u2.getString("id")), tx); log.info("AutoMerge duplicates - u1 : " + u1.encode() + ", u2 : " + u2.encode()); } else { decrementCount(count, tx); } } } catch (TransactionException e) { log.error("Error in automerge transaction", e); handler.handle(new DefaultAsyncResult<JsonArray>(e)); } } else { log.info("No duplicates automatically mergeable."); handler.handle(new DefaultAsyncResult<>(new fr.wseduc.webutils.collections.JsonArray())); } } private void decrementCount(AtomicInteger count, TransactionHelper tx) { if (count.decrementAndGet() == 0) { tx.commit(new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> event) { if ("ok".equals(event.body().getString("status"))) { if (updateCourses) { AbstractTimetableImporter .updateMergedUsers(event.body().getJsonArray("results")); } handler.handle(new DefaultAsyncResult<>(event.body().getJsonArray("results"))); } else { log.error("Error in automerge duplicates transaction : " + event.body().getString("message")); handler.handle(new DefaultAsyncResult<JsonArray>( new TransactionException(event.body().getString("message")))); } } }); } } }; listDuplicates(new ResultMessage(duplicatesHandler).put("minScore", 5) .put("inSameStructure", autoMergeOnlyInSameStructure).put("inherit", false)); }
From source file:org.entcore.feeder.dictionary.structures.GraphData.java
License:Open Source License
static void loadData(final Neo4j neo4j, final Handler<Message<JsonObject>> handler) { String query = "MATCH (s:Structure) " + "OPTIONAL MATCH s<-[:DEPENDS]-(g:Group) " + "OPTIONAL MATCH s<-[:BELONGS]-(c:Class) " + "return s, collect(distinct g.externalId) as groups, collect(distinct c.externalId) as classes "; neo4j.execute(query, new JsonObject(), new Handler<Message<JsonObject>>() { @Override//from ww w .j a v a 2 s. c om public void handle(Message<JsonObject> message) { String query = "MATCH (p:Profile) " + "OPTIONAL MATCH p<-[:COMPOSE]-(f:Function) " + "return p, collect(distinct f.externalId) as functions "; final AtomicInteger count = new AtomicInteger(2); neo4j.execute(query, new JsonObject(), new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> message) { JsonArray res = message.body().getJsonArray("result"); if ("ok".equals(message.body().getString("status")) && res != null) { for (Object o : res) { if (!(o instanceof JsonObject)) continue; JsonObject r = (JsonObject) o; JsonObject p = r.getJsonObject("p", new JsonObject()).getJsonObject("data"); profiles.putIfAbsent(p.getString("externalId"), new Profile(p, r.getJsonArray("functions"))); } } if (handler != null && count.decrementAndGet() == 0) { handler.handle(message); } } }); JsonArray res = message.body().getJsonArray("result"); if ("ok".equals(message.body().getString("status")) && res != null) { for (Object o : res) { if (!(o instanceof JsonObject)) continue; JsonObject r = (JsonObject) o; JsonObject s = r.getJsonObject("s", new JsonObject()).getJsonObject("data"); Structure structure = new Structure(s, r.getJsonArray("groups"), r.getJsonArray("classes")); String externalId = s.getString("externalId"); structures.putIfAbsent(externalId, structure); String UAI = s.getString("UAI"); if (UAI != null && !UAI.trim().isEmpty()) { structuresByUAI.putIfAbsent(UAI, structure); } JsonArray joinKeys = s.getJsonArray("joinKey"); if (joinKeys != null && joinKeys.size() > 0) { for (Object key : joinKeys) { externalIdMapping.putIfAbsent(key.toString(), externalId); } } } } if (handler != null && count.decrementAndGet() == 0) { handler.handle(message); } } }); }
From source file:org.entcore.feeder.dictionary.structures.Importer.java
License:Open Source License
public void createOrUpdateUser(JsonObject object, JsonArray linkStudent, boolean linkRelativeWithoutChild) { final String error = userValidator.validate(object); if (error != null) { report.addIgnored("Relative", error, object); log.warn(error);/*from w w w . j a v a2s .c o m*/ } else { object.put("source", currentSource); userImportedExternalId.add(object.getString("externalId")); String query = "MERGE (u:User { externalId : {externalId}}) " + "ON CREATE SET u.id = {id}, u.login = {login}, u.activationCode = {activationCode}, " + "u.displayName = {displayName}, u.created = {created} " + "WITH u " + "WHERE u.checksum IS NULL OR u.checksum <> {checksum} " + "SET " + Neo4jUtils.nodeSetPropertiesFromJson("u", object, "id", "externalId", "login", "activationCode", "displayName", "email", "created"); transactionHelper.add(query, object); checkUpdateEmail(object); if (linkStudent != null && linkStudent.size() > 0) { String query2 = "START u0=node:node_auto_index(externalId={externalId}), " + "s=node:node_auto_index({studentExternalIds}) " + "MATCH u0-[:MERGED*0..1]->u " + "WHERE NOT(HAS(u.mergedWith)) " + "MERGE u<-[:RELATED]-s "; JsonObject p = new JsonObject().put("externalId", object.getString("externalId")) .put("studentExternalIds", "externalId:" + Joiner.on(" OR externalId:").join(linkStudent)); transactionHelper.add(query2, p); } else if (linkRelativeWithoutChild) { final String externalId = object.getString("externalId"); JsonArray structures = getMappingStructures(object.getJsonArray("structures")); if (externalId != null && structures != null && structures.size() > 0) { JsonObject p = new JsonObject().put("userExternalId", externalId); String q1 = "MATCH (s:Structure)<-[:DEPENDS]-(g:ProfileGroup)-[:HAS_PROFILE]->(p:Profile), " + "(:User { externalId : {userExternalId}})-[:MERGED*0..1]->(u:User) " + "USING INDEX s:Structure(externalId) " + "USING INDEX p:Profile(externalId) " + "WHERE s.externalId IN {structuresAdmin} " + "AND p.externalId = {profileExternalId} AND NOT(HAS(u.mergedWith)) " + "MERGE u-[:IN]->g"; p.put("structuresAdmin", structures).put("profileExternalId", DefaultProfiles.RELATIVE_PROFILE_EXTERNAL_ID); transactionHelper.add(q1, p); } } } }
From source file:org.entcore.feeder.dictionary.structures.Importer.java
License:Open Source License
public void createOrUpdateGuest(JsonObject object, String[][] linkClasses) { final String error = userValidator.validate(object); if (error != null) { report.addIgnored("Guest", error, object); log.warn(error);//from w ww.ja v a 2 s.c om } else { object.put("source", currentSource); final String externalId = object.getString("externalId"); userImportedExternalId.add(externalId); String query = "MERGE (u:User { externalId : {externalId}}) " + "ON CREATE SET u.id = {id}, u.login = {login}, u.activationCode = {activationCode}, " + "u.displayName = {displayName}, u.created = {created} " + "WITH u " + "WHERE u.checksum IS NULL OR u.checksum <> {checksum} " + "SET " + Neo4jUtils.nodeSetPropertiesFromJson("u", object, "id", "externalId", "login", "activationCode", "displayName", "email", "created"); transactionHelper.add(query, object); checkUpdateEmail(object); JsonArray structures = getMappingStructures(object.getJsonArray("structures")); if (externalId != null && structures != null && structures.size() > 0) { JsonObject p = new JsonObject().put("userExternalId", externalId); String q1 = "MATCH (s:Structure)<-[:DEPENDS]-(g:ProfileGroup)-[:HAS_PROFILE]->(p:Profile), " + "(:User { externalId : {userExternalId}})-[:MERGED*0..1]->(u:User) " + "USING INDEX s:Structure(externalId) " + "USING INDEX p:Profile(externalId) " + "WHERE s.externalId IN {structuresAdmin} " + "AND p.externalId = {profileExternalId} AND NOT(HAS(u.mergedWith)) " + "MERGE u-[:IN]->g"; p.put("structuresAdmin", structures).put("profileExternalId", DefaultProfiles.GUEST_PROFILE_EXTERNAL_ID); transactionHelper.add(q1, p); String qs = "MATCH (:User {externalId : {userExternalId}})-[r:IN|COMMUNIQUE]-(:Group)-[:DEPENDS]->(s:Structure) " + "WHERE NOT(s.externalId IN {structures}) AND (NOT(HAS(r.source)) OR r.source = {source}) " + "DELETE r"; JsonObject ps = new JsonObject().put("userExternalId", externalId).put("source", currentSource) .put("structures", structures); transactionHelper.add(qs, ps); } if (externalId != null && linkClasses != null) { JsonArray classes = new fr.wseduc.webutils.collections.JsonArray(); for (String[] structClass : linkClasses) { if (structClass != null && structClass[0] != null && structClass[1] != null) { String q = "MATCH (s:Structure)<-[:BELONGS]-(c:Class)<-[:DEPENDS]-(g:ProfileGroup)" + "-[:DEPENDS]->(pg:ProfileGroup)-[:HAS_PROFILE]->(p:Profile), " + "(:User { externalId : {userExternalId}})-[:MERGED*0..1]->(u:User) " + "USING INDEX s:Structure(externalId) " + "USING INDEX p:Profile(externalId) " + "WHERE s.externalId = {structure} AND c.externalId = {class} " + "AND p.externalId = {profileExternalId} AND NOT(HAS(u.mergedWith)) " + "MERGE u-[:IN]->g"; JsonObject p = new JsonObject().put("userExternalId", externalId) .put("profileExternalId", DefaultProfiles.GUEST_PROFILE_EXTERNAL_ID) .put("structure", structClass[0]).put("class", structClass[1]); transactionHelper.add(q, p); classes.add(structClass[1]); } } String q = "MATCH (:User {externalId : {userExternalId}})-[r:IN|COMMUNIQUE]-(:Group)-[:DEPENDS]->(c:Class) " + "WHERE NOT(c.externalId IN {classes}) AND (NOT(HAS(r.source)) OR r.source = {source}) " + "DELETE r"; JsonObject p = new JsonObject().put("userExternalId", externalId).put("source", currentSource) .put("classes", classes); transactionHelper.add(q, p); } } }
From source file:org.entcore.feeder.dictionary.structures.Importer.java
License:Open Source License
public void createOrUpdateStudent(JsonObject object, String profileExternalId, String module, JsonArray fieldOfStudy, String[][] linkClasses, String[][] linkGroups, JsonArray relative, boolean nodeQueries, boolean relationshipQueries) { final String error = studentValidator.validate(object); if (error != null) { report.addIgnored("Student", error, object); log.warn(error);/*from w ww . j ava2s . c o m*/ } else { if (nodeQueries) { object.put("source", currentSource); userImportedExternalId.add(object.getString("externalId")); String query = "MERGE (u:`User` { externalId : {externalId}}) " + "ON CREATE SET u.id = {id}, u.login = {login}, u.activationCode = {activationCode}, " + "u.displayName = {displayName}, u.created = {created} " + "WITH u " + "WHERE u.checksum IS NULL OR u.checksum <> {checksum} " + "SET " + Neo4jUtils.nodeSetPropertiesFromJson("u", object, "id", "externalId", "login", "activationCode", "displayName", "email", "created"); transactionHelper.add(query, object); checkUpdateEmail(object); } if (relationshipQueries) { final String externalId = object.getString("externalId"); JsonArray structures = getMappingStructures(object.getJsonArray("structures")); if (externalId != null && structures != null && structures.size() > 0) { String query; JsonObject p = new JsonObject().put("userExternalId", externalId); if (structures.size() == 1) { query = "MATCH (s:Structure {externalId : {structureAdmin}})<-[:DEPENDS]-(g:ProfileGroup)-[:HAS_PROFILE]->(p:Profile {externalId : {profileExternalId}}), " + "(u:User { externalId : {userExternalId}}) " + "WHERE NOT(HAS(u.mergedWith)) " + "MERGE u-[:ADMINISTRATIVE_ATTACHMENT]->s " + "WITH u, g " + "MERGE u-[:IN]->g"; p.put("structureAdmin", structures.getString(0)).put("profileExternalId", profileExternalId); } else { query = "MATCH (s:Structure)<-[:DEPENDS]-(g:ProfileGroup)-[:HAS_PROFILE]->(p:Profile), " + "(u:User { externalId : {userExternalId}})) " + "WHERE s.externalId IN {structuresAdmin} AND NOT(HAS(u.mergedWith)) " + "AND p.externalId = {profileExternalId} " + "MERGE u-[:ADMINISTRATIVE_ATTACHMENT]->s " + "WITH u, g " + "MERGE u-[:IN]->g"; p.put("structuresAdmin", structures).put("profileExternalId", profileExternalId); } transactionHelper.add(query, p); String qs = "MATCH (:User {externalId : {userExternalId}})-[r:IN|COMMUNIQUE]-(:Group)-[:DEPENDS]->(s:Structure) " + "WHERE NOT(s.externalId IN {structures}) AND (NOT(HAS(r.source)) OR r.source = {source}) " + "DELETE r"; JsonObject ps = new JsonObject().put("userExternalId", externalId).put("source", currentSource) .put("structures", structures); transactionHelper.add(qs, ps); final String daa = "MATCH (u:User {externalId : {userExternalId}})-[r:ADMINISTRATIVE_ATTACHMENT]->(s:Structure) " + "WHERE NOT(s.externalId IN {structures}) AND (NOT(HAS(r.source)) OR r.source = {source}) " + "DELETE r"; transactionHelper.add(daa, ps); } JsonArray classes = new fr.wseduc.webutils.collections.JsonArray(); if (externalId != null && linkClasses != null) { for (String[] structClass : linkClasses) { if (structClass != null && structClass[0] != null && structClass[1] != null) { classes.add(structClass[1]); } } String query = "MATCH (c:Class)<-[:DEPENDS]-(g:ProfileGroup)" + "-[:DEPENDS]->(:ProfileGroup)-[:HAS_PROFILE]->(:Profile {externalId : {profileExternalId}}), " + "(u:User { externalId : {userExternalId}}) " + "WHERE c.externalId IN {classes} AND NOT(HAS(u.mergedWith)) " + "MERGE u-[:IN]->g"; JsonObject p0 = new JsonObject().put("userExternalId", externalId) .put("profileExternalId", profileExternalId).put("classes", classes); transactionHelper.add(query, p0); } if (externalId != null) { String q = "MATCH (:User {externalId : {userExternalId}})-[r:IN|COMMUNIQUE]-(:Group)-[:DEPENDS]->(c:Class) " + "WHERE NOT(c.externalId IN {classes}) AND (NOT(HAS(r.source)) OR r.source = {source}) " + "DELETE r"; JsonObject p = new JsonObject().put("userExternalId", externalId).put("source", currentSource) .put("classes", classes); transactionHelper.add(q, p); } final JsonArray groups = new fr.wseduc.webutils.collections.JsonArray(); if (externalId != null && linkGroups != null) { for (String[] structGroup : linkGroups) { if (structGroup != null && structGroup[0] != null && structGroup[1] != null) { groups.add(structGroup[1]); } } String query = "MATCH (g:FunctionalGroup), (u:User { externalId : {userExternalId}}) " + "WHERE g.externalId IN {groups} AND NOT(HAS(u.mergedWith)) " + "MERGE u-[:IN]->g"; JsonObject p = new JsonObject().put("userExternalId", externalId).put("groups", groups); transactionHelper.add(query, p); } if (externalId != null) { final String qdfg = "MATCH (:User {externalId : {userExternalId}})-[r:IN|COMMUNIQUE]-(g:FunctionalGroup) " + "WHERE NOT(g.externalId IN {groups}) AND (NOT(HAS(r.source)) OR r.source = {source}) " + "DELETE r"; final JsonObject pdfg = new JsonObject().put("userExternalId", externalId) .put("source", currentSource).put("groups", groups); transactionHelper.add(qdfg, pdfg); } if (externalId != null && module != null) { String query = "MATCH (u:User {externalId:{userExternalId}}), " + "(m:Module {externalId:{moduleStudent}}) " + "MERGE u-[:FOLLOW]->m"; JsonObject p = new JsonObject().put("userExternalId", externalId).put("moduleStudent", module); transactionHelper.add(query, p); } if (externalId != null && fieldOfStudy != null && fieldOfStudy.size() > 0) { String query = "MATCH (u:User {externalId:{userExternalId}}), (f:FieldOfStudy) " + "WHERE f.externalId IN {fieldOfStudyStudent} " + "MERGE u-[:COURSE]->f"; JsonObject p = new JsonObject().put("userExternalId", externalId).put("fieldOfStudyStudent", fieldOfStudy); transactionHelper.add(query, p); } if (externalId != null && relative != null && relative.size() > 0) { String query2 = "MATCH (:User {externalId:{userExternalId}})-[r:RELATED]->(p:User) " + "WHERE NOT(p.externalId IN {relatives}) " + "DELETE r "; JsonObject p2 = new JsonObject().put("userExternalId", externalId).put("relatives", relative); transactionHelper.add(query2, p2); for (Object o : relative) { if (!(o instanceof String)) continue; String query = "MATCH (u:User {externalId:{userExternalId}}), " + "(:User {externalId:{user}})-[:MERGED*0..1]->(r:User) " + "WHERE NOT(HAS(r.mergedWith)) " + "MERGE u-[:RELATED]->r " + "WITH r, u " + "WHERE {user} <> r.externalId AND LENGTH(FILTER(eId IN u.relative WHERE eId STARTS WITH r.externalId)) = 0 " + "SET u.relative = coalesce(u.relative, []) + (r.externalId + '$10$1$1$0$0') "; JsonObject p = new JsonObject().put("userExternalId", externalId).put("user", (String) o); transactionHelper.add(query, p); } } } } }
From source file:org.entcore.feeder.dictionary.structures.PostImport.java
License:Open Source License
private void wsCall(JsonObject object) { for (String url : object.fieldNames()) { final JsonArray endpoints = object.getJsonArray(url); if (endpoints == null || endpoints.size() < 1) continue; try {/*www . j ava2 s . c om*/ final URI uri = new URI(url); HttpClientOptions options = new HttpClientOptions().setDefaultHost(uri.getHost()) .setDefaultPort(uri.getPort()).setMaxPoolSize(16).setSsl("https".equals(uri.getScheme())) .setConnectTimeout(10000).setKeepAlive(false); final HttpClient client = vertx.createHttpClient(options); final Handler[] handlers = new Handler[endpoints.size() + 1]; handlers[handlers.length - 1] = new Handler<Void>() { @Override public void handle(Void v) { client.close(); } }; for (int i = endpoints.size() - 1; i >= 0; i--) { final int ji = i; handlers[i] = new Handler<Void>() { @Override public void handle(Void v) { final JsonObject j = endpoints.getJsonObject(ji); logger.info("endpoint : " + j.encode()); final HttpClientRequest req = client.request(HttpMethod.valueOf(j.getString("method")), j.getString("uri"), new Handler<HttpClientResponse>() { @Override public void handle(HttpClientResponse resp) { if (resp.statusCode() >= 300) { logger.warn("Endpoint " + j.encode() + " error : " + resp.statusCode() + " " + resp.statusMessage()); } handlers[ji + 1].handle(null); } }); JsonObject headers = j.getJsonObject("headers"); if (headers != null && headers.size() > 0) { for (String h : headers.fieldNames()) { req.putHeader(h, headers.getString(h)); } } req.exceptionHandler( e -> logger.error("Error in ws call post import : " + j.encode(), e)); if (j.getString("body") != null) { req.end(j.getString("body")); } else { req.end(); } } }; } handlers[0].handle(null); } catch (URISyntaxException e) { logger.error("Invalid uri in ws call after import : " + url, e); } } }