Redundant info in result json while query all data from a tree table

Hi,
I am using cuba6.10.10, I have a tree table with below definition:

@NamePattern("%s|nodeName")
@Table(name = "CC_MY_TREE")
@Entity(name = "cc$MyTree")
public class MyTree extends StandardEntity {
    private static final long serialVersionUID = 6328508026459543939L;

    @NotNull
    @Column(name = "NODE_NAME", nullable = false)
    protected String nodeName;

    @Lookup(type = LookupType.DROPDOWN, actions = {"lookup", "open", "clear"})
    @OnDeleteInverse(DeletePolicy.DENY)
    @OnDelete(DeletePolicy.UNLINK)
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "PARENT_ID")
    protected MyTree parent;

    @OnDeleteInverse(DeletePolicy.CASCADE)
    @OnDelete(DeletePolicy.DENY)
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "NODE_REF_ID")
    protected Node nodeRef;

And I have below view defined for it:

    <view entity="cc$MyTree" name="myTree-view" overwrite="true" extends="_minimal">
        <property name="parent" view="_minimal"/>
        <property name="nodeRef" view="_local"/>
    </view>

I wrote a service to fetch all data of the table MyTree:

    public List<MyTree> findAllNode(){

        return dataManager.load(MyTree.class)
                .query("select f from cc$MyTree f ")
                .view("myTree-view")
                .list();

    }

I have below data in my DB:

image

I expect below output of my service:

[
    {
        "_entityName": "cc$MyTree",
        "_instanceName": "",
        "id": "3b6b5b4c-f4c7-869e-5061-8009fa5af293"
        "nodeName":"1",
    },
    {
        "_entityName": "cc$MyTree",
        "_instanceName": "",
        "id": "21e7c2fa-0653-999e-ef37-461b53b0e442",
        "nodeName":"2",
        "parent":{
            "id":"xxxxx"
             "nodeName":"1",
         }
    },
    {
        "_entityName": "cc$MyTree",
        "_instanceName": "",
        "id": "ba9e6d24-f3a9-3297-d253-e11b9df7a7c3"
        "nodeName":"3",
        "parent":{
            "id":"xxxxx"
             "nodeName":"2",
         }
    },
    {
        "_entityName": "cc$MyTree",
        "_instanceName": "",
        "id": "77c1dcca-b651-2ff0-97f6-8337a124aa03",
        "nodeName":"4",
        "parent":{
            "id":"xxxxx"
             "nodeName":"3",
         }
    },
    {
        "_entityName": "cc$MyTree",
        "_instanceName": "",
        "id": "798ae6c7-f8ba-3c96-d76b-ea2218e2168d",
        "nodeName":"5",
        "parent":{
            "id":"xxxxx"
             "nodeName":"4",
         }
    },
    {
        "_entityName": "cc$MyTree",
        "_instanceName": "",
        "id": "63b7b31f-0796-7f71-bcc6-891ec2c2f86d",
        "nodeName":"6",
        "parent":{
            "id":"xxxxx"
             "nodeName":"5",
         }
    },
    {
        "_entityName": "cc$MyTree",
        "_instanceName": "",
        "id": "991388c8-f7ee-4eae-9682-f851ee83333f",
        "nodeName":"7",
        "parent":{
            "id":"xxxxx"
             "nodeName":"6",
         },
        "nodeRef":{
            "id":"xxxx",
             "name":"7"
        }
    }
]

Actually I got below:

