Merge "fixed dsl builder to correctly add output"
diff --git a/common/src/main/java/org/onap/so/client/graphinventory/entities/DSLQueryBuilder.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/DSLQueryBuilder.java
index ffbb86f..ad3bb6c 100644
--- a/common/src/main/java/org/onap/so/client/graphinventory/entities/DSLQueryBuilder.java
+++ b/common/src/main/java/org/onap/so/client/graphinventory/entities/DSLQueryBuilder.java
@@ -20,6 +20,7 @@
 
 package org.onap.so.client.graphinventory.entities;
 
+import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -49,8 +50,24 @@
     }
 
     public DSLQueryBuilder<S, E> output() {
-        if (steps.get(steps.size() - 1) instanceof DSLNode) {
+        Object obj = steps.get(steps.size() - 1);
+        if (obj instanceof DSLNode) {
             ((DSLNode) steps.get(steps.size() - 1)).output();
+        } else if (obj.getClass().getName().contains("$$Lambda$")) {
+            // process lambda expressions
+            for (Field f : obj.getClass().getDeclaredFields()) {
+                f.setAccessible(true);
+                Object o;
+                try {
+                    o = f.get(obj);
+                    if (o instanceof DSLQueryBuilder && ((DSLQueryBuilder) o).steps.get(0) instanceof DSLNode) {
+                        ((DSLNode) ((DSLQueryBuilder) o).steps.get(0)).output();
+                    }
+                } catch (IllegalArgumentException | IllegalAccessException e) {
+                }
+                f.setAccessible(false);
+                break;
+            }
         }
         return this;
     }
diff --git a/common/src/test/java/org/onap/so/client/aai/DSLQueryBuilderTest.java b/common/src/test/java/org/onap/so/client/aai/DSLQueryBuilderTest.java
index 590e838..fb45652 100644
--- a/common/src/test/java/org/onap/so/client/aai/DSLQueryBuilderTest.java
+++ b/common/src/test/java/org/onap/so/client/aai/DSLQueryBuilderTest.java
@@ -24,6 +24,7 @@
 import static org.junit.Assert.assertTrue;
 import org.junit.Test;
 import org.onap.so.client.graphinventory.entities.DSLNode;
+import org.onap.so.client.graphinventory.entities.DSLNodeKey;
 import org.onap.so.client.graphinventory.entities.DSLQueryBuilder;
 import org.onap.so.client.graphinventory.entities.__;
 
@@ -118,4 +119,30 @@
         assertTrue(builder.equals(
                 "cloud-region('cloud-owner', 'owner')('cloud-region-id', 'id') > vlan-tag*('vlan-id-outer', 167)('my-boolean', true)"));
     }
+
+    @Test
+    public void outputOnNodeLambdasTest() {
+        DSLQueryBuilder<DSLNode, DSLNode> builder =
+                new DSLQueryBuilder<>(new DSLNode(AAIObjectType.L_INTERFACE, new DSLNodeKey("interface-id", "myId")));
+
+        builder.to(AAIObjectType.VSERVER, __.key("vserver-name", "myName")).output().to(AAIObjectType.P_INTERFACE)
+                .output();
+        assertEquals("l-interface('interface-id', 'myId') > vserver*('vserver-name', 'myName') > p-interface*",
+                builder.build());
+    }
+
+    @Test
+    public void skipOutputOnUnionTest() {
+        DSLQueryBuilder<DSLNode, DSLNode> builder =
+                new DSLQueryBuilder<>(new DSLNode(AAIObjectType.GENERIC_VNF, __.key("vnf-id", "vnfId")).output());
+
+        builder.union(__.node(AAIObjectType.PSERVER).output().to(__.node(AAIObjectType.COMPLEX).output()),
+                __.node(AAIObjectType.VSERVER)
+                        .to(__.node(AAIObjectType.PSERVER).output().to(__.node(AAIObjectType.COMPLEX).output())))
+                .output();
+
+        assertEquals(
+                "generic-vnf*('vnf-id', 'vnfId') > " + "[ pserver* > complex*, " + "vserver > pserver* > complex* ]",
+                builder.build());
+    }
 }