Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#286 - type conversion error #287

Merged
merged 1 commit into from
Feb 16, 2024
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
3 changes: 3 additions & 0 deletions src/main/java/com/homihq/db2rest/dialect/Dialect.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.homihq.db2rest.dialect;

import com.homihq.db2rest.model.DbColumn;
import com.homihq.db2rest.model.DbTable;
import schemacrawler.schema.DatabaseInfo;
import schemacrawler.schema.Table;
Expand All @@ -12,4 +13,6 @@ public interface Dialect {
boolean canSupport(DatabaseInfo databaseInfo);

void processTypes(DbTable table, List<String> insertableColumns, Map<String,Object> data);

Object processValue(String value, Class<?> type, String format);
}
8 changes: 7 additions & 1 deletion src/main/java/com/homihq/db2rest/dialect/MySQLDialect.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import schemacrawler.schema.DatabaseInfo;
import schemacrawler.schema.Table;

import java.util.List;
import java.util.Map;
Expand All @@ -25,4 +24,11 @@ public boolean canSupport(DatabaseInfo databaseInfo) {
public void processTypes(DbTable table, List<String> insertableColumns, Map<String, Object> data) {

}

@Override
public Object processValue(String value, Class<?> type, String format) {
return null;
}


}
31 changes: 29 additions & 2 deletions src/main/java/com/homihq/db2rest/dialect/PostGreSQLDialect.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package com.homihq.db2rest.dialect;


import com.fasterxml.jackson.databind.ObjectMapper;
import com.homihq.db2rest.exception.GenericDataAccessException;
import com.homihq.db2rest.model.DbColumn;
import com.homihq.db2rest.model.DbTable;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.joda.convert.StringConvert;
import org.postgresql.util.PGobject;
import org.springframework.stereotype.Component;
import schemacrawler.schema.DatabaseInfo;
Expand Down Expand Up @@ -39,7 +40,6 @@ public void processTypes(DbTable table, List<String> insertableColumns, Map<Stri
if (StringUtils.equalsAnyIgnoreCase(columnDataTypeName, "json")) {
Object v = convertToJson(value, columnDataTypeName);

log.info("V - {}", v);
data.put(columnName, v);
}

Expand All @@ -50,6 +50,33 @@ public void processTypes(DbTable table, List<String> insertableColumns, Map<Stri
}
}

@Override
public Object processValue(String value, Class<?> type, String format) {
if (String.class == type) {
return "'" + value + "'";
}
else if (Boolean.class == type || boolean.class == type) {
return Boolean.valueOf(value);

}
else if (Integer.class == type || int.class == type) {
return Integer.valueOf(value);
}
else {
return value;
}

}

private Object convertToInt(Object value) {
if(value.getClass().isAssignableFrom(Integer.class)) {
return value;
}
else{
return StringConvert.INSTANCE.convertFromString(Integer.class, value.toString());
}
}

private Object convertToJson(Object value, String columnDataTypeName) throws Exception {
PGobject pGobject = new PGobject();
pGobject.setType(columnDataTypeName);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ private void addWhere(String filter, DbTable table, DeleteContext context) {

String where = rootNode
.accept(new BaseRSQLVisitor(
dbWhere));
dbWhere, schemaManager.getDialect()));
context.setWhere(where);

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ private void processFilter(DbTable table, JoinDetail joinDetail, DbJoin join,

String where = rootNode
.accept(new BaseRSQLVisitor(
dbWhere));
dbWhere, schemaManager.getDialect()));