[{
		"_entityName": "cc$MyTree",
		"_instanceName": "1",
		"id": "3b6b5b4c-f4c7-869e-5061-8009fa5af293",
		"nodeName": "1",
		"version": 1
	},
	{
		"_entityName": "cc$MyTree",
		"_instanceName": "2",
		"id": "21e7c2fa-0653-999e-ef37-461b53b0e442",
		"nodeName": "2",
		"parent": {
			"_entityName": "cc$MyTree",
			"_instanceName": "1",
			"id": "3b6b5b4c-f4c7-869e-5061-8009fa5af293",
			"nodeName": "1",
			"version": 1
		},
		"version": 1
	},
	{
		"_entityName": "cc$MyTree",
		"_instanceName": "3",
		"id": "ba9e6d24-f3a9-3297-d253-e11b9df7a7c3",
		"nodeName": "3",
		"parent": {
			"_entityName": "cc$MyTree",
			"_instanceName": "2",
			"id": "21e7c2fa-0653-999e-ef37-461b53b0e442",
			"nodeName": "2",
			"parent": {
				"_entityName": "cc$MyTree",
				"_instanceName": "1",
				"id": "3b6b5b4c-f4c7-869e-5061-8009fa5af293",
				"nodeName": "1",
				"version": 1
			},
			"version": 1
		},
		"version": 1
	},
	{
		"_entityName": "cc$MyTree",
		"_instanceName": "4",
		"id": "77c1dcca-b651-2ff0-97f6-8337a124aa03",
		"nodeName": "4",
		"parent": {
			"_entityName": "cc$MyTree",
			"_instanceName": "3",
			"id": "ba9e6d24-f3a9-3297-d253-e11b9df7a7c3",
			"nodeName": "3",
			"parent": {
				"_entityName": "cc$MyTree",
				"_instanceName": "2",
				"id": "21e7c2fa-0653-999e-ef37-461b53b0e442",
				"nodeName": "2",
				"parent": {
					"_entityName": "cc$MyTree",
					"_instanceName": "1",
					"id": "3b6b5b4c-f4c7-869e-5061-8009fa5af293",
					"nodeName": "1",
					"version": 1
				},
				"version": 1
			},
			"version": 1
		},
		"version": 1
	},
	{
		"_entityName": "cc$MyTree",
		"_instanceName": "5",
		"id": "798ae6c7-f8ba-3c96-d76b-ea2218e2168d",
		"nodeName": "5",
		"parent": {
			"_entityName": "cc$MyTree",
			"_instanceName": "4",
			"id": "77c1dcca-b651-2ff0-97f6-8337a124aa03",
			"nodeName": "4",
			"parent": {
				"_entityName": "cc$MyTree",
				"_instanceName": "3",
				"id": "ba9e6d24-f3a9-3297-d253-e11b9df7a7c3",
				"nodeName": "3",
				"parent": {
					"_entityName": "cc$MyTree",
					"_instanceName": "2",
					"id": "21e7c2fa-0653-999e-ef37-461b53b0e442",
					"nodeName": "2",
					"parent": {
						"_entityName": "cc$MyTree",
						"_instanceName": "1",
						"id": "3b6b5b4c-f4c7-869e-5061-8009fa5af293",
						"nodeName": "1",
						"version": 1
					},
					"version": 1
				},
				"version": 1
			},
			"version": 1
		},
		"version": 1
	},
	{
		"_entityName": "cc$MyTree",
		"_instanceName": "6",
		"id": "63b7b31f-0796-7f71-bcc6-891ec2c2f86d",
		"nodeName": "6",
		"parent": {
			"_entityName": "cc$MyTree",
			"_instanceName": "5",
			"id": "798ae6c7-f8ba-3c96-d76b-ea2218e2168d",
			"nodeName": "5",
			"parent": {
				"_entityName": "cc$MyTree",
				"_instanceName": "4",
				"id": "77c1dcca-b651-2ff0-97f6-8337a124aa03",
				"nodeName": "4",
				"parent": {
					"_entityName": "cc$MyTree",
					"_instanceName": "3",
					"id": "ba9e6d24-f3a9-3297-d253-e11b9df7a7c3",
					"nodeName": "3",
					"parent": {
						"_entityName": "cc$MyTree",
						"_instanceName": "2",
						"id": "21e7c2fa-0653-999e-ef37-461b53b0e442",
						"nodeName": "2",
						"parent": {
							"_entityName": "cc$MyTree",
							"_instanceName": "1",
							"id": "3b6b5b4c-f4c7-869e-5061-8009fa5af293",
							"nodeName": "1",
							"version": 1
						},
						"version": 1
					},
					"version": 1
				},
				"version": 1
			},
			"version": 1
		},
		"version": 1
	},
	{
		"_entityName": "cc$MyTree",
		"_instanceName": "7",
		"id": "991388c8-f7ee-4eae-9682-f851ee83333f",
		"nodeName": "7",
		"parent": {
			"_entityName": "cc$MyTree",
			"_instanceName": "6",
			"id": "63b7b31f-0796-7f71-bcc6-891ec2c2f86d",
			"nodeName": "6",
			"parent": {
				"_entityName": "cc$MyTree",
				"_instanceName": "5",
				"id": "798ae6c7-f8ba-3c96-d76b-ea2218e2168d",
				"nodeName": "5",
				"parent": {
					"_entityName": "cc$MyTree",
					"_instanceName": "4",
					"id": "77c1dcca-b651-2ff0-97f6-8337a124aa03",
					"nodeName": "4",
					"parent": {
						"_entityName": "cc$MyTree",
						"_instanceName": "3",
						"id": "ba9e6d24-f3a9-3297-d253-e11b9df7a7c3",
						"nodeName": "3",
						"parent": {
							"_entityName": "cc$MyTree",
							"_instanceName": "2",
							"id": "21e7c2fa-0653-999e-ef37-461b53b0e442",
							"nodeName": "2",
							"parent": {
								"_entityName": "cc$MyTree",
								"_instanceName": "1",
								"id": "3b6b5b4c-f4c7-869e-5061-8009fa5af293",
								"nodeName": "1",
								"version": 1
							},
							"version": 1
						},
						"version": 1
					},
					"version": 1
				},
				"version": 1
			},
			"version": 1
		},
		"nodeRef": {
			"_entityName": "cc$Node",
			"_instanceName": "7",
			"id": "e60bba6c-06eb-fd18-ab26-aa3345c06e4d",
			"name": "7",
			"version": 1
		},
		"version": 2
	}
]

You can see that “parent” key repeated so many times, especially for last node, it contains all ancestor infomation. This may result in multiple times data flow while the tree is big.
Besides write my own code to serialize it , is there any way to simplify the result ? Like configuration of view or something else?

Hi,
There is a EntitySerializationOption#COMPACT_REPEATED_ENTITIES option that can be used with EntitySerializationAPI, but unfortunately standard REST API services don’t have settings that allow to configure output serialization options. If you need to get rid of repeated entities in the output, then I’m afraid the only way to go now is to implement your own controller and do the JSON serialization using proper options.

Thanks Max. Will try :blush: