diff --git a/src/main/java/org/gcube/informationsystem/resourceregistry/queries/json/JsonQuery.java b/src/main/java/org/gcube/informationsystem/resourceregistry/queries/json/JsonQuery.java index 3f7bee7..dacdb3a 100644 --- a/src/main/java/org/gcube/informationsystem/resourceregistry/queries/json/JsonQuery.java +++ b/src/main/java/org/gcube/informationsystem/resourceregistry/queries/json/JsonQuery.java @@ -2,11 +2,14 @@ package org.gcube.informationsystem.resourceregistry.queries.json; import java.io.IOException; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import org.gcube.com.fasterxml.jackson.databind.JsonNode; import org.gcube.com.fasterxml.jackson.databind.ObjectMapper; import org.gcube.com.fasterxml.jackson.databind.node.ArrayNode; +import org.gcube.com.fasterxml.jackson.databind.node.ObjectNode; import org.gcube.informationsystem.base.reference.AccessType; import org.gcube.informationsystem.base.reference.Direction; import org.gcube.informationsystem.resourceregistry.api.exceptions.ResourceRegistryException; @@ -145,22 +148,52 @@ public class JsonQuery { ArrayNode arrayNode = objectMapper.createArrayNode(); + boolean projection = entryPoint.isProjection(); + boolean first = true; + + Set keys = new HashSet<>(); + while(resultSet.hasNext()) { OResult oResult = resultSet.next(); - - OElement element = ElementManagementUtility.getElementFromOptional(oResult.getElement()); + if(projection) { + if(first) { + keys = oResult.getPropertyNames(); + first = false; + } + ObjectNode objectNode = objectMapper.createObjectNode(); + + for(String key : keys) { + Object value = oResult.getProperty(key); + + if(value == null) { + objectNode.put(key, ""); + }else if(value instanceof String) { + objectNode.put(key, (String) value); + }else if(value instanceof Integer) { + objectNode.put(key, (Integer) value); + }else if(value instanceof Long) { + objectNode.put(key, (Long) value); + }else { + objectNode.put(key, value.toString()); + } + + } + arrayNode.add(objectNode); + }else { + OElement element = ElementManagementUtility.getElementFromOptional(oResult.getElement()); - try { - JsonNode jsonNodeResult = null; - ElementManagement erManagement = ElementManagementUtility.getERManagement(securityContext, oDatabaseDocument, - element); - erManagement.setAsEntryPoint(); - jsonNodeResult = erManagement.serializeAsJsonNode(); - arrayNode.add(jsonNodeResult); - } catch(ResourceRegistryException e) { - logger.error("Unable to correctly serialize {}. It will be excluded from results. {}", - element.toString(), OrientDBUtility.SHOULD_NOT_OCCUR_ERROR_MESSAGE); + try { + JsonNode jsonNodeResult = null; + ElementManagement erManagement = ElementManagementUtility.getERManagement(securityContext, oDatabaseDocument, + element); + erManagement.setAsEntryPoint(); + jsonNodeResult = erManagement.serializeAsJsonNode(); + arrayNode.add(jsonNodeResult); + } catch(ResourceRegistryException e) { + logger.error("Unable to correctly serialize {}. It will be excluded from results. {}", + element.toString(), OrientDBUtility.SHOULD_NOT_OCCUR_ERROR_MESSAGE); + } } } diff --git a/src/main/java/org/gcube/informationsystem/resourceregistry/queries/json/base/JsonQueryERElement.java b/src/main/java/org/gcube/informationsystem/resourceregistry/queries/json/base/JsonQueryERElement.java index 53c8afa..cf577d9 100644 --- a/src/main/java/org/gcube/informationsystem/resourceregistry/queries/json/base/JsonQueryERElement.java +++ b/src/main/java/org/gcube/informationsystem/resourceregistry/queries/json/base/JsonQueryERElement.java @@ -291,6 +291,10 @@ public abstract class JsonQueryERElement { StringBuffer b = new StringBuffer(); b.append(getAlias(true)); b.append("."); + if(fieldNamePrefix !=null) { + b.append(fieldNamePrefix); + b.append("."); + } b.append(fieldNameToEmit); b.append(" AS `"); b.append(nameOfFieldToEmit); diff --git a/src/test/java/org/gcube/informationsystem/resourceregistry/queries/JsonQueryTest.java b/src/test/java/org/gcube/informationsystem/resourceregistry/queries/JsonQueryTest.java index 6dc833b..6b4a9a2 100644 --- a/src/test/java/org/gcube/informationsystem/resourceregistry/queries/JsonQueryTest.java +++ b/src/test/java/org/gcube/informationsystem/resourceregistry/queries/JsonQueryTest.java @@ -250,8 +250,8 @@ public class JsonQueryTest extends ContextTest { Assert.assertTrue(compareQueries(createdStringBuffer, expectedStringBuffer)); -// String result = jsonQuery.query(); -// logger.info("Result : {}", result); + String result = jsonQuery.query(); + logger.info("Result : {}", result); } @Test @@ -287,8 +287,8 @@ public class JsonQueryTest extends ContextTest { logger.info("Expected Query from JSON: {}", expectedStringBuffer.toString()); Assert.assertTrue(compareQueries(createdStringBuffer, expectedStringBuffer)); - //String result = jsonQuery.query(); - //logger.info("Result : {}", result); + String result = jsonQuery.query(); + logger.info("Result : {}", result); } } } diff --git a/src/test/resources/projection-queries/HostingNode.match.oquery b/src/test/resources/projection-queries/HostingNode.match.oquery index eaa9d36..5ee6f75 100644 --- a/src/test/resources/projection-queries/HostingNode.match.oquery +++ b/src/test/resources/projection-queries/HostingNode.match.oquery @@ -27,4 +27,4 @@ RETURN ((memoryfacet020.size - memoryfacet020.used) + ' ' + memoryfacet020.unit) AS `HD Space Left`, (memoryfacet030.size + ' ' + memoryfacet030.unit) AS `Mem. Available.`, hostingnode0.id AS `ID`, - hostingnode0.lastUpdateTime AS `Last Update Time` \ No newline at end of file + hostingnode0.metadata.lastUpdateTime AS `Last Update Time` \ No newline at end of file