List of usage examples for io.vertx.core.eventbus Message body
@CacheReturn T body();
From source file:org.entcore.feeder.csv.MappingFinder.java
License:Open Source License
public void findExternalIds(final String structureId, final String path, final String profile, final List<String> columns, final int eII, final String charset, final Handler<JsonArray> handler) { final boolean additionalColumn; final int externalIdIdx; if (eII >= 0) { additionalColumn = false;//from w w w .j av a2s . co m externalIdIdx = eII; } else { additionalColumn = true; externalIdIdx = 0; } final JsonArray errors = new fr.wseduc.webutils.collections.JsonArray(); String filter = ""; if ("Student".equals(profile)) { filter = "AND u.birthDate = {birthDate} "; } final String query = "MATCH (s:Structure {externalId : {id}})<-[:DEPENDS]-(:ProfileGroup)<-[:IN]-(u:User) " + "WHERE u.firstNameSearchField = {firstName} AND u.lastNameSearchField = {lastName} AND head(u.profiles) = {profile} " + filter + "RETURN DISTINCT u.externalId as externalId"; final List<String[]> lines = new ArrayList<>(); final TransactionHelper tx; try { tx = TransactionManager.getTransaction(); } catch (TransactionException e) { addError(errors, "transaction.error"); handler.handle(errors); return; } try { CSVReader csvReader = getCsvReader(path, charset); final int nbColumns = columns.size(); String[] values; int rowIdx = 0; while ((values = csvReader.readNext()) != null) { if (emptyLine(values)) { continue; } if (values.length > nbColumns) { values = Arrays.asList(values).subList(0, nbColumns).toArray(new String[nbColumns]); } else if (values.length < nbColumns) { values = Arrays.copyOf(values, nbColumns); } final List<String> line = new LinkedList<>(Arrays.asList(values)); if (additionalColumn) { line.add(0, ""); } lines.add(line.toArray(new String[line.size()])); if (rowIdx == 0) { if (additionalColumn) { lines.get(0)[externalIdIdx] = "externalId"; } rowIdx++; continue; } final JsonObject params = new JsonObject(); if (!additionalColumn && values[externalIdIdx] != null && !values[externalIdIdx].isEmpty()) { tx.add(NOP_QUERY, params.put("externalId", values[externalIdIdx])); } else { params.put("id", structureId).put("profile", profile); try { int i = 0; for (String c : columns) { // if (i >= values.length) break; switch (c) { case "lastName": params.put("lastName", sanitize(values[i])); break; case "firstName": params.put("firstName", sanitize(values[i])); break; case "birthDate": if ("Student".equals(profile)) { Matcher m; if (values[i] != null && (m = CsvFeeder.frenchDatePatter.matcher(values[i])).find()) { params.put("birthDate", m.group(3) + "-" + m.group(2) + "-" + m.group(1)); } else { params.put("birthDate", values[i]); } } break; } i++; } } catch (Exception e) { errors.add(new JsonObject().put("key", "parse.line.error").put("params", new fr.wseduc.webutils.collections.JsonArray().add(Integer.toString(rowIdx)))); } tx.add(query, params); } rowIdx++; } } catch (Exception e) { addError(errors, "error.read.file", path); handler.handle(errors); } 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() + 1 == lines.size()) { for (int i = 0; i < results.size(); i++) { JsonArray line = results.getJsonArray(i); if (line.size() == 1) { // Si 0 ou plusieurs utilisateurs, on laisse la ligne d'origine String eId = line.getJsonObject(0).getString("externalId", ""); lines.get(i + 1)[externalIdIdx] = eId; } } vertx.fileSystem().deleteBlocking(path); try { CSVWriter writer = getCsvWriter(path, charset); writer.writeAll(lines); writer.close(); } catch (IOException e) { log.error("Error writing file.", e); addError(errors, "error.write.file", path); } if ("Relative".equals(profile) && columns.contains("childLastName") && !columns.contains("childExternalId")) { if (additionalColumn) { columns.add(0, "externalId"); } findChildExternalIds(structureId, path, charset, columns, errors, handler); } else { handler.handle(errors); } } else { addError(errors, "error.find.ids"); handler.handle(errors); } } }); }
From source file:org.entcore.feeder.csv.MappingFinder.java
License:Open Source License
private void findChildExternalIds(final String structureId, final String path, final String charset, final List<String> columns, final JsonArray errors, final Handler<JsonArray> handler) { final List<String[]> lines = new ArrayList<>(); final JsonArray childLastNameIndex = new fr.wseduc.webutils.collections.JsonArray(); final JsonArray childUsernameIndex = new fr.wseduc.webutils.collections.JsonArray(); int idx = 0;//from w w w. j av a2s .c o m for (String c : columns) { if ("childLastName".equals(c)) { childLastNameIndex.add(idx); } else if ("childUsername".equals(c)) { childUsernameIndex.add(idx); } idx++; } if (childLastNameIndex.size() == 0) { addError(errors, "missing.childLastName"); handler.handle(errors); return; } else if (childUsernameIndex.size() != 0 && childLastNameIndex.size() != childUsernameIndex.size()) { addError(errors, "mismatch.childLastName.childUsername"); handler.handle(errors); return; } final int maxNbChild = childLastNameIndex.size(); final int appendIdx; if (childUsernameIndex.size() > 0) { appendIdx = childLastNameIndex.getInteger(0) > childUsernameIndex.getInteger(0) ? childUsernameIndex.getInteger(0) : childLastNameIndex.getInteger(0); } else { appendIdx = childLastNameIndex.getInteger(0); } final String query = "MATCH (s:Structure {externalId : {id}})<-[:DEPENDS]-(:ProfileGroup)<-[:IN]-(u:User) " + "WHERE u.firstNameSearchField = {firstName} AND u.lastNameSearchField = {lastName} AND head(u.profiles) = 'Student' " + "RETURN DISTINCT u.externalId as externalId, {rowIdx} as line, {itemIdx} as item "; final TransactionHelper tx; try { tx = TransactionManager.getTransaction(); } catch (TransactionException e) { addError(errors, "transaction.error"); handler.handle(errors); return; } try { CSVReader csvReader = getCsvReader(path, charset); String[] values; int rowIdx = 0; while ((values = csvReader.readNext()) != null) { if (emptyLine(values)) { continue; } final List<String> line = new LinkedList<>(Arrays.asList(values)); for (int i = 0; i < maxNbChild; i++) { if (rowIdx == 0) { line.add(appendIdx, "childExternalId"); } else { line.add(appendIdx, ""); } } lines.add(line.toArray(new String[line.size()])); if (rowIdx == 0) { rowIdx++; continue; } final JsonArray firstNames = new fr.wseduc.webutils.collections.JsonArray(); final JsonArray lastNames = new fr.wseduc.webutils.collections.JsonArray(); try { int i = 0; for (String c : columns) { if (i >= values.length) break; switch (c) { case "childLastName": lastNames.add(sanitize(values[i])); break; case "childFirstName": firstNames.add(sanitize(values[i])); break; } i++; } } catch (Exception e) { errors.add(new JsonObject().put("key", "parse.line.error").put("params", new fr.wseduc.webutils.collections.JsonArray().add(Integer.toString(rowIdx)))); } final int fns = firstNames.size(); if (fns != lastNames.size()) { errors.add(new JsonObject().put("key", "child.lastName.firstName.mismatch").put("params", new fr.wseduc.webutils.collections.JsonArray().add(Integer.toString(rowIdx)))); } else if (fns > 0) { // if (fns > maxNbChild) { // maxNbChild = fns; // } for (int i = 0; i < fns; i++) { JsonObject params = new JsonObject().put("id", structureId) .put("firstName", firstNames.getString(i)).put("lastName", lastNames.getString(i)) .put("rowIdx", rowIdx).put("itemIdx", i); tx.add(query, params); } } rowIdx++; } } catch (Exception e) { addError(errors, "error.read.file", path); handler.handle(errors); } 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) { for (int i = 0; i < results.size(); i++) { JsonArray item = results.getJsonArray(i); if (item.size() == 1) { // Si 0 ou plusieurs utilisateurs, on laisse la ligne d'origine String eId = item.getJsonObject(0).getString("externalId", ""); int lineIdx = item.getJsonObject(0).getInteger("line", -1); int itemIdx = item.getJsonObject(0).getInteger("item", -1); if (lineIdx > 0 && itemIdx >= 0) { String[] line = lines.get(lineIdx); line[itemIdx + appendIdx] = eId; line[childLastNameIndex.getInteger(itemIdx) + maxNbChild] = ""; if (childUsernameIndex.size() > 0) { line[childUsernameIndex.getInteger(itemIdx) + maxNbChild] = ""; } } } } vertx.fileSystem().deleteBlocking(path); try { CSVWriter writer = getCsvWriter(path, charset); writer.writeAll(lines); writer.close(); } catch (IOException e) { log.error("Error writing file.", e); addError(errors, "error.write.file", path); } handler.handle(errors); } else { addError(errors, "error.find.ids"); handler.handle(errors); } } }); }
From source file:org.entcore.feeder.dictionary.structures.DuplicateUsers.java
License:Open Source License
public void markDuplicates(final Message<JsonObject> message, final Handler<JsonObject> handler) { final String now = DateTime.now().toString(); final String query = "MATCH (s:System {name : 'Starter'}) return s.lastSearchDuplicates as lastSearchDuplicates "; TransactionManager.getNeo4jHelper().execute(query, new JsonObject(), new Handler<Message<JsonObject>>() { @Override/* ww w . j a v a 2 s . c o m*/ public void handle(Message<JsonObject> event) { JsonArray res = event.body().getJsonArray("result"); if ("ok".equals(event.body().getString("status")) && res != null && res.size() == 1 && res.getJsonObject(0).getString("lastSearchDuplicates") != null) { final String last = res.getJsonObject(0).getString("lastSearchDuplicates"); final String[] profiles = ManualFeeder.profiles.keySet() .toArray(new String[ManualFeeder.profiles.keySet().size()]); final Handler[] handlers = new Handler[profiles.length + 1]; final long start = System.currentTimeMillis(); handlers[handlers.length - 1] = new Handler<Void>() { @Override public void handle(Void v) { final String updateDate = "MATCH (s:System {name : 'Starter'}) set s.lastSearchDuplicates = {now} "; TransactionManager.getNeo4jHelper().execute(updateDate, new JsonObject().put("now", now), new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> event) { if (!"ok".equals(event.body().getString("status"))) { log.error("Error updating last search duplicate date : " + event.body().getString("message")); } } }); log.info("Mark duplicates users finished - elapsed time " + (System.currentTimeMillis() - start) + " ms."); if (message != null) { message.reply(new JsonObject().put("status", "ok")); } if (handler != null) { handler.handle(new JsonObject().put("status", "ok")); } } }; for (int i = profiles.length - 1; i >= 0; i--) { final int j = i; handlers[i] = new Handler<Void>() { @Override public void handle(Void v) { searchDuplicatesByProfile(last, profiles[j], handlers[j + 1]); } }; } handlers[0].handle(null); } else { log.warn("lastSearchDuplicates not found."); message.reply(new JsonObject().put("status", "ok")); } } }); }
From source file:org.entcore.feeder.dictionary.structures.DuplicateUsers.java
License:Open Source License
public void ignoreDuplicate(final Message<JsonObject> message) { String userId1 = message.body().getString("userId1"); String userId2 = message.body().getString("userId2"); if (userId1 == null || userId2 == null || userId1.trim().isEmpty() || userId2.trim().isEmpty()) { message.reply(new JsonObject().put("status", "error").put("message", "invalid.id")); return;/* www . j av a2 s. co m*/ } String query = "MATCH (u1:User {id: {userId1}})-[r:DUPLICATE]-(u2:User {id: {userId2}}) " + "SET u1.ignoreDuplicates = coalesce(u1.ignoreDuplicates, []) + u2.id, " + "u2.ignoreDuplicates = coalesce(u2.ignoreDuplicates, []) + u1.id " + "DELETE r"; JsonObject params = new JsonObject().put("userId1", userId1).put("userId2", userId2); TransactionManager.getNeo4jHelper().execute(query, params, new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> event) { message.reply(event.body()); } }); }
From source file:org.entcore.feeder.dictionary.structures.DuplicateUsers.java
License:Open Source License
public void listDuplicates(final Message<JsonObject> message) { JsonArray structures = message.body().getJsonArray("structures"); boolean inherit = message.body().getBoolean("inherit"); final Integer minScore = message.body().getInteger("minScore"); final boolean inSameStructure = message.body().getBoolean("inSameStructure", false); final String filter = (minScore != null) ? ((inSameStructure) ? "AND" : "WHERE") + " r.score >= {minScore} " : ""; String query;/* w w w .j a v a 2s .co m*/ if (structures != null && structures.size() > 0) { if (inherit) { query = "MATCH (s:Structure)<-[:HAS_ATTACHMENT*0..]-(so:Structure)<-[:DEPENDS]-(pg:ProfileGroup) "; } else { query = "MATCH (s:Structure)<-[:DEPENDS]-(pg:ProfileGroup) "; } query += "WHERE s.id IN {structures} " + "WITH COLLECT(pg.id) as groupIds " + "MATCH (g1:ProfileGroup)<-[:IN]-(u1:User)-[r:DUPLICATE]->(u2:User)-[:IN]->(g2:ProfileGroup) " + "WHERE g1.id IN groupIds AND g2.id IN groupIds " + "MATCH (s1:Structure)<-[:DEPENDS]-(g1) " + filter + "OPTIONAL MATCH (s2:Structure)<-[:DEPENDS]-(g2) "; query += "RETURN r.score as score, " + "{id: u1.id, firstName: u1.firstName, lastName: u1.lastName, birthDate: u1.birthDate, email: u1.email, profiles: u1.profiles, structures: collect(distinct s1.id)} as user1, " + "{id: u2.id, firstName: u2.firstName, lastName: u2.lastName, birthDate: u2.birthDate, email: u2.email, profiles: u2.profiles, structures: collect(distinct s2.id)} as user2 " + "ORDER BY score DESC"; } else { if (inSameStructure) { query = "match (s:Structure)<-[:DEPENDS]-(:ProfileGroup)<-[:IN]-(u1:User)-[r:DUPLICATE]-(u2:User) WHERE u2-[:IN]->(:ProfileGroup)-[:DEPENDS]->(s) "; } else { query = "MATCH (u1:User)-[r:DUPLICATE]->(u2:User) "; } query += filter + "RETURN r.score as score, " + "{id: u1.id, firstName: u1.firstName, lastName: u1.lastName, birthDate: u1.birthDate, email: u1.email, profiles: u1.profiles} as user1, " + "{id: u2.id, firstName: u2.firstName, lastName: u2.lastName, birthDate: u2.birthDate, email: u2.email, profiles: u2.profiles} as user2 " + "ORDER BY score DESC"; } JsonObject params = new JsonObject().put("structures", structures).put("minScore", minScore); TransactionManager.getNeo4jHelper().execute(query, params, new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> event) { message.reply(event.body()); } }); }
From source file:org.entcore.feeder.dictionary.structures.DuplicateUsers.java
License:Open Source License
public void mergeDuplicate(final Message<JsonObject> message, final TransactionHelper tx) { String userId1 = message.body().getString("userId1"); String userId2 = message.body().getString("userId2"); if (userId1 == null || userId2 == null || userId1.trim().isEmpty() || userId2.trim().isEmpty()) { message.reply(new JsonObject().put("status", "error").put("message", "invalid.id")); return;/*from w ww . jav a 2 s .c om*/ } String query = "MATCH (u1:User {id: {userId1}})-[r:DUPLICATE]-(u2:User {id: {userId2}}) " + "RETURN DISTINCT u1.id as userId1, u1.source as source1, NOT(HAS(u1.activationCode)) as activatedU1, " + "u1.disappearanceDate as disappearanceDate1, u1.deleteDate as deleteDate1, " + "u2.id as userId2, u2.source as source2, NOT(HAS(u2.activationCode)) as activatedU2, " + "u2.disappearanceDate as disappearanceDate2, u2.deleteDate as deleteDate2"; JsonObject params = new JsonObject().put("userId1", userId1).put("userId2", userId2); TransactionManager.getNeo4jHelper().execute(query, params, new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> event) { JsonArray res = event.body().getJsonArray("result"); JsonObject error = new JsonObject().put("status", "error"); if ("ok".equals(event.body().getString("status")) && res != null && res.size() == 1) { JsonObject r = res.getJsonObject(0); if (r.getBoolean("activatedU1", true) && r.getBoolean("activatedU2", true)) { message.reply(error.put("message", "two.users.activated")); } else { mergeDuplicate(r, message, tx); } } else if ("ok".equals(event.body().getString("status"))) { message.reply(error.put("message", "not.found.duplicate")); } else { message.reply(event.body()); } } }); }
From source file:org.entcore.feeder.dictionary.structures.DuplicateUsers.java
License:Open Source License
private void mergeDuplicate(final JsonObject r, final Message<JsonObject> message, final TransactionHelper tx) { final String source1 = r.getString("source1"); final String source2 = r.getString("source2"); final boolean activatedU1 = r.getBoolean("activatedU1", false); final boolean activatedU2 = r.getBoolean("activatedU2", false); final String userId1 = r.getString("userId1"); final String userId2 = r.getString("userId2"); final boolean missing1 = r.getLong("disappearanceDate1") != null || r.getLong("deleteDate1") != null; final boolean missing2 = r.getLong("disappearanceDate2") != null || r.getLong("deleteDate2") != null; final JsonObject error = new JsonObject().put("status", "error"); if (source1 != null && source1.equals(source2) && notDeduplicateSource.contains(source1) && !missing1 && !missing2) {/*from w w w .j a v a 2 s . co m*/ message.reply(error.put("message", "two.users.in.same.source")); return; } String query; JsonObject params = new JsonObject(); if ((activatedU1 && prioritySource(source1) >= prioritySource(source2)) || (activatedU2 && prioritySource(source1) <= prioritySource(source2)) || (!activatedU1 && !activatedU2)) { query = SIMPLE_MERGE_QUERY; if (prioritySource(source1) == prioritySource(source2) && notDeduplicateSource.contains(source1)) { if (!missing1 && activatedU1) { params.put("userId1", userId1).put("userId2", userId2); } else if (!missing2 && activatedU2) { params.put("userId1", userId2).put("userId2", userId1); } else { query = SWITCH_MERGE_QUERY; if (activatedU1) { params.put("userId1", userId1).put("userId2", userId2); } else { params.put("userId1", userId2).put("userId2", userId1); } } } else { if (activatedU1) { params.put("userId1", userId1).put("userId2", userId2); } else if (activatedU2) { params.put("userId1", userId2).put("userId2", userId1); } else { if (prioritySource(source1) > prioritySource(source2)) { params.put("userId1", userId1).put("userId2", userId2); } else { params.put("userId1", userId2).put("userId2", userId1); } } } } else if ((activatedU1 && prioritySource(source1) < prioritySource(source2)) || (activatedU2 && prioritySource(source1) > prioritySource(source2))) { query = SWITCH_MERGE_QUERY; if (activatedU1) { params.put("userId1", userId1).put("userId2", userId2); } else { params.put("userId1", userId2).put("userId2", userId1); } } else { message.reply(error.put("message", "invalid.merge.case")); return; } if (tx != null) { tx.add(INCREMENT_RELATIVE_SCORE, params); tx.add(query, params); sendMergedEvent(params.getString("userId1"), params.getString("userId2")); message.reply(new JsonObject().put("status", "ok")); } else { try { TransactionHelper txl = TransactionManager.getTransaction(); txl.add(INCREMENT_RELATIVE_SCORE, params); txl.add(query, params); txl.commit(new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> event) { if ("ok".equals(event.body().getString("status"))) { log.info("Merge duplicates : " + r.encode()); if (updateCourses) { AbstractTimetableImporter.updateMergedUsers(event.body().getJsonArray("results")); } sendMergedEvent(params.getString("userId1"), params.getString("userId2")); } message.reply(event.body()); } }); } catch (TransactionException e) { message.reply(error.put("message", "invalid.transaction")); } } }
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 . jav a 2 s . c o 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/* w w w . j av a 2 s . c o m*/ 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;/*from w w w . 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); } } }); }