package org.molgenis.data.support;
import org.molgenis.data.Entity;
import org.molgenis.data.Fetch;
import org.molgenis.data.Query;
import org.molgenis.data.QueryRule;
import org.molgenis.data.QueryRule.Operator;
import org.testng.annotations.Test;
import java.util.Arrays;
import java.util.List;
import static org.testng.Assert.*;
public class QueryImplTest
{
@Test
public void rng()
{
Query<Entity> q = new QueryImpl<Entity>().rng("field", "min", "max");
QueryRule expectedRule = new QueryRule("field", Operator.RANGE, Arrays.asList("min", "max"));
assertEquals(q.getRules(), Arrays.asList(expectedRule));
}
@Test
public void nest()
{
Query<Entity> q = new QueryImpl<>().nest().eq("field", "value").unnest();
QueryRule expectedRule = new QueryRule(Arrays.asList(new QueryRule("field", Operator.EQUALS, "value")));
assertEquals(q.getRules(), Arrays.asList(expectedRule));
}
@Test
public void nestOr()
{
Query<Entity> q = new QueryImpl<>().nest().eq("field", "value1").or().eq("field", "value2").unnest();
QueryRule expectedRule = new QueryRule(
Arrays.asList(new QueryRule("field", Operator.EQUALS, "value1"), new QueryRule(Operator.OR),
new QueryRule("field", Operator.EQUALS, "value2")));
assertEquals(q.getRules(), Arrays.asList(expectedRule));
}
@Test
public void nestAnd()
{
Query<Entity> q = new QueryImpl<>().nest().eq("field", "value1").and().eq("field", "value2").unnest();
QueryRule expectedRule = new QueryRule(
Arrays.asList(new QueryRule("field", Operator.EQUALS, "value1"), new QueryRule(Operator.AND),
new QueryRule("field", Operator.EQUALS, "value2")));
assertEquals(q.getRules(), Arrays.asList(expectedRule));
}
@Test
public void nestDeep()
{
// A OR (B AND (C OR D))
Query<Entity> q = new QueryImpl<>().eq("field1", "value1").or().nest().eq("field2", "value2").and().nest()
.eq("field3", "value3").or().eq("field4", "value4").unnest().unnest();
QueryRule expectedRule1 = new QueryRule("field1", Operator.EQUALS, "value1");
QueryRule expectedRule1a = new QueryRule("field2", Operator.EQUALS, "value2");
QueryRule expectedRule1b1 = new QueryRule("field3", Operator.EQUALS, "value3");
QueryRule expectedRule1b2 = new QueryRule("field4", Operator.EQUALS, "value4");
QueryRule expectedRule1b = new QueryRule(
Arrays.asList(expectedRule1b1, new QueryRule(Operator.OR), expectedRule1b2));
QueryRule expectedRule2 = new QueryRule(
Arrays.asList(expectedRule1a, new QueryRule(Operator.AND), expectedRule1b));
assertEquals(q.getRules(), Arrays.asList(expectedRule1, new QueryRule(Operator.OR), expectedRule2));
}
@Test
public void setFetch()
{
Fetch fetch = new Fetch();
QueryImpl<Entity> q = new QueryImpl<>();
q.setFetch(fetch);
assertEquals(fetch, q.getFetch());
}
@Test
public void fetch()
{
Fetch fetch = new QueryImpl<>().fetch();
assertFalse(fetch.iterator().hasNext());
}
@Test
public void fetchFetch()
{
Fetch fetch = new Fetch().field("field0");
assertEquals(fetch, new QueryImpl<>().fetch(fetch).getFetch());
}
@Test
public void equalsFetch()
{
QueryImpl<Entity> q1 = new QueryImpl<>();
q1.fetch().field("field0");
QueryImpl<Entity> q2 = new QueryImpl<>();
q2.fetch().field("field0");
assertEquals(q1, q2);
}
@Test
public void equalsFetchFalse()
{
QueryImpl<Entity> q1 = new QueryImpl<>();
q1.fetch().field("field0");
QueryImpl<Entity> q2 = new QueryImpl<>();
q2.fetch().field("field1");
assertEquals(q1, q2);
}
@Test
public void queryImplQueryFetch()
{
Query<Entity> q1 = new QueryImpl<>();
q1.fetch().field("field0");
QueryImpl<Entity> q2 = new QueryImpl<>(q1);
assertEquals(q1.getFetch(), q2.getFetch());
}
@Test
public void equals()
{
QueryImpl<Entity> q1 = new QueryImpl<>();
{
QueryRule geRule = new QueryRule("jaar", Operator.GREATER_EQUAL, "1995");
QueryRule andRule = new QueryRule(Operator.AND);
QueryRule leRule = new QueryRule("jaar", Operator.LESS_EQUAL, "1995");
List<QueryRule> subSubNestedRules = Arrays.asList(geRule, andRule, leRule);
List<QueryRule> subNestedRules = Arrays.asList(new QueryRule(subSubNestedRules));
List<QueryRule> nestedRules = Arrays.asList(new QueryRule(subNestedRules));
QueryRule rule = new QueryRule(nestedRules);
q1.addRule(rule);
}
QueryImpl<Entity> q2 = new QueryImpl<>();
{
QueryRule geRule = new QueryRule("jaar", Operator.GREATER_EQUAL, "1996");
QueryRule andRule = new QueryRule(Operator.AND);
QueryRule leRule = new QueryRule("jaar", Operator.LESS_EQUAL, "1996");
List<QueryRule> subSubNestedRules = Arrays.asList(geRule, andRule, leRule);
List<QueryRule> subNestedRules = Arrays.asList(new QueryRule(subSubNestedRules));
List<QueryRule> nestedRules = Arrays.asList(new QueryRule(subNestedRules));
QueryRule rule = new QueryRule(nestedRules);
q2.addRule(rule);
}
assertNotEquals(q1, q2);
}
}