Skip to content

Commit

Permalink
かっこ付き項目について一部をエスケープ解除するようにする。
Browse files Browse the repository at this point in the history
  • Loading branch information
igapyon committed Mar 17, 2021
1 parent db946f4 commit 7d01546
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 23 deletions.
4 changes: 2 additions & 2 deletions src/main/java/jp/oiyokan/OiyokanCsdlEntityContainer.java
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,9 @@ public void ensureBuild() {
if (getEntitySets().size() == 0) {
// EntitySet の初期セットを実施。
getEntitySets().add(new OiyokanCsdlEntitySet(this, "ODataAppInfos", "ODataAppInfo",
OiyokanCsdlEntitySet.DatabaseType.H2, "ODataAppInfos", null));
OiyokanCsdlEntitySet.DatabaseType.H2, "ODataAppInfos", "ODataAppInfos"));
getEntitySets().add(new OiyokanCsdlEntitySet(this, "MyProducts", "MyProduct",
OiyokanCsdlEntitySet.DatabaseType.H2, "MyProducts", null));
OiyokanCsdlEntitySet.DatabaseType.H2, "MyProducts", "MyProducts"));
}
}

Expand Down
22 changes: 11 additions & 11 deletions src/main/java/jp/oiyokan/OiyokanCsdlEntitySet.java
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ public CsdlEntityType getEntityType() {
/**
* データベース上のテーブル名.
*/
private String dbTableName = null;
private String dbTableNameLocal = null;

/**
* データベース上のテーブル名.
Expand All @@ -91,15 +91,15 @@ public CsdlEntityType getEntityType() {
* @param entitySetName MyProducts 相当.
* @param entityName MyProduct 相当.
* @param dbType データベースタイプ.
* @param dbTableName データベース上のテーブル名.
* @param dbTableNameTarget ターゲットのデータベース上のテーブル名. 通常は null指定.
* @param dbTableNameLocal ローカルのデータベース上のテーブル名.
* @param dbTableNameTarget ターゲットのデータベース上のテーブル名. 通常は dbTableNameLocalと一致.
*/
public OiyokanCsdlEntitySet(OiyokanCsdlEntityContainer containerInfo, String entitySetName, String entityName,
DatabaseType dbType, String dbTableName, String dbTableNameTarget) {
DatabaseType dbType, String dbTableNameLocal, String dbTableNameTarget) {
this.csdlEntityContainer = containerInfo;
this.entityName = entityName;
this.dbType = dbType;
this.dbTableName = dbTableName;
this.dbTableNameLocal = dbTableNameLocal;
this.dbTableNameTarget = dbTableNameTarget;

this.setName(entitySetName);
Expand All @@ -125,18 +125,18 @@ public FullQualifiedName getEntityNameFqnIyo() {
}

/**
* 独自に追加した項目
* ローカル上のテーブル名
*
* @return DBテーブル名。
* @return ローカルのDBテーブル名.
*/
public String getDbTableNameIyo() {
return dbTableName;
public String getDbTableNameLocalIyo() {
return dbTableNameLocal;
}

/**
* 独自に追加した項目
* ターゲット上のテーブル名.
*
* @return ターゲットのDBテーブル名。指定がある場合は実データ取得の際にはこちらを利用.
* @return ターゲットのDBテーブル名.
*/
public String getDbTableNameTargetIyo() {
return dbTableNameTarget;
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/jp/oiyokan/basic/BasicDbUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
import org.apache.olingo.commons.api.edm.provider.CsdlProperty;

/**
*Oiyokan 関連のDBまわりユーティリティクラス.
* Oiyokan 関連のDBまわりユーティリティクラス.
*/
public class BasicDbUtil {
private BasicDbUtil() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ public CsdlEntityType getEntityType() {
// SELECT * について、この箇所のみ記述を許容。
// DatabaseMetaData では取りづらい情報があるためこちらを採用。
try (PreparedStatement stmt = conn
.prepareStatement("SELECT * FROM " + entitySet.getDbTableNameIyo() + " LIMIT 1")) {
.prepareStatement("SELECT * FROM " + entitySet.getDbTableNameLocalIyo() + " LIMIT 1")) {
ResultSetMetaData rsmeta = stmt.getMetaData();
final int columnCount = rsmeta.getColumnCount();
for (int column = 1; column <= columnCount; column++) {
Expand All @@ -85,7 +85,7 @@ public CsdlEntityType getEntityType() {
// テーブルのキー情報
final List<CsdlPropertyRef> keyRefList = new ArrayList<>();
final DatabaseMetaData dbmeta = conn.getMetaData();
final ResultSet rsKey = dbmeta.getPrimaryKeys(null, null, entitySet.getDbTableNameIyo());
final ResultSet rsKey = dbmeta.getPrimaryKeys(null, null, entitySet.getDbTableNameLocalIyo());
for (; rsKey.next();) {
// キー名は利用しない: rsKey.getString("PK_NAME");
String colName = rsKey.getString("COLUMN_NAME");
Expand Down
26 changes: 19 additions & 7 deletions src/main/java/jp/oiyokan/h2/sql/TinyH2SqlBuilder.java
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public TinySqlBuildInfo getSqlInfo() {
* @param uriInfo URI情報.
*/
public void getSelectCountQuery(UriInfo uriInfo) {
sqlInfo.getSqlBuilder().append("SELECT COUNT(*) FROM " + sqlInfo.getEntitySet().getDbTableNameIyo());
sqlInfo.getSqlBuilder().append("SELECT COUNT(*) FROM " + sqlInfo.getEntitySet().getDbTableNameTargetIyo());
if (uriInfo.getFilterOption() != null) {
FilterOptionImpl filterOpt = (FilterOptionImpl) uriInfo.getFilterOption();
sqlInfo.getSqlBuilder().append(" WHERE ");
Expand Down Expand Up @@ -92,7 +92,7 @@ public void getSelectQuery(UriInfo uriInfo) {
for (SelectItem item : uriInfo.getSelectOption().getSelectItems()) {
for (UriResource res : item.getResourcePath().getUriResourceParts()) {
sqlInfo.getSqlBuilder().append(itemCount++ == 0 ? "" : ",");
sqlInfo.getSqlBuilder().append("[" + res.toString() + "]");
sqlInfo.getSqlBuilder().append(unescapeKakkoFieldName(res.toString()));
for (int index = 0; index < keyTarget.size(); index++) {
if (keyTarget.get(index).equals(res.toString())) {
keyTarget.remove(index);
Expand All @@ -104,12 +104,12 @@ public void getSelectQuery(UriInfo uriInfo) {
for (int index = 0; index < keyTarget.size(); index++) {
// レコードを一位に表すID項目が必須。検索対象にない場合は追加.
sqlInfo.getSqlBuilder().append(itemCount++ == 0 ? "" : ",");
sqlInfo.getSqlBuilder().append("[" + keyTarget.get(index) + "]");
sqlInfo.getSqlBuilder().append(unescapeKakkoFieldName(keyTarget.get(index)));
}
}

// 取得元のテーブル.
sqlInfo.getSqlBuilder().append(" FROM " + sqlInfo.getEntitySet().getDbTableNameIyo());
sqlInfo.getSqlBuilder().append(" FROM " + sqlInfo.getEntitySet().getDbTableNameTargetIyo());

// uriInfo.getCountOption は明示的には記載しない.
// 現状の実装では指定があろうがなかろうが件数はカウントする実装となっている.
Expand All @@ -131,9 +131,8 @@ public void getSelectQuery(UriInfo uriInfo) {
sqlInfo.getSqlBuilder().append(",");
}

// 項目名を SQL Serverクオート付きで指定.
// SQL Server 互換モードで h2 を動作させているから可能になる指定方法.
sqlInfo.getSqlBuilder().append((MemberImpl) orderByItem.getExpression()).toString();
sqlInfo.getSqlBuilder()
.append(unescapeKakkoFieldName(((MemberImpl) orderByItem.getExpression()).toString()));

if (orderByItem.isDescending()) {
sqlInfo.getSqlBuilder().append(" DESC");
Expand All @@ -151,4 +150,17 @@ public void getSelectQuery(UriInfo uriInfo) {
sqlInfo.getSqlBuilder().append(uriInfo.getSkipOption().getValue());
}
}

/**
* かっこつき項目名のかっこを除去.
*
* @param escapedFieldName かっこ付き項目名.
* @return かっこなし項目名.
*/
public static String unescapeKakkoFieldName(String escapedFieldName) {
String normalName = escapedFieldName;
normalName = normalName.replaceAll("^\\[", "");
normalName = normalName.replaceAll("\\]$", "");
return normalName;
}
}

0 comments on commit 7d01546

Please sign in to comment.