/* * ModeShape (http://www.modeshape.org) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.modeshape.jcr.query.model; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsNull.nullValue; import static org.hamcrest.core.IsSame.sameInstance; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.mock; import java.util.Collections; import java.util.List; import org.junit.Test; /** * */ public class QueryTest extends AbstractQueryObjectTest { private Query query; private Source source; private Constraint constraint; private List<? extends Ordering> orderings; private List<? extends Column> columns; private Limit limits; private boolean distinct; @Test( expected = IllegalArgumentException.class ) public void shouldNotCreateWithNullSource() { new Query(null); } @Test( expected = IllegalArgumentException.class ) public void shouldNotCreateWithNullSourceWhenSupplyingOtherParameters() { source = null; constraint = mock(Constraint.class); orderings = Collections.emptyList(); columns = Collections.emptyList(); limits = null; new Query(source, constraint, orderings, columns, limits, distinct); } @Test public void shouldAllowNullConstraint() { source = mock(Source.class); constraint = null; orderings = Collections.emptyList(); columns = Collections.emptyList(); limits = null; query = new Query(source, constraint, orderings, columns, limits, distinct); assertThat(query.source(), is(sameInstance(source))); assertThat(query.constraint(), is(nullValue())); assertThat(query.orderings() == orderings, is(true)); assertThat(query.columns() == columns, is(true)); } @Test public void shouldAllowNullOrderingsList() { source = mock(Source.class); constraint = mock(Constraint.class); orderings = null; columns = Collections.emptyList(); limits = null; query = new Query(source, constraint, orderings, columns, limits, distinct); assertThat(query.source(), is(sameInstance(source))); assertThat(query.constraint(), is(sameInstance(constraint))); assertThat(query.orderings().isEmpty(), is(true)); assertThat(query.columns() == columns, is(true)); } @Test public void shouldAllowNullColumnsList() { source = mock(Source.class); constraint = mock(Constraint.class); orderings = Collections.emptyList(); columns = null; limits = null; query = new Query(source, constraint, orderings, columns, limits, distinct); assertThat(query.source(), is(sameInstance(source))); assertThat(query.constraint(), is(sameInstance(constraint))); assertThat(query.orderings() == orderings, is(true)); assertThat(query.columns().isEmpty(), is(true)); } @Test public void shouldCreateWithNonNullParameters() { source = mock(Source.class); constraint = mock(Constraint.class); orderings = Collections.emptyList(); columns = Collections.emptyList(); limits = null; query = new Query(source, constraint, orderings, columns, limits, distinct); assertThat(query.source(), is(sameInstance(source))); assertThat(query.constraint(), is(sameInstance(constraint))); assertThat(query.orderings() == orderings, is(true)); assertThat(query.columns() == columns, is(true)); } @Test public void shouldConstructReadableString() { source = new NamedSelector(selector("nt:unstructured")); columns = Collections.singletonList(new Column(selector("selector1"))); constraint = new PropertyExistence(selector("selector1"), "jcr:uuid"); orderings = Collections.singletonList(new Ordering(new NodeName(selector("selector1")), Order.ASCENDING, NullOrder.NULLS_LAST)); query = new Query(source, constraint, orderings, columns, limits, distinct); assertThat(Visitors.readable(query), is("SELECT selector1.* FROM [nt:unstructured] WHERE selector1.[jcr:uuid] IS NOT NULL ORDER BY NAME(selector1) ASC NULLS LAST")); } @Test public void shouldConstructReadableStringWithLimits() { source = new NamedSelector(selector("nt:unstructured")); columns = Collections.singletonList(new Column(selector("selector1"))); constraint = new PropertyExistence(selector("selector1"), "jcr:uuid"); orderings = Collections.singletonList(new Ordering(new NodeName(selector("selector1")), Order.ASCENDING, NullOrder.NULLS_LAST)); limits = new Limit(10, 100); query = new Query(source, constraint, orderings, columns, limits, distinct); assertThat(Visitors.readable(query), is("SELECT selector1.* FROM [nt:unstructured] WHERE selector1.[jcr:uuid] IS NOT NULL ORDER BY NAME(selector1) ASC NULLS LAST LIMIT 10 OFFSET 100")); } @Test public void shouldConstructReadableStringWithNoColumns() { source = new NamedSelector(selector("nt:unstructured")); columns = Collections.emptyList(); constraint = new PropertyExistence(selector("selector1"), "jcr:uuid"); orderings = Collections.singletonList(new Ordering(new NodeName(selector("selector1")), Order.ASCENDING, NullOrder.NULLS_LAST)); query = new Query(source, constraint, orderings, columns, limits, distinct); assertThat(Visitors.readable(query), is("SELECT * FROM [nt:unstructured] WHERE selector1.[jcr:uuid] IS NOT NULL ORDER BY NAME(selector1) ASC NULLS LAST")); } @Test public void shouldConstructReadableStringWithNoOrderings() { source = new NamedSelector(selector("nt:unstructured")); columns = Collections.singletonList(new Column(selector("selector1"))); constraint = new PropertyExistence(selector("selector1"), "jcr:uuid"); orderings = Collections.emptyList(); query = new Query(source, constraint, orderings, columns, limits, distinct); assertThat(Visitors.readable(query), is("SELECT selector1.* FROM [nt:unstructured] WHERE selector1.[jcr:uuid] IS NOT NULL")); } @Test public void shouldConstructReadableStringWithNoConstraint() { source = new NamedSelector(selector("nt:unstructured")); columns = Collections.singletonList(new Column(selector("selector1"))); constraint = null; orderings = Collections.singletonList(new Ordering(new NodeName(selector("selector1")), Order.ASCENDING, NullOrder.NULLS_LAST)); query = new Query(source, constraint, orderings, columns, limits, distinct); assertThat(Visitors.readable(query), is("SELECT selector1.* FROM [nt:unstructured] ORDER BY NAME(selector1) ASC NULLS LAST")); } @Test public void shouldConstructReadableStringWithDistinctAndNoConstraintOrColumnsOrOrderings() { source = new NamedSelector(selector("nt:unstructured")); columns = Collections.emptyList(); constraint = null; orderings = Collections.emptyList(); distinct = true; query = new Query(source, constraint, orderings, columns, limits, distinct); assertThat(Visitors.readable(query), is("SELECT DISTINCT * FROM [nt:unstructured]")); source = new AllNodes(); query = new Query(source, constraint, orderings, columns, limits, distinct); assertThat(Visitors.readable(query), is("SELECT DISTINCT * FROM [__ALLNODES__]")); } @Test public void shouldConstructReadableStringWithNoConstraintOrColumnsOrOrderings() { source = new NamedSelector(selector("nt:unstructured")); columns = Collections.emptyList(); constraint = null; orderings = Collections.emptyList(); query = new Query(source, constraint, orderings, columns, limits, distinct); assertThat(Visitors.readable(query), is("SELECT * FROM [nt:unstructured]")); source = new AllNodes(); query = new Query(source, constraint, orderings, columns, limits, distinct); assertThat(Visitors.readable(query), is("SELECT * FROM [__ALLNODES__]")); } }