join.addAdditionalWhere(where);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
import com.homihq.db2rest.model.DbWhere;
import com.homihq.db2rest.rsql2.parser.RSQLParserBuilder;
import com.homihq.db2rest.rsql2.visitor.BaseRSQLVisitor;
import com.homihq.db2rest.schema.SchemaManager;
import cz.jirutka.rsql.parser.ast.Node;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.annotation.Order;
Expand All @@ -13,7 +15,11 @@
@Component
@Slf4j
@Order(8)
@RequiredArgsConstructor
public class RootWhereProcessor implements ReadProcessor {

private final SchemaManager schemaManager;

@Override
public void process(ReadContext readContext) {
if(StringUtils.isNotBlank(readContext.getFilter())) {
Expand All @@ -29,7 +35,7 @@ public void process(ReadContext readContext) {

String where = rootNode
.accept(new BaseRSQLVisitor(
dbWhere));
dbWhere, schemaManager.getDialect()));

log.info("Where - {}", where);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.homihq.db2rest.rsql2.operator.handler;

import com.homihq.db2rest.dialect.Dialect;
import com.homihq.db2rest.model.DbColumn;

import java.util.Map;
Expand All @@ -9,7 +10,7 @@ public class EndWithOperatorHandler implements OperatorHandler {
private static final String OPERATOR = " like ";

@Override
public String handle(DbColumn columnName, String value, Class type, Map<String, Object> paramMap) {
public String handle(Dialect dialect, DbColumn columnName, String value, Class type, Map<String, Object> paramMap) {
return columnName + OPERATOR + "'%" + value + "'";
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.homihq.db2rest.rsql2.operator.handler;

import com.homihq.db2rest.dialect.Dialect;
import com.homihq.db2rest.model.DbColumn;

import java.util.Map;
Expand All @@ -9,9 +10,9 @@ public class EqualToOperatorHandler implements OperatorHandler {
private static final String OPERATOR = " = ";

@Override
public String handle(DbColumn column, String value, Class type, Map<String, Object> paramMap) {
public String handle(Dialect dialect, DbColumn column, String value, Class type, Map<String, Object> paramMap) {

Object vo = parseValue(value, type);
Object vo = dialect.processValue(value, type, null);

paramMap.put(column.getAliasedNameParam(), vo);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.homihq.db2rest.rsql2.operator.handler;

import com.homihq.db2rest.dialect.Dialect;
import com.homihq.db2rest.model.DbColumn;

import java.util.Map;
Expand All @@ -9,7 +10,7 @@ public class GreaterThanEqualToOperatorHandler implements OperatorHandler {
private static final String OPERATOR = " >= ";

@Override
public String handle(DbColumn column, String value, Class type, Map<String, Object> paramMap) {
public String handle(Dialect dialect, DbColumn column, String value, Class type, Map<String, Object> paramMap) {

Object vo = parseValue(value, type);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.homihq.db2rest.rsql2.operator.handler;

import com.homihq.db2rest.dialect.Dialect;
import com.homihq.db2rest.model.DbColumn;

import java.util.Map;
Expand All @@ -9,7 +10,7 @@ public class GreaterThanOperatorHandler implements OperatorHandler {
private static final String OPERATOR = " > ";

@Override
public String handle(DbColumn column, String value, Class type, Map<String, Object> paramMap) {
public String handle(Dialect dialect, DbColumn column, String value, Class type, Map<String, Object> paramMap) {
Object vo = parseValue(value, type);

paramMap.put(column.getAliasedNameParam(), vo);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.homihq.db2rest.rsql2.operator.handler;

import com.homihq.db2rest.dialect.Dialect;
import com.homihq.db2rest.model.DbColumn;

import java.util.Arrays;
Expand All @@ -12,12 +13,12 @@ public class InOperatorHandler implements OperatorHandler {
private static final String OPERATOR = " in ";

@Override
public String handle(DbColumn columnName, String value, Class type, Map<String, Object> paramMap) {
return handle(columnName, Arrays.asList(value), type, paramMap);
public String handle(Dialect dialect, DbColumn columnName, String value, Class type, Map<String, Object> paramMap) {
return handle(dialect, columnName, Arrays.asList(value), type, paramMap);
}

@Override
public String handle(DbColumn columnName, List<String> values, Class type, Map<String, Object> paramMap) {
public String handle(Dialect dialect, DbColumn columnName, List<String> values, Class type, Map<String, Object> paramMap) {
return columnName + " in (" +
values.stream().map(value -> parseValue(value, type)).collect(Collectors.joining(",")) + ")";
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.homihq.db2rest.rsql2.operator.handler;

import com.homihq.db2rest.dialect.Dialect;
import com.homihq.db2rest.model.DbColumn;

import java.util.Map;
Expand All @@ -9,7 +10,7 @@ public class LessThanEqualToOperatorHandler implements OperatorHandler {
private static final String OPERATOR = " <= ";

@Override
public String handle(DbColumn columnName, String value, Class type, Map<String, Object> paramMap) {
public String handle(Dialect dialect, DbColumn columnName, String value, Class type, Map<String, Object> paramMap) {
return columnName + OPERATOR + parseValue(value, type);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.homihq.db2rest.rsql2.operator.handler;

import com.homihq.db2rest.dialect.Dialect;
import com.homihq.db2rest.model.DbColumn;

import java.util.Map;
Expand All @@ -9,7 +10,7 @@ public class LessThanOperatorHandler implements OperatorHandler {
private static final String OPERATOR = " < ";

@Override
public String handle(DbColumn columnName, String value, Class type, Map<String, Object> paramMap) {
public String handle(Dialect dialect, DbColumn columnName, String value, Class type, Map<String, Object> paramMap) {
return columnName + OPERATOR + parseValue(value, type);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.homihq.db2rest.rsql2.operator.handler;

import com.homihq.db2rest.dialect.Dialect;
import com.homihq.db2rest.model.DbColumn;

import java.util.Map;
Expand All @@ -9,7 +10,7 @@ public class LikeOperatorHandler implements OperatorHandler {
private static final String OPERATOR = " like ";

@Override
public String handle(DbColumn columnName, String value, Class type, Map<String, Object> paramMap) {
public String handle(Dialect dialect, DbColumn columnName, String value, Class type, Map<String, Object> paramMap) {
return columnName + OPERATOR + "'%" + value + "%'";
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.homihq.db2rest.rsql2.operator.handler;

import com.homihq.db2rest.dialect.Dialect;
import com.homihq.db2rest.model.DbColumn;

import java.util.Map;
Expand All @@ -9,7 +10,7 @@ public class NotEqualToOperatorHandler implements OperatorHandler {
private static final String OPERATOR = " != ";

@Override
public String handle(DbColumn columnName, String value, Class type, Map<String, Object> paramMap) {
public String handle(Dialect dialect, DbColumn columnName, String value, Class type, Map<String, Object> paramMap) {
return columnName + OPERATOR + parseValue(value, type);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.homihq.db2rest.rsql2.operator.handler;

import com.homihq.db2rest.dialect.Dialect;
import com.homihq.db2rest.model.DbColumn;

import java.util.Arrays;
Expand All @@ -12,12 +13,12 @@ public class NotInOperatorHandler implements OperatorHandler {
private static final String OPERATOR = " not in ";

@Override
public String handle(DbColumn columnName, String value, Class type, Map<String, Object> paramMap) {
return handle(columnName, Arrays.asList(value), type, paramMap);
public String handle(Dialect dialect, DbColumn columnName, String value, Class type, Map<String, Object> paramMap) {
return handle(dialect, columnName, Arrays.asList(value), type, paramMap);
}

@Override
public String handle(DbColumn columnName, List<String> values, Class type, Map<String, Object> paramMap) {
public String handle(Dialect dialect, DbColumn columnName, List<String> values, Class type, Map<String, Object> paramMap) {
return columnName + " not in (" +
values.stream().map(value -> parseValue(value, type)).collect(Collectors.joining(",")) + ")";
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.homihq.db2rest.rsql2.operator.handler;

import com.homihq.db2rest.dialect.Dialect;
import com.homihq.db2rest.model.DbColumn;

import java.util.List;
Expand All @@ -9,10 +10,10 @@ public interface OperatorHandler {

String PREFIX = ":";

String handle(DbColumn column, String value, Class type, Map<String, Object> paramMap);
String handle(Dialect dialect, DbColumn column, String value, Class type, Map<String, Object> paramMap);

default String handle(DbColumn column, List<String> value, Class type, Map<String, Object> paramMap) {
return handle(column, value.get(0), type, paramMap);
default String handle(Dialect dialect, DbColumn column, List<String> value, Class type, Map<String, Object> paramMap) {
return handle(dialect,column, value.get(0), type, paramMap);
}

default String parseValue(String value, Class type) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.homihq.db2rest.rsql2.operator.handler;

import com.homihq.db2rest.dialect.Dialect;
import com.homihq.db2rest.model.DbColumn;

import java.util.Map;
Expand All @@ -9,7 +10,7 @@ public class StartWithOperatorHandler implements OperatorHandler {
private static final String OPERATOR = " like ";

@Override
public String handle(DbColumn columnName, String value, Class type, Map<String, Object> paramMap) {
public String handle(Dialect dialect, DbColumn columnName, String value, Class type, Map<String, Object> paramMap) {
return columnName + OPERATOR + "'" + value + "%'";
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.homihq.db2rest.rsql2.visitor;

import com.homihq.db2rest.dialect.Dialect;
import com.homihq.db2rest.model.DbColumn;
import com.homihq.db2rest.model.DbWhere;
import com.homihq.db2rest.rsql2.operator.handler.OperatorHandler;
Expand All @@ -19,6 +20,7 @@
public class BaseRSQLVisitor implements RSQLVisitor<String, Object> {

private final DbWhere dbWhere;
private final Dialect dialect;

@Override
public String visit(AndNode andNode, Object o) {
Expand All @@ -37,8 +39,7 @@ public String visit(OrNode orNode, Object o) {
public String visit(ComparisonNode node, Object o) {
ComparisonOperator op = node.getOperator();

log.info("Handling column - {}", node.getSelector());

log.debug("Handling column - {}", node.getSelector());

DbColumn dbColumn = this.dbWhere.table().buildColumn(node.getSelector());

Expand All @@ -51,10 +52,10 @@ public String visit(ComparisonNode node, Object o) {
}

if (op.isMultiValue()) {
return operatorHandler.handle(dbColumn, node.getArguments(), type, this.dbWhere.paramMap());
return operatorHandler.handle(dialect, dbColumn, node.getArguments(), type, this.dbWhere.paramMap());
}
else {
return operatorHandler.handle(dbColumn, node.getArguments().get(0), type, this.dbWhere.paramMap());
return operatorHandler.handle(dialect,dbColumn, node.getArguments().get(0), type, this.dbWhere.paramMap());
}

}
Expand Down
Loading