package annis.sqlgen;
import annis.model.QueryNode;
import annis.ql.parser.QueryData;
import java.util.ArrayList;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.Matchers.startsWith;
import org.junit.Assert;
import static org.junit.Assert.assertThat;
import org.junit.Before;
import org.junit.Test;
import static org.mockito.BDDMockito.given;
import org.mockito.Mock;
import static org.mockito.MockitoAnnotations.initMocks;
public class TestFindSqlGenerator
{
// class under test
private SolutionSqlGenerator generator;
// test data
@Mock
private TableAccessStrategy tableAccessStrategy;
@Mock
private QueryData queryData;
@Mock
private QueryNode queryNode;
private ArrayList<QueryNode> alternative = new ArrayList<>();
@Before
public void setup()
{
initMocks(this);
generator = new SolutionSqlGenerator()
{
protected TableAccessStrategy createTableAccessStrategy()
{
return tableAccessStrategy;
}
};
}
private void setupQueryData()
{
alternative.add(queryNode);
given(queryData.getMaxWidth()).willReturn(1);
}
@Test
public void shouldSkipDistinctIfOnlyNodeTablesAreUsed()
{
// given
setupQueryData();
given(tableAccessStrategy.usesRankTable()).willReturn(false);
// when
String actual = generator.selectClause(queryData, alternative, "");
// then
assertThat(actual, not(startsWith("DISTINCT")));
}
@Test
public void shouldUseGroupByIfPartOfEdge()
{
// given
setupQueryData();
given(tableAccessStrategy.usesRankTable()).willReturn(true);
given(queryNode.isPartOfEdge()).willReturn(true);
given(queryNode.isRoot()).willReturn(false);
// when
String actual = generator.groupByAttributes(queryData, alternative);
// then
Assert.assertNotNull(actual);
}
@Test
public void shouldUseGroupByIfRoot()
{
// given
setupQueryData();
given(tableAccessStrategy.usesRankTable()).willReturn(true);
given(queryNode.isPartOfEdge()).willReturn(false);
given(queryNode.isRoot()).willReturn(true);
// when
String actual = generator.groupByAttributes(queryData, alternative);
// then
Assert.assertNotNull(actual);
}
}