List of usage examples for io.vertx.core.json JsonArray add
public JsonArray add(Object value)
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;/* w w w .j a v a2s. c om*/ 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.csv.MappingFinder.java
License:Open Source License
private void addError(JsonArray errors, String s, String... params) { JsonObject o = new JsonObject().put("key", s); errors.add(o); if (params.length > 0) { o.put("params", new fr.wseduc.webutils.collections.JsonArray(Arrays.asList(params))); }//w ww .j av a 2 s. c o m }
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;/* w ww . j a va 2 s . com*/ } 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 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 a v a2 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.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);// w ww. j ava 2 s. co m } 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 w w .j av a 2 s.c om*/ } 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.Structure.java
License:Open Source License
public synchronized Object[] addJointure(String externalId) { if (struct != null) { JsonArray joinKey = struct.getJsonArray("joinKey"); if (joinKey == null) { joinKey = new fr.wseduc.webutils.collections.JsonArray(); struct.put("joinKey", joinKey); }//from w w w.ja v a2 s . co m joinKey.add(externalId); String query = "MATCH (s:Structure {externalId: {externalId}}) " + "SET s.joinKey = {joinKey} "; JsonObject params = new JsonObject().put("joinKey", joinKey).put("externalId", getExternalId()); getTransaction().add(query, params); return joinKey.getList().toArray(); } return null; }
From source file:org.entcore.feeder.dictionary.users.AbstractUser.java
License:Open Source License
public static JsonArray getUserMappingStructures(JsonArray structures, Map<String, String> externalIdMapping) { if (structures != null) { JsonArray ms = new fr.wseduc.webutils.collections.JsonArray(); for (Object s : structures) { String externalId = externalIdMapping.get(s.toString()); ms.add(((externalId != null && !externalId.trim().isEmpty()) ? externalId : s)); }// www. j a v a 2s .c om return ms; } return null; }
From source file:org.entcore.feeder.dictionary.users.PersEducNat.java
License:Open Source License
public void createOrUpdatePersonnel(JsonObject object, String profileExternalId, JsonArray structuresByFunctions, String[][] linkClasses, String[][] linkGroups, boolean nodeQueries, boolean relationshipQueries) { final String error = personnelValidator.validate(object); if (error != null) { if (object.getJsonArray("profiles") != null && object.getJsonArray("profiles").size() == 1) { report.addIgnored(object.getJsonArray("profiles").getString(0), error, object); } else {// ww w.ja v a 2 s .co m report.addIgnored("Personnel", error, object); } log.warn(error); } else { if (nodeQueries) { object.put("source", currentSource); if (userImportedExternalId != null) { userImportedExternalId.add(object.getString("externalId")); } StringBuilder sb = new StringBuilder(); JsonObject params; sb.append("MERGE (u:`User` { externalId : {externalId}}) "); sb.append("ON CREATE SET u.id = {id}, u.login = {login}, u.activationCode = {activationCode}, "); sb.append("u.displayName = {displayName}, u.created = {created} "); sb.append("WITH u "); if (!EDTImporter.EDT.equals(currentSource)) { sb.append("WHERE u.checksum IS NULL OR u.checksum <> {checksum} "); } sb.append("SET ").append(Neo4jUtils.nodeSetPropertiesFromJson("u", object, "id", "externalId", "login", "activationCode", "displayName", "email", "created")); if (EDTImporter.EDT.equals(currentSource)) { sb.append("RETURN u.id as id, u.IDPN as IDPN, head(u.profiles) as profile"); } params = object; transactionHelper.add(sb.toString(), params); 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}}), (u:User {externalId : {userExternalId}}) " + "MERGE u-[:ADMINISTRATIVE_ATTACHMENT]->s "; p.put("structureAdmin", structures.getString(0)); } else { query = "MATCH (s:Structure), (u:User {externalId : {userExternalId}}) " + "WHERE s.externalId IN {structuresAdmin} " + "MERGE u-[:ADMINISTRATIVE_ATTACHMENT]->s "; p.put("structuresAdmin", structures); } transactionHelper.add(query, p); } if (externalId != null && structuresByFunctions != null && structuresByFunctions.size() > 0) { String query; structuresByFunctions = getMappingStructures(structuresByFunctions); JsonObject p = new JsonObject().put("userExternalId", externalId); if (structuresByFunctions.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-[:IN]->g"; p.put("structureAdmin", structuresByFunctions.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-[:IN]->g "; p.put("structuresAdmin", structuresByFunctions).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", structuresByFunctions); 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.copy().put("structures", getOrElse(structures, new JsonArray()))); } final JsonObject fosm = new JsonObject(); final JsonArray classes = new fr.wseduc.webutils.collections.JsonArray(); if (externalId != null && linkClasses != null) { final JsonObject fcm = new JsonObject(); for (String[] structClass : linkClasses) { if (structClass != null && structClass[0] != null && structClass[1] != null) { classes.add(structClass[1]); if (structClass.length > 2 && isNotEmpty(structClass[2])) { JsonArray fClasses = fcm.getJsonArray(structClass[2]); if (fClasses == null) { fClasses = new fr.wseduc.webutils.collections.JsonArray(); fcm.put(structClass[2], fClasses); } fClasses.add(structClass[1]); } } } String query = "MATCH (c:Class)<-[:DEPENDS]-(g:ProfileGroup)" + "-[:DEPENDS]->(pg:ProfileGroup)-[:HAS_PROFILE]->(p: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); JsonObject p = new JsonObject().put("userExternalId", externalId).put("source", currentSource) .put("classes", classes); fosm.mergeIn(fcm); for (String fos : fcm.fieldNames()) { String q2 = "MATCH (u:User {externalId : {userExternalId}}), (f:FieldOfStudy {externalId:{feId}}) " + "MERGE u-[r:TEACHES_FOS]->f " + "SET r.classes = {classes} "; transactionHelper.add(q2, p.copy().put("classes", fcm.getJsonArray(fos)).put("feId", fos)); } } 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(); final JsonObject fgm = new JsonObject(); if (externalId != null && linkGroups != null) { for (String[] structGroup : linkGroups) { if (structGroup != null && structGroup[0] != null && structGroup[1] != null) { groups.add(structGroup[1]); if (structGroup.length > 2 && isNotEmpty(structGroup[2])) { JsonArray fGroups = fgm.getJsonArray(structGroup[2]); if (fGroups == null) { fGroups = new fr.wseduc.webutils.collections.JsonArray(); fgm.put(structGroup[2], fGroups); } fGroups.add(structGroup[1]); } } } String query = "MATCH (g:Group), (u:User {externalId : {userExternalId}}) " + "WHERE (g:FunctionalGroup OR g:FunctionGroup OR g:HTGroup) AND g.externalId IN {groups} " + "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:Group) " + "WHERE (g:FunctionalGroup OR g:FunctionGroup OR g:HTGroup) AND " + "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); fosm.mergeIn(fgm); final String deleteOldFoslg = "MATCH (u:User {externalId : {userExternalId}})-[r:TEACHES_FOS]->(f:FieldOfStudy) " + "WHERE NOT(f.externalId IN {fos}) AND (NOT(HAS(r.source)) OR r.source = {source}) " + "DELETE r"; transactionHelper.add(deleteOldFoslg, pdfg.copy().put("fos", new fr.wseduc.webutils.collections.JsonArray(new ArrayList<>(fosm.fieldNames())))); for (String fos : fgm.fieldNames()) { String q2 = "MATCH (u:User {externalId : {userExternalId}}), (f:FieldOfStudy {externalId:{feId}}) " + "MERGE u-[r:TEACHES_FOS]->f " + "SET r.groups = {groups} "; transactionHelper.add(q2, pdfg.copy().put("groups", fgm.getJsonArray(fos)).put("feId", fos)); } } } } }
From source file:org.entcore.feeder.timetable.AbstractTimetableImporter.java
License:Open Source License
private void persEducNatToGroups(JsonObject object) { final JsonArray groups = object.getJsonArray("groups"); if (groups != null) { final JsonArray teacherIds = object.getJsonArray("teacherIds"); final List<String> ids = new ArrayList<>(); if (teacherIds != null) { ids.addAll(teacherIds.getList()); }/*from ww w. j a v a 2 s . co m*/ final JsonArray personnelIds = object.getJsonArray("personnelIds"); if (personnelIds != null) { ids.addAll(personnelIds.getList()); } if (!ids.isEmpty()) { final JsonArray g = new fr.wseduc.webutils.collections.JsonArray(); for (Object o : groups) { g.add(structureExternalId + "$" + o.toString()); } for (String id : ids) { txXDT.add(PERSEDUCNAT_TO_GROUPS, new JsonObject().put("groups", g).put("id", id).put("source", getSource()) .put("outDate", DateTime.now().plusDays(1).getMillis()) .put("now", importTimestamp)); } } } }