/* Copyright 2013 Red Hat, Inc. and/or its affiliates. This file is part of lightblue. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.redhat.lightblue.query; import com.redhat.lightblue.util.JsonUtils; import com.redhat.lightblue.util.Path; import org.junit.Assert; import org.junit.Test; public class ProjectionFieldReferenceTest { final String p_field_inclusion = "{\"field\":\"field.x\", \"include\": true}"; final String p_field_inclusion_recursive = "{\"field\":\"field.x\",\"include\": true, \"recursive\": true}"; final String p_field_exclusion = "{\"field\":\"field.y.x\",\"include\": false}"; final String p_field_exclusion_recursive = "{\"field\":\"field.y.x\",\"include\": false, \"recursive\": true}"; final String p_array_match = "{\"field\":\"field.x\",\"include\":true,\"match\":{\"field\":\"field.z\",\"op\":\"$eq\",\"rvalue\":1},\"project\":{\"field\":\"member\"}}"; final String p_array_range = "{\"field\":\"field.x\",\"include\":true, \"range\":[1,4],\"project\":{\"field\":\"member\"}}"; final String p_array_match_p = "{\"field\":\"field.x\",\"include\":true,\"match\":{\"field\":\"field.z\",\"op\":\"$eq\",\"rvalue\":1},\"projection\":{\"field\":\"member\"}}"; final String p_array_range_p = "{\"field\":\"field.x\",\"include\":true, \"range\":[1,4],\"projection\":{\"field\":\"member\"}}"; final String p_list = "[{\"field\":\"field.x\", \"include\": true},{\"field\":\"field.x.z\",\"include\": true, \"recursive\": true},{\"field\":\"field.y\",\"include\": false, \"recursive\": true}]"; @Test public void field_inclusion() throws Exception { Projection p = Projection.fromJson(JsonUtils.json(p_field_inclusion)); Assert.assertEquals(Projection.Inclusion.explicit_inclusion, p.getFieldInclusion(new Path("field.x"))); Assert.assertEquals(Projection.Inclusion.explicit_inclusion, p.getFieldInclusion(new Path("field"))); Assert.assertEquals(Projection.Inclusion.undecided, p.getFieldInclusion(new Path("field.x.y"))); } @Test public void field_inclusion_recursive() throws Exception { Projection p = Projection.fromJson(JsonUtils.json(p_field_inclusion_recursive)); Assert.assertEquals(Projection.Inclusion.explicit_inclusion, p.getFieldInclusion(new Path("field.x"))); Assert.assertEquals(Projection.Inclusion.explicit_inclusion, p.getFieldInclusion(new Path("field"))); Assert.assertEquals(Projection.Inclusion.implicit_inclusion, p.getFieldInclusion(new Path("field.x.y"))); Assert.assertEquals(Projection.Inclusion.undecided, p.getFieldInclusion(new Path("field.z"))); } @Test public void field_exclusion() throws Exception { Projection p = Projection.fromJson(JsonUtils.json(p_field_exclusion)); Assert.assertEquals(Projection.Inclusion.explicit_exclusion, p.getFieldInclusion(new Path("field.y.x"))); Assert.assertEquals(Projection.Inclusion.undecided, p.getFieldInclusion(new Path("field.y.x.z"))); Assert.assertEquals(Projection.Inclusion.undecided, p.getFieldInclusion(new Path("field"))); Assert.assertEquals(Projection.Inclusion.undecided, p.getFieldInclusion(new Path("field.y"))); } @Test public void field_exclusion_recursive() throws Exception { Projection p = Projection.fromJson(JsonUtils.json(p_field_exclusion_recursive)); Assert.assertEquals(Projection.Inclusion.explicit_exclusion, p.getFieldInclusion(new Path("field.y.x"))); Assert.assertEquals(Projection.Inclusion.implicit_exclusion, p.getFieldInclusion(new Path("field.y.x.z"))); Assert.assertEquals(Projection.Inclusion.undecided, p.getFieldInclusion(new Path("field"))); Assert.assertEquals(Projection.Inclusion.undecided, p.getFieldInclusion(new Path("field.y"))); } @Test public void array_match() throws Exception { Projection p = Projection.fromJson(JsonUtils.json(p_array_match)); Assert.assertEquals(Projection.Inclusion.explicit_inclusion, p.getFieldInclusion(new Path("field.x"))); Assert.assertEquals(Projection.Inclusion.explicit_inclusion, p.getFieldInclusion(new Path("field"))); Assert.assertEquals(Projection.Inclusion.explicit_inclusion, p.getFieldInclusion(new Path("field.x.*.member"))); Assert.assertEquals(Projection.Inclusion.undecided, p.getFieldInclusion(new Path("field.a"))); Assert.assertEquals(Projection.Inclusion.undecided, p.getFieldInclusion(new Path("field.x.*.field.z"))); Assert.assertTrue(p.isFieldRequiredToEvaluateProjection(new Path("field.x"))); Assert.assertTrue(p.isFieldRequiredToEvaluateProjection(new Path("field.x.field"))); Assert.assertTrue(p.isFieldRequiredToEvaluateProjection(new Path("field.x.*.field.z"))); Assert.assertFalse(p.isFieldRequiredToEvaluateProjection(new Path("field.a"))); } @Test public void array_range() throws Exception { Projection p = Projection.fromJson(JsonUtils.json(p_array_range)); Assert.assertEquals(Projection.Inclusion.explicit_inclusion, p.getFieldInclusion(new Path("field.x"))); Assert.assertEquals(Projection.Inclusion.explicit_inclusion, p.getFieldInclusion(new Path("field"))); Assert.assertEquals(Projection.Inclusion.explicit_inclusion, p.getFieldInclusion(new Path("field.x.*.member"))); Assert.assertEquals(Projection.Inclusion.undecided, p.getFieldInclusion(new Path("field.a"))); Assert.assertEquals(Projection.Inclusion.undecided, p.getFieldInclusion(new Path("field.x.*.b"))); Assert.assertTrue(p.isFieldRequiredToEvaluateProjection(new Path("field"))); Assert.assertTrue(p.isFieldRequiredToEvaluateProjection(new Path("field.x"))); Assert.assertTrue(p.isFieldRequiredToEvaluateProjection(new Path("field.x.*.member"))); Assert.assertFalse(p.isFieldRequiredToEvaluateProjection(new Path("field.a"))); } @Test public void array_match_p() throws Exception { Projection p = Projection.fromJson(JsonUtils.json(p_array_match_p)); Assert.assertEquals(Projection.Inclusion.explicit_inclusion, p.getFieldInclusion(new Path("field.x"))); Assert.assertEquals(Projection.Inclusion.explicit_inclusion, p.getFieldInclusion(new Path("field"))); Assert.assertEquals(Projection.Inclusion.explicit_inclusion, p.getFieldInclusion(new Path("field.x.*.member"))); Assert.assertEquals(Projection.Inclusion.undecided, p.getFieldInclusion(new Path("field.a"))); Assert.assertEquals(Projection.Inclusion.undecided, p.getFieldInclusion(new Path("field.x.*.field.z"))); Assert.assertTrue(p.isFieldRequiredToEvaluateProjection(new Path("field.x"))); Assert.assertTrue(p.isFieldRequiredToEvaluateProjection(new Path("field.x.field"))); Assert.assertTrue(p.isFieldRequiredToEvaluateProjection(new Path("field.x.*.field.z"))); Assert.assertFalse(p.isFieldRequiredToEvaluateProjection(new Path("field.a"))); } @Test public void array_range_p() throws Exception { Projection p = Projection.fromJson(JsonUtils.json(p_array_range_p)); Assert.assertEquals(Projection.Inclusion.explicit_inclusion, p.getFieldInclusion(new Path("field.x"))); Assert.assertEquals(Projection.Inclusion.explicit_inclusion, p.getFieldInclusion(new Path("field"))); Assert.assertEquals(Projection.Inclusion.explicit_inclusion, p.getFieldInclusion(new Path("field.x.*.member"))); Assert.assertEquals(Projection.Inclusion.undecided, p.getFieldInclusion(new Path("field.a"))); Assert.assertEquals(Projection.Inclusion.undecided, p.getFieldInclusion(new Path("field.x.*.b"))); Assert.assertTrue(p.isFieldRequiredToEvaluateProjection(new Path("field"))); Assert.assertTrue(p.isFieldRequiredToEvaluateProjection(new Path("field.x"))); Assert.assertTrue(p.isFieldRequiredToEvaluateProjection(new Path("field.x.*.member"))); Assert.assertFalse(p.isFieldRequiredToEvaluateProjection(new Path("field.a"))); } @Test public void projection_list() throws Exception { Projection p = Projection.fromJson(JsonUtils.json(p_list)); Assert.assertTrue(p instanceof ProjectionList); ProjectionList pl = (ProjectionList) p; //"[{\"field\":\"field.x\", \"include\": true},{\"field\":\"field.x.z\",\"include\": true, \"recursive\": true},{\"field\":\"field.y\",\"include\": false, \"recursive\": true}]"; Assert.assertEquals(Projection.Inclusion.explicit_inclusion, p.getFieldInclusion(new Path("field.x"))); Assert.assertEquals(Projection.Inclusion.explicit_inclusion, p.getFieldInclusion(new Path("field"))); Assert.assertEquals(Projection.Inclusion.explicit_inclusion, p.getFieldInclusion(new Path("field.x.z"))); Assert.assertEquals(Projection.Inclusion.implicit_inclusion, p.getFieldInclusion(new Path("field.x.z.b"))); Assert.assertEquals(Projection.Inclusion.explicit_exclusion, p.getFieldInclusion(new Path("field.y"))); Assert.assertEquals(Projection.Inclusion.implicit_exclusion, p.getFieldInclusion(new Path("field.y.q"))); Assert.assertEquals(Projection.Inclusion.undecided, p.getFieldInclusion(new Path("field.t"))); Assert.assertTrue(p.isFieldRequiredToEvaluateProjection(new Path("field"))); Assert.assertTrue(p.isFieldRequiredToEvaluateProjection(new Path("field.x"))); Assert.assertTrue(p.isFieldRequiredToEvaluateProjection(new Path("field.x.z"))); Assert.assertTrue(p.isFieldRequiredToEvaluateProjection(new Path("field.x.z.b"))); Assert.assertFalse(p.isFieldRequiredToEvaluateProjection(new Path("field.y"))); Assert.assertFalse(p.isFieldRequiredToEvaluateProjection(new Path("field.y.q"))); Assert.assertFalse(p.isFieldRequiredToEvaluateProjection(new Path("field.t"))); } @Test public void explicit_inclusion_override() throws Exception { Projection p=Projection.fromJson(JsonUtils.json("[{\"field\":\"x\"},{\"field\":\"*\",\"recursive\":true}]")); Assert.assertEquals(Projection.Inclusion.explicit_inclusion, p.getFieldInclusion(new Path("x"))); } }