diff --git a/ontology-engine/graph-engine_2.11/src/main/scala/org/sunbird/graph/utils/NodeUtil.scala b/ontology-engine/graph-engine_2.11/src/main/scala/org/sunbird/graph/utils/NodeUtil.scala index adc726827312f42ed74126423bab1115f7a1b5ad..7791890f5cc67a49b394e0733abbb4fd5ccf4dfa 100644 --- a/ontology-engine/graph-engine_2.11/src/main/scala/org/sunbird/graph/utils/NodeUtil.scala +++ b/ontology-engine/graph-engine_2.11/src/main/scala/org/sunbird/graph/utils/NodeUtil.scala @@ -20,15 +20,17 @@ object NodeUtil { def serialize(node: Node, fields: util.List[String], schemaName: String): util.Map[String, AnyRef] = { val metadataMap = node.getMetadata metadataMap.put("identifier", node.getIdentifier) - if (CollectionUtils.isNotEmpty(fields)) - metadataMap.keySet.retainAll(fields) val jsonProps = DefinitionNode.fetchJsonProps(node.getGraphId, "1.0", schemaName) val updatedMetadataMap:util.Map[String, AnyRef] = metadataMap.entrySet().asScala.filter(entry => null != entry.getValue).map((entry: util.Map.Entry[String, AnyRef]) => handleKeyNames(entry, fields) -> convertJsonProperties(entry, jsonProps)).toMap.asJava val definitionMap = DefinitionNode.getRelationDefinitionMap(node.getGraphId, "1.0", schemaName).asJava val relMap:util.Map[String, util.List[util.Map[String, AnyRef]]] = getRelationMap(node, updatedMetadataMap, definitionMap) var finalMetadata = new util.HashMap[String, AnyRef]() + finalMetadata.put("objectType",node.getObjectType) finalMetadata.putAll(updatedMetadataMap) finalMetadata.putAll(relMap) + if (CollectionUtils.isNotEmpty(fields)) + finalMetadata.keySet.retainAll(fields) + finalMetadata.put("identifier", node.getIdentifier) finalMetadata.put("languageCode", getLanguageCodes(node)) finalMetadata } @@ -42,6 +44,13 @@ object NodeUtil { nodeMap.get(entry._1).asInstanceOf[util.List[util.Map[String, AnyRef]]].asScala.map(relMap => { if("in".equalsIgnoreCase(entry._2.asInstanceOf[util.Map[String, AnyRef]].get("direction").asInstanceOf[String])) { val rel:Relation = new Relation(relMap.get("identifier").asInstanceOf[String], entry._2.asInstanceOf[util.Map[String, AnyRef]].get("type").asInstanceOf[String], node.getIdentifier) + rel.setStartNodeObjectType(relMap.get("objectType").asInstanceOf[String]) + rel.setEndNodeObjectType(node.getObjectType) + rel.setStartNodeName(relMap.get("name").asInstanceOf[String]) + rel.setStartNodeMetadata(new util.HashMap[String, AnyRef](){{ + put("description", relMap.get("description")) + put("status", relMap.get("status")) + }}) if(null != relMap.get("index") && 0 < relMap.get("index").asInstanceOf[Integer]){ rel.setMetadata(new util.HashMap[String, AnyRef](){{ put(SystemProperties.IL_SEQUENCE_INDEX.name(), relMap.get("index")) @@ -50,6 +59,13 @@ object NodeUtil { inRelations.add(rel) } else { val rel:Relation = new Relation(node.getIdentifier, entry._2.asInstanceOf[util.Map[String, AnyRef]].get("type").asInstanceOf[String], relMap.get("identifier").asInstanceOf[String]) + rel.setStartNodeObjectType(node.getObjectType) + rel.setEndNodeObjectType(relMap.get("objectType").asInstanceOf[String]) + rel.setEndNodeName(relMap.get("name").asInstanceOf[String]) + rel.setEndNodeMetadata(new util.HashMap[String, AnyRef]() {{ + put("description", relMap.get("description")) + put("status", relMap.get("status")) + }}) if(null != relMap.get("index") && 0 < relMap.get("index").asInstanceOf[Integer]){ rel.setMetadata(new util.HashMap[String, AnyRef](){{ put(SystemProperties.IL_SEQUENCE_INDEX.name(), relMap.get("index")) diff --git a/ontology-engine/graph-engine_2.11/src/test/scala/org/sunbird/graph/utils/NodeUtilTest.scala b/ontology-engine/graph-engine_2.11/src/test/scala/org/sunbird/graph/utils/NodeUtilTest.scala new file mode 100644 index 0000000000000000000000000000000000000000..2729fd9c8b9b6cc0d9eebffdf3cf3d626e518e9d --- /dev/null +++ b/ontology-engine/graph-engine_2.11/src/test/scala/org/sunbird/graph/utils/NodeUtilTest.scala @@ -0,0 +1,156 @@ +package org.sunbird.graph.utils + +import java.util +import org.scalatest.{FlatSpec, Matchers} +import org.sunbird.common.JsonUtils +import org.sunbird.graph.dac.model.Node + +class NodeUtilTest extends FlatSpec with Matchers { + + "serialize with fields" should "return only node property which are present in fields" in { + val node: Node = new Node("do_1234", "DATA_NODE", "Content"); + node.setMetadata(new util.HashMap[String, AnyRef]() {{ + put("language", new util.ArrayList[String]() {{ + add("English") + }}) + put("contentType", "Resource") + put("name", "Test Resource Content") + put("code", "test.res.1") + }}) + val fields: util.ArrayList[String] = new util.ArrayList[String]() {{ + add("contentType") + add("name") + }} + val result: util.Map[String, AnyRef] = NodeUtil.serialize(node, fields, "content") + result.isEmpty shouldBe false + result.size() shouldBe 4 + result.containsKey("identifier") shouldBe true + result.containsKey("contentType") shouldBe true + result.containsKey("name") shouldBe true + result.containsKey("languageCode") shouldBe true + } + + "deserialize with valid data" should "return a node with all data" in { + val nodeString :String = """{ + | "ownershipType": [ + | "createdBy" + | ], + | "code": "test.res.1", + | "channel": "test", + | "language": [ + | "English" + | ], + | "mimeType": "application/pdf", + | "idealScreenSize": "normal", + | "createdOn": "2020-01-17T16:17:39.931+0530", + | "objectType": "Content", + | "collections": [ + | { + | "identifier": "LP_FT-74320", + | "name": "LP_FT-74320", + | "description": "test desc", + | "objectType": "Content", + | "relation": "hasSequenceMember", + | "status": "Live" + | } + | ], + | "contentDisposition": "inline", + | "lastUpdatedOn": "2020-01-17T16:17:39.931+0530", + | "contentEncoding": "identity", + | "contentType": "Resource", + | "dialcodeRequired": "No", + | "identifier": "do_11293728197296947212", + | "lastStatusChangedOn": "2020-01-17T16:17:39.931+0530", + | "audience": [ + | "Learner" + | ], + | "os": [ + | "All" + | ], + | "visibility": "Default", + | "resources": [ + | "Speaker", + | "Touch" + | ], + | "mediaType": "content", + | "osId": "org.ekstep.quiz.app", + | "languageCode": [ + | "en" + | ], + | "version": 2, + | "versionKey": "1579258059931", + | "license": "CC BY 4.0", + | "idealScreenDensity": "hdpi", + | "framework": "NCF", + | "concepts": [ + | { + | "identifier": "LO1", + | "name": "Word Meaning", + | "description": "Understanding meaning of words", + | "objectType": "Concept", + | "relation": "associatedTo", + | "status": "Live" + | } + | ], + | "compatibilityLevel": 1, + | "name": "Resource Content 1", + | "status": "Live" + |}""".stripMargin + val nodeMap: util.Map[String, AnyRef] = JsonUtils.deserialize(nodeString.asInstanceOf[String], classOf[java.util.Map[String, AnyRef]]) + val relString = """{ + | "concepts": { + | "objects": [ + | "Concept" + | ], + | "type": "associatedTo", + | "direction": "out" + | }, + | "children": { + | "objects": [ + | "Content", + | "ContentImage" + | ], + | "type": "hasSequenceMember", + | "direction": "out" + | }, + | "collections": { + | "objects": [ + | "Content", + | "ContentImage" + | ], + | "type": "hasSequenceMember", + | "direction": "in" + | }, + | "usesContent": { + | "objects": [ + | "Content" + | ], + | "type": "associatedTo", + | "direction": "out" + | }, + | "questions": { + | "objects": [ + | "AssessmentItem" + | ], + | "type": "associatedTo", + | "direction": "out" + | }, + | "usedByContent": { + | "objects": [ + | "Content" + | ], + | "type": "associatedTo", + | "direction": "in" + | } + |}""".stripMargin + val relationMap: util.Map[String, AnyRef] = JsonUtils.deserialize(relString.asInstanceOf[String], classOf[java.util.Map[String, AnyRef]]) + val node = NodeUtil.deserialize(nodeMap, "content", relationMap) + node.getIdentifier shouldBe "do_11293728197296947212" + node.getOutRelations.size() shouldEqual 1 + node.getOutRelations().get(0).getRelationType shouldEqual "associatedTo" + node.getOutRelations.get(0).getEndNodeId shouldEqual "LO1" + node.getInRelations.size() shouldEqual 1 + node.getInRelations().get(0).getRelationType shouldEqual "hasSequenceMember" + node.getInRelations.get(0).getStartNodeId shouldEqual "LP_FT-74320" + } +}