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
100 changes: 73 additions & 27 deletions src/main/java/net/sf/jsqlparser/expression/JsonFunction.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import java.util.ArrayList;
import java.util.Locale;
import java.util.Objects;
import java.util.function.Consumer;

import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
import net.sf.jsqlparser.statement.create.table.ColDataType;
Expand Down Expand Up @@ -77,6 +78,11 @@ public void setExpression(Expression expression) {
}

public StringBuilder append(StringBuilder builder) {
return appendTo(builder, builder::append);
}

public StringBuilder appendTo(StringBuilder builder,
Consumer<Expression> expressionPrinter) {
switch (type) {
case ERROR:
builder.append("ERROR");
Expand All @@ -85,7 +91,12 @@ public StringBuilder append(StringBuilder builder) {
builder.append("NULL");
break;
case DEFAULT:
builder.append("DEFAULT ").append(expression);
builder.append("DEFAULT ");
if (expression == null) {
builder.append("null");
} else {
expressionPrinter.accept(expression);
}
break;
case EMPTY:
builder.append("EMPTY ");
Expand Down Expand Up @@ -389,39 +400,49 @@ public <T, S> T accept(ExpressionVisitor<T> expressionVisitor, S context) {

// avoid countless Builder --> String conversion
public StringBuilder append(StringBuilder builder) {
return appendTo(builder, builder::append);
}

/** Renders structured children through the supplied expression printer. */
public StringBuilder appendTo(StringBuilder builder, Consumer<Expression> expressionPrinter) {
switch (functionType) {
case OBJECT:
case POSTGRES_OBJECT:
case MYSQL_OBJECT:
appendObject(builder);
appendObject(builder, expressionPrinter);
break;
case ARRAY:
appendArray(builder);
appendArray(builder, expressionPrinter);
break;
case VALUE:
appendValue(builder);
appendValue(builder, expressionPrinter);
break;
case QUERY:
appendQuery(builder);
appendQuery(builder, expressionPrinter);
break;
case EXISTS:
appendExists(builder);
appendExists(builder, expressionPrinter);
break;
default:
// this should never happen really
}
return builder;
}

@SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"})
public StringBuilder appendObject(StringBuilder builder) {
return appendObject(builder, builder::append);
}

@SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"})
public StringBuilder appendObject(StringBuilder builder,
Consumer<Expression> expressionPrinter) {
builder.append("JSON_OBJECT( ");
int i = 0;
for (JsonKeyValuePair keyValuePair : keyValuePairs) {
if (i > 0) {
builder.append(", ");
}
keyValuePair.append(builder);
keyValuePair.appendTo(builder, expressionPrinter);
i++;
}

Expand Down Expand Up @@ -467,16 +488,21 @@ private void appendUniqueKeys(StringBuilder builder) {
}
}

@SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"})
public StringBuilder appendArray(StringBuilder builder) {
return appendArray(builder, builder::append);
}

@SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"})
public StringBuilder appendArray(StringBuilder builder,
Consumer<Expression> expressionPrinter) {
builder.append("JSON_ARRAY( ");
int i = 0;

for (JsonFunctionExpression expr : expressions) {
if (i > 0) {
builder.append(", ");
}
expr.append(builder);
expr.appendTo(builder, expressionPrinter);
i++;
}

Expand All @@ -487,33 +513,43 @@ public StringBuilder appendArray(StringBuilder builder) {
return builder;
}

@SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"})
public StringBuilder appendValue(StringBuilder builder) {
return appendValue(builder, builder::append);
}

@SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"})
public StringBuilder appendValue(StringBuilder builder,
Consumer<Expression> expressionPrinter) {
builder.append("JSON_VALUE(");
appendValueOrQueryPrefix(builder);
appendValueOrQueryPrefix(builder, expressionPrinter);

if (returningType != null) {
builder.append(" RETURNING ").append(returningType);
}

appendOnResponseClause(builder, onEmptyBehavior, "EMPTY");
appendOnResponseClause(builder, onErrorBehavior, "ERROR");
appendOnResponseClause(builder, onEmptyBehavior, "EMPTY", expressionPrinter);
appendOnResponseClause(builder, onErrorBehavior, "ERROR", expressionPrinter);

builder.append(")");
return builder;
}

@SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"})
public StringBuilder appendQuery(StringBuilder builder) {
return appendQuery(builder, builder::append);
}

@SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"})
public StringBuilder appendQuery(StringBuilder builder,
Consumer<Expression> expressionPrinter) {
builder.append("JSON_QUERY(");
appendValueOrQueryPrefix(builder);
appendValueOrQueryPrefix(builder, expressionPrinter);

appendReturningClause(builder, true);

appendWrapperClause(builder);
appendQuotesClause(builder);
appendOnResponseClause(builder, onEmptyBehavior, "EMPTY");
appendOnResponseClause(builder, onErrorBehavior, "ERROR");
appendOnResponseClause(builder, onEmptyBehavior, "EMPTY", expressionPrinter);
appendOnResponseClause(builder, onErrorBehavior, "ERROR", expressionPrinter);

for (String additionalQueryPathArgument : additionalQueryPathArguments) {
builder.append(", ").append(additionalQueryPathArgument);
Expand All @@ -523,25 +559,31 @@ public StringBuilder appendQuery(StringBuilder builder) {
return builder;
}

@SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"})
public StringBuilder appendExists(StringBuilder builder) {
return appendExists(builder, builder::append);
}

@SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"})
public StringBuilder appendExists(StringBuilder builder,
Consumer<Expression> expressionPrinter) {
builder.append("JSON_EXISTS(");
appendValueOrQueryPrefix(builder);
appendOnResponseClause(builder, onErrorBehavior, "ERROR");
appendValueOrQueryPrefix(builder, expressionPrinter);
appendOnResponseClause(builder, onErrorBehavior, "ERROR", expressionPrinter);
builder.append(")");
return builder;
}

private void appendValueOrQueryPrefix(StringBuilder builder) {
private void appendValueOrQueryPrefix(StringBuilder builder,
Consumer<Expression> expressionPrinter) {
if (inputExpression != null) {
inputExpression.append(builder);
inputExpression.appendTo(builder, expressionPrinter);
}

if (jsonPathExpression != null) {
if (inputExpression != null) {
builder.append(", ");
}
builder.append(jsonPathExpression);
expressionPrinter.accept(jsonPathExpression);
}

if (!passingExpressions.isEmpty()) {
Expand All @@ -553,16 +595,20 @@ private void appendValueOrQueryPrefix(StringBuilder builder) {
} else {
comma = true;
}
builder.append(passingExpression);
if (passingExpression == null) {
builder.append("null");
} else {
expressionPrinter.accept(passingExpression);
}
}
}
}

private void appendOnResponseClause(StringBuilder builder, JsonOnResponseBehavior behavior,
String clause) {
String clause, Consumer<Expression> expressionPrinter) {
if (behavior != null) {
builder.append(" ");
behavior.append(builder);
behavior.appendTo(builder, expressionPrinter);
builder.append(" ON ").append(clause);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

import java.io.Serializable;
import java.util.Objects;
import java.util.function.Consumer;

/**
* @author <a href="mailto:andreas@manticore-projects.com">Andreas Reichel</a>
Expand Down Expand Up @@ -58,7 +59,11 @@ public JsonFunctionExpression withEncoding(String encoding) {
}

public StringBuilder append(StringBuilder builder) {
builder.append(getExpression());
return appendTo(builder, builder::append);
}

public StringBuilder appendTo(StringBuilder builder, Consumer<Expression> expressionPrinter) {
expressionPrinter.accept(getExpression());
if (isUsingFormatJson()) {
builder.append(" FORMAT JSON");
if (encoding != null) {
Expand Down
18 changes: 16 additions & 2 deletions src/main/java/net/sf/jsqlparser/expression/JsonKeyValuePair.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

import java.io.Serializable;
import java.util.Objects;
import java.util.function.Consumer;

/**
* @author <a href="mailto:andreas@manticore-projects.com">Andreas Reichel</a>
Expand Down Expand Up @@ -153,14 +154,18 @@ public Object getValue() {
}

public StringBuilder append(StringBuilder builder) {
return appendTo(builder, builder::append);
}

public StringBuilder appendTo(StringBuilder builder, Consumer<Expression> expressionPrinter) {
if (isUsingKeyKeyword() && getSeparator() == JsonKeyValuePairSeparator.VALUE) {
builder.append("KEY ");
}
builder.append(getKey());
appendValue(builder, getKey(), expressionPrinter);

if (getValue() != null) {
builder.append(getSeparator().getSeparatorString());
builder.append(getValue());
appendValue(builder, getValue(), expressionPrinter);
}

if (isUsingFormatJson()) {
Expand All @@ -173,6 +178,15 @@ public StringBuilder append(StringBuilder builder) {
return builder;
}

private static void appendValue(StringBuilder builder, Object value,
Consumer<Expression> expressionPrinter) {
if (value instanceof Expression) {
expressionPrinter.accept((Expression) value);
} else {
builder.append(value);
}
}

@Override
public String toString() {
return append(new StringBuilder()).toString();
Expand Down
Loading
Loading