From 8abd4290291707523e6cb2fb26b43e82bf9a1fff Mon Sep 17 00:00:00 2001 From: "yohei.yamana" Date: Sun, 6 Oct 2019 03:14:54 +0900 Subject: [PATCH 1/3] to use default parameter, change name of methods. --- .../sqlformatter/scala/SqlFormatter.scala | 16 ++--- .../sqlformatter/scala/SqlFormatter.scala | 17 +++--- readme.md | 60 +++++++++++++++++++ .../scala/AbstractSqlFormatter.scala | 27 +++------ .../sqlformatter/scala/SQLLanguage.scala | 9 --- .../sqlformatter/scala/SqlDialect.scala | 9 +++ .../sqlformatter/scala/BaseTest.scala | 6 +- 7 files changed, 95 insertions(+), 49 deletions(-) delete mode 100644 shared/src/main/scala/com/github/vertical_blank/sqlformatter/scala/SQLLanguage.scala create mode 100644 shared/src/main/scala/com/github/vertical_blank/sqlformatter/scala/SqlDialect.scala diff --git a/js/src/main/scala/com/github/vertical_blank/sqlformatter/scala/SqlFormatter.scala b/js/src/main/scala/com/github/vertical_blank/sqlformatter/scala/SqlFormatter.scala index cd9ddd2..13f7315 100644 --- a/js/src/main/scala/com/github/vertical_blank/sqlformatter/scala/SqlFormatter.scala +++ b/js/src/main/scala/com/github/vertical_blank/sqlformatter/scala/SqlFormatter.scala @@ -12,19 +12,19 @@ private[scala] object Facade extends js.Object { object SqlFormatter extends AbstractSqlFormatter { def format(sql: String, - language: SQLLanguage, + dialect: SqlDialect, indent: String): String = - Facade.format(sql, js.Dictionary("language" -> language.name, "indent" -> indent)) + Facade.format(sql, js.Dictionary("language" -> dialect.name, "indent" -> indent)) - def format(sql: String, + def formatWithNamedParams(sql: String, params: Map[String, Any], - language: SQLLanguage, + dialect: SqlDialect, indent: String): String = - Facade.format(sql, js.Dictionary("language" -> language.name, "indent" -> indent, "params" -> params.toJSDictionary)) + Facade.format(sql, js.Dictionary("language" -> dialect.name, "indent" -> indent, "params" -> params.toJSDictionary)) - def format(sql: String, + def formatWithIndexedParams(sql: String, params: Seq[Any], - language: SQLLanguage, + dialect: SqlDialect, indent: String): String = - Facade.format(sql, js.Dictionary("language" -> language.name, "indent" -> indent, "params" -> params.toJSArray)) + Facade.format(sql, js.Dictionary("language" -> dialect.name, "indent" -> indent, "params" -> params.toJSArray)) } diff --git a/jvm/src/main/scala/com/github/vertical_blank/sqlformatter/scala/SqlFormatter.scala b/jvm/src/main/scala/com/github/vertical_blank/sqlformatter/scala/SqlFormatter.scala index 9e6a5af..782b33d 100644 --- a/jvm/src/main/scala/com/github/vertical_blank/sqlformatter/scala/SqlFormatter.scala +++ b/jvm/src/main/scala/com/github/vertical_blank/sqlformatter/scala/SqlFormatter.scala @@ -5,17 +5,16 @@ import com.github.vertical_blank.sqlformatter.{SqlFormatter => JSqlFormatter} object SqlFormatter extends AbstractSqlFormatter { def format(sql: String, - language: SQLLanguage, - indent: String): String = JSqlFormatter.of(language.name).format(sql, indent) + dialect: SqlDialect, + indent: String): String = JSqlFormatter.of(dialect.name).format(sql, indent) - - def format(sql: String, + def formatWithNamedParams(sql: String, params: Map[String, Any], - language: SQLLanguage, - indent: String): String = JSqlFormatter.of(language.name).format(sql, indent, params.asJava) + dialect: SqlDialect, + indent: String): String = JSqlFormatter.of(dialect.name).format(sql, indent, params.asJava) - def format(sql: String, + def formatWithIndexedParams(sql: String, params: Seq[Any], - language: SQLLanguage, - indent: String): String = JSqlFormatter.of(language.name).format(sql, indent, params.asJava) + dialect: SqlDialect, + indent: String): String = JSqlFormatter.of(dialect.name).format(sql, indent, params.asJava) } diff --git a/readme.md b/readme.md index d13c9d6..a8fbc41 100644 --- a/readme.md +++ b/readme.md @@ -25,3 +25,63 @@ SELECT FROM table1 ``` + +### Dialect + +You can pass dialect : + +```scala +SqlFormatter.format( + "SELECT *", + dialect = SqlDialect.CouchbaseN1QL) +``` + +Currently just four SQL dialects are supported: + +- StandardSQL - [Standard SQL](https://en.wikipedia.org/wiki/SQL:2011) +- CouchbaseN1QL - [Couchbase N1QL](http://www.couchbase.com/n1ql) +- DB2 - [IBM DB2](https://www.ibm.com/analytics/us/en/technology/db2/) +- PLSQL - [Oracle PL/SQL](http://www.oracle.com/technetwork/database/features/plsql/index.html) + +### Format + +Defaults to two spaces. +You can pass indent string to `format` : + +```scala +SqlFormatter.format("SELECT * FROM table1", indent = " ") +``` + +This will output: + +```sql +SELECT + * +FROM + table1 +``` + +### Placeholders replacement + +You can pass `Seq` to `formatWithIndexedParams`, or `Map` to `formatWithNamedParams` : + +```scala +// Named placeholders +SqlFormatter.formatWithNamedParams("SELECT * FROM tbl WHERE foo = @foo", params = Map("foo" -> "'bar'")) + +// Indexed placeholders +SqlFormatter.formatWithIndexedParams("SELECT * FROM tbl WHERE foo = ?", params = Seq("'bar'")) +``` + +Both result in: + +```sql +SELECT + * +FROM + tbl +WHERE + foo = 'bar' +``` + +Same as the `format` method, `formatWithNamedParams` and `formatWithIndexedParams` accept `dialect` and `indent` parameters. diff --git a/shared/src/main/scala/com/github/vertical_blank/sqlformatter/scala/AbstractSqlFormatter.scala b/shared/src/main/scala/com/github/vertical_blank/sqlformatter/scala/AbstractSqlFormatter.scala index f94a5d2..3154831 100644 --- a/shared/src/main/scala/com/github/vertical_blank/sqlformatter/scala/AbstractSqlFormatter.scala +++ b/shared/src/main/scala/com/github/vertical_blank/sqlformatter/scala/AbstractSqlFormatter.scala @@ -1,29 +1,18 @@ package com.github.vertical_blank.sqlformatter.scala trait AbstractSqlFormatter { - final def format(sql: String): String = - format(sql, SQLLanguage.StandardSQL, indent = " ") - - final def format(sql: String, indent: String): String = - format(sql, SQLLanguage.StandardSQL, indent = indent) - - final def format(sql: String, params: Map[String, Any]): String = - format(sql, params, SQLLanguage.StandardSQL, indent = " ") - - final def format(sql: String, params: Seq[Any]): String = - format(sql, params, SQLLanguage.StandardSQL, indent = " ") def format(sql: String, - language: SQLLanguage, - indent: String): String + dialect: SqlDialect = SqlDialect.StandardSQL, + indent: String = " "): String - def format(sql: String, + def formatWithNamedParams(sql: String, params: Map[String, Any], - language: SQLLanguage, - indent: String): String + dialect: SqlDialect = SqlDialect.StandardSQL, + indent: String = " "): String - def format(sql: String, + def formatWithIndexedParams(sql: String, params: Seq[Any], - language: SQLLanguage , - indent: String): String + dialect: SqlDialect = SqlDialect.StandardSQL, + indent: String = " "): String } diff --git a/shared/src/main/scala/com/github/vertical_blank/sqlformatter/scala/SQLLanguage.scala b/shared/src/main/scala/com/github/vertical_blank/sqlformatter/scala/SQLLanguage.scala deleted file mode 100644 index c9e8c74..0000000 --- a/shared/src/main/scala/com/github/vertical_blank/sqlformatter/scala/SQLLanguage.scala +++ /dev/null @@ -1,9 +0,0 @@ -package com.github.vertical_blank.sqlformatter.scala - -sealed abstract class SQLLanguage(val name: String) extends Product with Serializable -object SQLLanguage { - case object StandardSQL extends SQLLanguage("sql") - case object CouchbaseN1QL extends SQLLanguage("n1ql") - case object DB2 extends SQLLanguage("db2") - case object PLSQL extends SQLLanguage("pl/sql") -} diff --git a/shared/src/main/scala/com/github/vertical_blank/sqlformatter/scala/SqlDialect.scala b/shared/src/main/scala/com/github/vertical_blank/sqlformatter/scala/SqlDialect.scala new file mode 100644 index 0000000..44e00cc --- /dev/null +++ b/shared/src/main/scala/com/github/vertical_blank/sqlformatter/scala/SqlDialect.scala @@ -0,0 +1,9 @@ +package com.github.vertical_blank.sqlformatter.scala + +sealed abstract class SqlDialect(val name: String) extends Product with Serializable +object SqlDialect { + case object StandardSQL extends SqlDialect("sql") + case object CouchbaseN1QL extends SqlDialect("n1ql") + case object DB2 extends SqlDialect("db2") + case object PLSQL extends SqlDialect("pl/sql") +} diff --git a/shared/src/test/scala/com/github/vertical_blank/sqlformatter/scala/BaseTest.scala b/shared/src/test/scala/com/github/vertical_blank/sqlformatter/scala/BaseTest.scala index 04a79e0..0a5033e 100644 --- a/shared/src/test/scala/com/github/vertical_blank/sqlformatter/scala/BaseTest.scala +++ b/shared/src/test/scala/com/github/vertical_blank/sqlformatter/scala/BaseTest.scala @@ -38,8 +38,6 @@ abstract class BaseTest(sqlFormatter: AbstractSqlFormatter) extends FunSuite { } test("withNamedParams") { - val namedParams = Map("foo" -> "'bar'") - val formatted = """|SELECT | * |FROM @@ -47,7 +45,7 @@ abstract class BaseTest(sqlFormatter: AbstractSqlFormatter) extends FunSuite { |WHERE | foo = 'bar'""".stripMargin - assert(sqlFormatter.format("SELECT * FROM table WHERE foo = @foo", namedParams) == formatted) + assert(sqlFormatter.formatWithNamedParams("SELECT * FROM table WHERE foo = @foo", params = Map("foo" -> "'bar'")) == formatted) } test("withIndexedParams") { @@ -59,6 +57,6 @@ abstract class BaseTest(sqlFormatter: AbstractSqlFormatter) extends FunSuite { |WHERE | foo = 'bar'""".stripMargin - assert(sqlFormatter.format("SELECT * FROM table WHERE foo = ?", Seq("'bar'")) == formatted) + assert(sqlFormatter.formatWithIndexedParams("SELECT * FROM table WHERE foo = ?", params = Seq("'bar'")) == formatted) } } From 6c226a116f5cd46a6169b0ffc789453f32ca19f8 Mon Sep 17 00:00:00 2001 From: "yohei.yamana" Date: Mon, 7 Oct 2019 14:17:08 +0900 Subject: [PATCH 2/3] introduce FormatConfig class --- .../sqlformatter/scala/SqlFormatter.scala | 15 ++++++--------- .../sqlformatter/scala/SqlFormatter.scala | 9 +++------ .../sqlformatter/scala/AbstractSqlFormatter.scala | 10 +++------- .../sqlformatter/scala/FormatConfig.scala | 5 +++++ .../sqlformatter/scala/BaseTest.scala | 2 +- 5 files changed, 18 insertions(+), 23 deletions(-) create mode 100644 shared/src/main/scala/com/github/vertical_blank/sqlformatter/scala/FormatConfig.scala diff --git a/js/src/main/scala/com/github/vertical_blank/sqlformatter/scala/SqlFormatter.scala b/js/src/main/scala/com/github/vertical_blank/sqlformatter/scala/SqlFormatter.scala index 13f7315..faa6be8 100644 --- a/js/src/main/scala/com/github/vertical_blank/sqlformatter/scala/SqlFormatter.scala +++ b/js/src/main/scala/com/github/vertical_blank/sqlformatter/scala/SqlFormatter.scala @@ -12,19 +12,16 @@ private[scala] object Facade extends js.Object { object SqlFormatter extends AbstractSqlFormatter { def format(sql: String, - dialect: SqlDialect, - indent: String): String = - Facade.format(sql, js.Dictionary("language" -> dialect.name, "indent" -> indent)) + config: FormatConfig): String = + Facade.format(sql, js.Dictionary("language" -> config.dialect.name, "indent" -> config.indent)) def formatWithNamedParams(sql: String, params: Map[String, Any], - dialect: SqlDialect, - indent: String): String = - Facade.format(sql, js.Dictionary("language" -> dialect.name, "indent" -> indent, "params" -> params.toJSDictionary)) + config: FormatConfig): String = + Facade.format(sql, js.Dictionary("language" -> config.dialect.name, "indent" -> config.indent, "params" -> params.toJSDictionary)) def formatWithIndexedParams(sql: String, params: Seq[Any], - dialect: SqlDialect, - indent: String): String = - Facade.format(sql, js.Dictionary("language" -> dialect.name, "indent" -> indent, "params" -> params.toJSArray)) + config: FormatConfig): String = + Facade.format(sql, js.Dictionary("language" -> config.dialect.name, "indent" -> config.indent, "params" -> params.toJSArray)) } diff --git a/jvm/src/main/scala/com/github/vertical_blank/sqlformatter/scala/SqlFormatter.scala b/jvm/src/main/scala/com/github/vertical_blank/sqlformatter/scala/SqlFormatter.scala index 782b33d..b5f6a9a 100644 --- a/jvm/src/main/scala/com/github/vertical_blank/sqlformatter/scala/SqlFormatter.scala +++ b/jvm/src/main/scala/com/github/vertical_blank/sqlformatter/scala/SqlFormatter.scala @@ -5,16 +5,13 @@ import com.github.vertical_blank.sqlformatter.{SqlFormatter => JSqlFormatter} object SqlFormatter extends AbstractSqlFormatter { def format(sql: String, - dialect: SqlDialect, - indent: String): String = JSqlFormatter.of(dialect.name).format(sql, indent) + config: FormatConfig): String = JSqlFormatter.of(config.dialect.name).format(sql, config.indent) def formatWithNamedParams(sql: String, params: Map[String, Any], - dialect: SqlDialect, - indent: String): String = JSqlFormatter.of(dialect.name).format(sql, indent, params.asJava) + config: FormatConfig): String = JSqlFormatter.of(config.dialect.name).format(sql, config.indent, params.asJava) def formatWithIndexedParams(sql: String, params: Seq[Any], - dialect: SqlDialect, - indent: String): String = JSqlFormatter.of(dialect.name).format(sql, indent, params.asJava) + config: FormatConfig): String = JSqlFormatter.of(config.dialect.name).format(sql, config.indent, params.asJava) } diff --git a/shared/src/main/scala/com/github/vertical_blank/sqlformatter/scala/AbstractSqlFormatter.scala b/shared/src/main/scala/com/github/vertical_blank/sqlformatter/scala/AbstractSqlFormatter.scala index 3154831..f3bdf04 100644 --- a/shared/src/main/scala/com/github/vertical_blank/sqlformatter/scala/AbstractSqlFormatter.scala +++ b/shared/src/main/scala/com/github/vertical_blank/sqlformatter/scala/AbstractSqlFormatter.scala @@ -2,17 +2,13 @@ package com.github.vertical_blank.sqlformatter.scala trait AbstractSqlFormatter { - def format(sql: String, - dialect: SqlDialect = SqlDialect.StandardSQL, - indent: String = " "): String + def format(sql: String, config: FormatConfig = FormatConfig()): String def formatWithNamedParams(sql: String, params: Map[String, Any], - dialect: SqlDialect = SqlDialect.StandardSQL, - indent: String = " "): String + config: FormatConfig = FormatConfig()): String def formatWithIndexedParams(sql: String, params: Seq[Any], - dialect: SqlDialect = SqlDialect.StandardSQL, - indent: String = " "): String + config: FormatConfig = FormatConfig()): String } diff --git a/shared/src/main/scala/com/github/vertical_blank/sqlformatter/scala/FormatConfig.scala b/shared/src/main/scala/com/github/vertical_blank/sqlformatter/scala/FormatConfig.scala new file mode 100644 index 0000000..4877675 --- /dev/null +++ b/shared/src/main/scala/com/github/vertical_blank/sqlformatter/scala/FormatConfig.scala @@ -0,0 +1,5 @@ +package com.github.vertical_blank.sqlformatter.scala + +case class FormatConfig( + dialect: SqlDialect = SqlDialect.StandardSQL, + indent: String = " ") diff --git a/shared/src/test/scala/com/github/vertical_blank/sqlformatter/scala/BaseTest.scala b/shared/src/test/scala/com/github/vertical_blank/sqlformatter/scala/BaseTest.scala index 0a5033e..423d2f4 100644 --- a/shared/src/test/scala/com/github/vertical_blank/sqlformatter/scala/BaseTest.scala +++ b/shared/src/test/scala/com/github/vertical_blank/sqlformatter/scala/BaseTest.scala @@ -34,7 +34,7 @@ abstract class BaseTest(sqlFormatter: AbstractSqlFormatter) extends FunSuite { | table""".stripMargin assert(sqlFormatter - .format("SELECT foo, bar, CASE baz WHEN 'one' THEN 1 WHEN 'two' THEN 2 ELSE 3 END FROM table", indent = " ") == formatted) + .format("SELECT foo, bar, CASE baz WHEN 'one' THEN 1 WHEN 'two' THEN 2 ELSE 3 END FROM table", FormatConfig(indent = " ")) == formatted) } test("withNamedParams") { From 71398d472f2b73156d3e270063c7cbfd02c0c40b Mon Sep 17 00:00:00 2001 From: "yohei.yamana" Date: Mon, 7 Oct 2019 14:42:41 +0900 Subject: [PATCH 3/3] update readme --- readme.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/readme.md b/readme.md index a8fbc41..d684870 100644 --- a/readme.md +++ b/readme.md @@ -28,12 +28,12 @@ FROM ### Dialect -You can pass dialect : +You can pass dialect with `FormatConfig` : ```scala SqlFormatter.format( "SELECT *", - dialect = SqlDialect.CouchbaseN1QL) + FormatConfig(dialect = SqlDialect.CouchbaseN1QL)) ``` Currently just four SQL dialects are supported: @@ -46,10 +46,12 @@ Currently just four SQL dialects are supported: ### Format Defaults to two spaces. -You can pass indent string to `format` : +You can pass indent string with `FormatConfig` to `format` : ```scala -SqlFormatter.format("SELECT * FROM table1", indent = " ") +SqlFormatter.format( + "SELECT * FROM table1", + FormatConfig(indent = " ")) ``` This will output: