Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
*/
package net.sf.jsqlparser.statement.refresh;

import java.util.function.Consumer;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.StatementVisitor;
Expand Down Expand Up @@ -60,34 +61,24 @@ public void setConcurrently(boolean concurrently) {
this.concurrently = concurrently;
}

@SuppressWarnings("PMD.SwitchStmtsShouldHaveDefault")
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
public StringBuilder appendTo(StringBuilder builder, Consumer<Table> tablePrinter) {
builder.append("REFRESH MATERIALIZED VIEW ");
if (this.refreshMode == null) {
if (concurrently) {
builder.append("CONCURRENTLY ");
}
builder.append(view);
return builder.toString();
if (concurrently) {
builder.append("CONCURRENTLY ");
}
switch (this.refreshMode) {
case WITH_DATA:
if (concurrently) {
builder.append("CONCURRENTLY ");
}
builder.append(view);
builder.append(" WITH DATA");
break;
case WITH_NO_DATA:
builder.append(view);
if (!concurrently) {
builder.append(" WITH NO DATA");
}
break;
tablePrinter.accept(view);
if (refreshMode == RefreshMode.WITH_DATA) {
builder.append(" WITH DATA");
} else if (refreshMode == RefreshMode.WITH_NO_DATA) {
builder.append(" WITH NO DATA");
}
return builder.toString();
return builder;
}

@Override
public String toString() {
StringBuilder builder = new StringBuilder();
return appendTo(builder, builder::append).toString();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
*/
package net.sf.jsqlparser.util.deparser;

import java.util.function.Consumer;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.refresh.RefreshMaterializedViewStatement;

/**
Expand All @@ -18,36 +20,22 @@
public class RefreshMaterializedViewStatementDeParser
extends AbstractDeParser<RefreshMaterializedViewStatement> {

private final Consumer<Table> tablePrinter;

public RefreshMaterializedViewStatementDeParser(StringBuilder buffer) {
super(buffer);
this.tablePrinter = table -> builder.append(table);
}

public RefreshMaterializedViewStatementDeParser(StringBuilder buffer,
Consumer<Table> tablePrinter) {
super(buffer);
this.tablePrinter = tablePrinter;
}

@SuppressWarnings("PMD.SwitchStmtsShouldHaveDefault")
@Override
public void deParse(RefreshMaterializedViewStatement view) {
builder.append("REFRESH MATERIALIZED VIEW ");
if (view.getRefreshMode() == null) {
if (view.isConcurrently()) {
builder.append("CONCURRENTLY ");
}
builder.append(view.getView());
return;
}
switch (view.getRefreshMode()) {
case WITH_DATA:
if (view.isConcurrently()) {
builder.append("CONCURRENTLY ");
}
builder.append(view.getView());
builder.append(" WITH DATA");
break;
case WITH_NO_DATA:
builder.append(view.getView());
if (view.isConcurrently()) {
builder.append(" WITH NO DATA");
}
break;
}
view.appendTo(builder, tablePrinter);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,9 @@ public <S> StringBuilder visit(CreateView createView, S context) {
@Override
public <S> StringBuilder visit(RefreshMaterializedViewStatement materializedViewStatement,
S context) {
new RefreshMaterializedViewStatementDeParser(builder).deParse(materializedViewStatement);
selectDeParser.setBuilder(builder);
new RefreshMaterializedViewStatementDeParser(builder,
table -> table.accept(selectDeParser, context)).deParse(materializedViewStatement);
return builder;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,21 @@
package net.sf.jsqlparser.statement;

import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertSame;

import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.refresh.RefreshMaterializedViewStatement;
import net.sf.jsqlparser.statement.refresh.RefreshMode;
import net.sf.jsqlparser.util.deparser.ExpressionDeParser;
import net.sf.jsqlparser.util.deparser.RefreshMaterializedViewStatementDeParser;
import net.sf.jsqlparser.util.deparser.SelectDeParser;
import net.sf.jsqlparser.util.deparser.StatementDeParser;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

/**
*
Expand All @@ -21,8 +33,83 @@

public class RefreshMaterializedViewStatementTest {

@ParameterizedTest
@ValueSource(strings = {"REFRESH MATERIALIZED VIEW my_view",
"REFRESH MATERIALIZED VIEW my_view WITH DATA",
"REFRESH MATERIALIZED VIEW my_view WITH NO DATA",
"REFRESH MATERIALIZED VIEW CONCURRENTLY my_view",
"REFRESH MATERIALIZED VIEW CONCURRENTLY my_view WITH DATA"})
public void testRefreshModes(String sql) throws JSQLParserException {
RefreshMaterializedViewStatement statement =
(RefreshMaterializedViewStatement) assertSqlCanBeParsedAndDeparsed(sql);
StringBuilder output = new StringBuilder();
new RefreshMaterializedViewStatementDeParser(output).deParse(statement);
assertEquals(sql, output.toString());
assertEquals(2, CCJSqlParserUtil.parseStatements(sql + "; SELECT 1").size());
}

@Test
void preservesModeWhenVisitingViewName() throws JSQLParserException {
RefreshMaterializedViewStatement statement =
(RefreshMaterializedViewStatement) CCJSqlParserUtil
.parse("REFRESH MATERIALIZED VIEW old_schema.mv WITH NO DATA");
StringBuilder output = new StringBuilder();
ExpressionDeParser expressions = new ExpressionDeParser();
SelectDeParser selects = new SelectDeParser(expressions, output) {
@Override
public <S> StringBuilder visit(Table table, S context) {
assertEquals("context", context);
getBuilder().append("new_schema.\"renamed view\"");
return getBuilder();
}
};
StringBuilder original = new StringBuilder();
StatementDeParser deparser = new StatementDeParser(expressions, selects, original);
deparser.setBuilder(output);
assertSame(output, statement.accept(deparser, "context"));
assertEquals("", original.toString());
assertEquals("REFRESH MATERIALIZED VIEW new_schema.\"renamed view\" WITH NO DATA",
output.toString());
RefreshMaterializedViewStatement reparsed =
(RefreshMaterializedViewStatement) CCJSqlParserUtil.parse(output.toString());
assertEquals(RefreshMode.WITH_NO_DATA, reparsed.getRefreshMode());
assertEquals("new_schema", reparsed.getView().getSchemaName());
}

@Test
void statementDeparserUsesReplacementOutputBuffer() throws JSQLParserException {
StringBuilder original = new StringBuilder("old output");
StringBuilder replacement = new StringBuilder();
StatementDeParser deparser = new StatementDeParser(original);
deparser.setBuilder(replacement);
RefreshMaterializedViewStatement statement =
(RefreshMaterializedViewStatement) CCJSqlParserUtil
.parse("REFRESH MATERIALIZED VIEW schema_name.mv WITH NO DATA");
assertSame(replacement, statement.accept(deparser, null));
assertEquals("old output", original.toString());
assertEquals(statement.toString(), replacement.toString());
}

@Test
void respectsReplacementOutputBuffer() throws JSQLParserException {
StringBuilder original = new StringBuilder();
StringBuilder replacement = new StringBuilder();
RefreshMaterializedViewStatementDeParser deparser =
new RefreshMaterializedViewStatementDeParser(original);
deparser.setBuilder(replacement);
deparser.deParse((RefreshMaterializedViewStatement) CCJSqlParserUtil
.parse("REFRESH MATERIALIZED VIEW mv WITH NO DATA"));
assertEquals("", original.toString());
assertEquals("REFRESH MATERIALIZED VIEW mv WITH NO DATA", replacement.toString());
}

@Test
public void testSimpleUse() throws JSQLParserException {
assertSqlCanBeParsedAndDeparsed("REFRESH MATERIALIZED VIEW my_view");
void rendersDefaultModeLikeOmittedMode() {
RefreshMaterializedViewStatement statement = new RefreshMaterializedViewStatement(
new Table("mv"), true, RefreshMode.DEFAULT);
StringBuilder output = new StringBuilder();
new RefreshMaterializedViewStatementDeParser(output).deParse(statement);
assertEquals("REFRESH MATERIALIZED VIEW CONCURRENTLY mv", output.toString());
assertEquals(statement.toString(), output.toString());
}
}
Loading