package annis.sqlgen;
import annis.model.QueryNode;
import annis.ql.parser.QueryData;
import static annis.sqlgen.AbstractSqlGenerator.TABSTOP;
import static annis.sqlgen.TableAccessStrategy.NODE_TABLE;
import annis.sqlgen.extensions.AnnotateQueryData;
import static annis.test.TestUtils.uniqueAlphaString;
import static annis.test.TestUtils.uniqueInt;
import java.util.ArrayList;
import static java.util.Arrays.asList;
import java.util.Collections;
import java.util.List;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import org.junit.Before;
import org.junit.Test;
import static org.mockito.BDDMockito.given;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import static org.mockito.MockitoAnnotations.initMocks;
public class TestAnnotateInnerQuerySqlGenerator
{
// class under test
@InjectMocks private AnnotateInnerQuerySqlGenerator generator = new AnnotateInnerQuerySqlGenerator() {
@Override
protected TableAccessStrategy createTableAccessStrategy()
{
return tableAccessStrategy;
}
};
// dependencies
@Mock private TableAccessStrategy tableAccessStrategy;
@Mock private SolutionKey key;
// test data
@Mock private QueryData queryData;
@Mock private AnnotateQueryData annotateQueryData;
private List<QueryNode> alternative = new ArrayList<>();
private static final String INDENT = TABSTOP;
@Before
public void setup()
{
initMocks(this);
}
/**
* The SELECT clause consists of the column text_ref, left, right and the
* key columns for each node in the query alternative. Left and right are
* modified by the requested annotation context.
*/
@Test
public void shouldGenerateSelectClause()
{
// given
alternative = Collections.nCopies(2, new QueryNode());
int left = uniqueInt(10);
int right = uniqueInt(20);
List extensions = new ArrayList<>();
extensions.add(annotateQueryData);
given(annotateQueryData.getLeft()).willReturn(left);
given(annotateQueryData.getRight()).willReturn(right);
given(queryData.getExtensions(AnnotateQueryData.class)).willReturn(
extensions);
given(queryData.getMaxWidth()).willReturn(alternative.size());
String key1Column1 = uniqueAlphaString();
String key1Column2 = uniqueAlphaString();
String key2Column1 = uniqueAlphaString();
String key2Column2 = uniqueAlphaString();
given(key.generateInnerQueryColumns(tableAccessStrategy, 1)).willReturn(asList(key1Column1, key1Column2));
given(key.generateInnerQueryColumns(tableAccessStrategy, 2)).willReturn(asList(key2Column1, key2Column2));
String textRefAlias1 = uniqueAlphaString();
String leftTokenAlias1 = uniqueAlphaString();
String rightTokenAlias1 = uniqueAlphaString();
String textRefAlias2 = uniqueAlphaString();
String leftTokenAlias2 = uniqueAlphaString();
String rightTokenAlias2 = uniqueAlphaString();
String corpusRefAlias1 = uniqueAlphaString();
String corpusRefAlias2 = uniqueAlphaString();
String nodeNameAlias1 = uniqueAlphaString();
String nodeNameAlias2 = uniqueAlphaString();
given(tableAccessStrategy.aliasedColumn(NODE_TABLE, "text_ref")).willReturn(textRefAlias1, textRefAlias2);
given(tableAccessStrategy.aliasedColumn(NODE_TABLE, "left_token")).willReturn(leftTokenAlias1, leftTokenAlias2);
given(tableAccessStrategy.aliasedColumn(NODE_TABLE, "right_token")).willReturn(rightTokenAlias1, rightTokenAlias2);
given(tableAccessStrategy.aliasedColumn(NODE_TABLE, "corpus_ref")).willReturn(corpusRefAlias1, corpusRefAlias2);
given(tableAccessStrategy.aliasedColumn(NODE_TABLE, "name")).willReturn(nodeNameAlias1, nodeNameAlias2);
// when
String actual = generator.selectClause(queryData, alternative, INDENT);
// then
String expected = "DISTINCT" + "\n" + INDENT + TABSTOP +
key1Column1 + ", " +
key1Column2 + ", " +
textRefAlias1 + " AS " + "text" + 1 + ", " +
leftTokenAlias1 + " - " + left + " AS " + "min" + 1 + ", " +
rightTokenAlias1 + " + " + right + " AS " + "max" + 1 + ", " +
corpusRefAlias1 + " AS corpus1, " +
nodeNameAlias1 + " AS name1, " +
"\n" + INDENT + TABSTOP +
key2Column1 + ", " +
key2Column2 + ", " +
textRefAlias2 + " AS " + "text" + 2 + ", " +
leftTokenAlias2 + " - " + left + " AS " + "min" + 2 + ", " +
rightTokenAlias2 + " + " + right + " AS " + "max" + 2 + ", " +
corpusRefAlias2 + " AS corpus2, " +
nodeNameAlias2 + " AS name2";
assertThat(actual, is(expected));
}
}