@Override public boolean hasNext() { return mLastReturned == null || mLastReturned.previous() != null; }
@Override @NotNull public String toSql(@NotNull final FinishedSqlPart finishedSqlPart) { RawSqlBuilder rawSqlBuilder = new RawSqlBuilderImpl(); for (Iterator<SqlPart> iterator = finishedSqlPart.iterator(); iterator.hasNext(); ) { SqlPart sqlPart = iterator.next(); sqlPart.prependTo(rawSqlBuilder); if (iterator.hasNext()) { rawSqlBuilder.prepend(' '); } } return DOUBLE_SPACE.matcher(rawSqlBuilder.toString()).replaceAll(" "); }
@Override @NotNull public Object[] retrieveArguments(@NotNull final FinishedSqlPart finishedSqlPart) { Object[] results = new Object[0]; for (SqlPart sqlPart : finishedSqlPart) { Object[] arguments = sqlPart.getArguments(); if (arguments != null) { results = combine(arguments, results); } } return results; } }
@Override public void prependTo(@NotNull final RawSqlBuilder builder) { for (SqlPart sqlPart : mSelectStatement) { sqlPart.prependTo(builder); builder.prepend(' '); } builder.prepend("AS"); }
@Override public SqlPart next() { if (mLastReturned == null) { mLastReturned = mFirst; return mFirst; } SqlPart next = mLastReturned.previous(); if (next == null) { throw new NoSuchElementException("No previous SqlPart."); } mLastReturned = next; return mLastReturned; }
@Test public void nextWhenThereIsANext_returnsProperItem() { /* Given */ SqlPart first = mock(SqlPart.class); SqlPart second = mock(SqlPart.class); when(first.previous()).thenReturn(second); SqlPartIterator iterator = new SqlPartIterator(first); iterator.next(); /* When */ SqlPart result = iterator.next(); /* Then */ assertThat(result, is(second)); } }