From 73b7e4009699244f462ede31fe2ce8d11b0bd641 Mon Sep 17 00:00:00 2001 From: QuadStingray Date: Fri, 31 Jan 2025 08:24:28 +0100 Subject: [PATCH] feat: more converter for net.sf.jsqlparser expressions --- .../mongodb/lucene/LuceneQueryConverter.scala | 22 ++++++++++++++----- .../mongodb/sql/MongoSqlQueryHolder.scala | 22 +++++++++---------- .../mongodb/jdbc/LiquibaseJdbcSpec.scala | 2 +- 3 files changed, 28 insertions(+), 18 deletions(-) diff --git a/src/main/scala/dev/mongocamp/driver/mongodb/lucene/LuceneQueryConverter.scala b/src/main/scala/dev/mongocamp/driver/mongodb/lucene/LuceneQueryConverter.scala index 091e0b09..166e2d2e 100644 --- a/src/main/scala/dev/mongocamp/driver/mongodb/lucene/LuceneQueryConverter.scala +++ b/src/main/scala/dev/mongocamp/driver/mongodb/lucene/LuceneQueryConverter.scala @@ -186,7 +186,15 @@ object LuceneQueryConverter extends LazyLogging { } private def appendPhraseQueryToSearchMap(negated: Boolean, searchMapResponse: mutable.Map[String, Any], query: PhraseQuery): Unit = { - val listOfSearches = query.getTerms.map(term => Map(term.field() -> generateRegexQuery(s"(.*?)${checkAndConvertValue(term.text())}(.*?)", "i"))).toList + val listOfSearches = query.getTerms.map(term => { + val convertedValue = checkAndConvertValue(term.text()) + if (convertedValue.isInstanceOf[String]) { + Map(term.field() -> generateRegexQuery(s"(.*?)$convertedValue(.*?)", "i")) + } + else { + Map(term.field() -> Map("$eq" -> convertedValue)) + } + }).toList if (negated) { searchMapResponse.put("$nor", listOfSearches) } @@ -223,10 +231,12 @@ object LuceneQueryConverter extends LazyLogging { val parsedOptions: List[Date] = Try(new DateTime(s).toDate).toOption.toList ++ datePatters.flatMap(pattern => { try { val formatter = new SimpleDateFormat(pattern) - Option(formatter.parse(s)) + val r = Option(formatter.parse(s)) + logger.info(s"parsed date $s with pattern $pattern to $r") + r } catch { - case _: Exception => + case e: Exception => None } }).distinct @@ -241,9 +251,9 @@ object LuceneQueryConverter extends LazyLogging { } private lazy val datePatters = List( - "yyyyMMdd'T'HHmmssSSSZZ", - "yyyyMMdd'T'HHmmssZZ", - "yyyyMMdd'T'HHmmZZ", + "yyyyMMdd'T'HHmmssSSS'Z'", + "yyyyMMdd'T'HHmmssZ", + "yyyyMMdd'T'HHmmZ", "yyyyMMdd'T'HHmmssSSS", "yyyyMMdd'T'HHmmss", "yyyyMMdd'T'HHmm", diff --git a/src/main/scala/dev/mongocamp/driver/mongodb/sql/MongoSqlQueryHolder.scala b/src/main/scala/dev/mongocamp/driver/mongodb/sql/MongoSqlQueryHolder.scala index bd4ef099..e9988537 100644 --- a/src/main/scala/dev/mongocamp/driver/mongodb/sql/MongoSqlQueryHolder.scala +++ b/src/main/scala/dev/mongocamp/driver/mongodb/sql/MongoSqlQueryHolder.scala @@ -5,16 +5,13 @@ import dev.mongocamp.driver.mongodb._ import dev.mongocamp.driver.mongodb.database.DatabaseProvider import dev.mongocamp.driver.mongodb.database.DatabaseProvider.CollectionSeparator import dev.mongocamp.driver.mongodb.exception.SqlCommandNotSupportedException -import dev.mongocamp.driver.mongodb.json._ import dev.mongocamp.driver.mongodb.sql.SQLCommandType.SQLCommandType -import io.circe.generic.auto._ -import io.circe.syntax._ -import net.sf.jsqlparser.expression.operators.conditional.{ AndExpression, OrExpression } +import net.sf.jsqlparser.expression.operators.arithmetic.Concat +import net.sf.jsqlparser.expression.operators.conditional.{AndExpression, OrExpression} import net.sf.jsqlparser.expression.operators.relational._ -import net.sf.jsqlparser.expression.{ ArrayConstructor, Expression, NotExpression, SignedExpression } -import net.sf.jsqlparser.parser.{ CCJSqlParser, StreamProvider } -import net.sf.jsqlparser.schema.{ Column, Table } -import net.sf.jsqlparser.statement.{ ShowStatement, Statement } +import net.sf.jsqlparser.expression.{ArrayConstructor, Expression, NotExpression, SignedExpression} +import net.sf.jsqlparser.parser.{CCJSqlParser, StreamProvider} +import net.sf.jsqlparser.schema.{Column, Table} import net.sf.jsqlparser.statement.alter.Alter import net.sf.jsqlparser.statement.create.index.CreateIndex import net.sf.jsqlparser.statement.create.table.CreateTable @@ -22,14 +19,15 @@ import net.sf.jsqlparser.statement.delete.Delete import net.sf.jsqlparser.statement.drop.Drop import net.sf.jsqlparser.statement.execute.Execute import net.sf.jsqlparser.statement.insert.Insert -import net.sf.jsqlparser.statement.select.{ FromItem, PlainSelect, Select, SelectItem } +import net.sf.jsqlparser.statement.select.{FromItem, PlainSelect, Select, SelectItem} import net.sf.jsqlparser.statement.show.ShowTablesStatement import net.sf.jsqlparser.statement.truncate.Truncate import net.sf.jsqlparser.statement.update.Update +import net.sf.jsqlparser.statement.{ShowStatement, Statement} import org.bson.conversions.Bson import org.mongodb.scala.model.IndexOptions -import org.mongodb.scala.model.Sorts.{ ascending, metaTextScore } -import org.mongodb.scala.{ Document, Observable, SingleObservable } +import org.mongodb.scala.model.Sorts.ascending +import org.mongodb.scala.{Document, Observable, SingleObservable} import java.sql.SQLException import java.util.Date @@ -232,10 +230,12 @@ class MongoSqlQueryHolder { else { e.getValue } + case e: net.sf.jsqlparser.expression.BooleanValue => e.getValue case e: net.sf.jsqlparser.expression.DateValue => e.getValue case e: net.sf.jsqlparser.expression.TimeValue => e.getValue case e: net.sf.jsqlparser.expression.TimestampValue => e.getValue case _: net.sf.jsqlparser.expression.NullValue => null + case e: Concat => Map("$concat" -> List(convertValue(e.getLeftExpression), convertValue(e.getRightExpression))) case t: net.sf.jsqlparser.expression.TimeKeyExpression => t.getStringValue.toUpperCase match { case "CURRENT_TIMESTAMP" => new Date() diff --git a/src/test/scala/dev/mongocamp/driver/mongodb/jdbc/LiquibaseJdbcSpec.scala b/src/test/scala/dev/mongocamp/driver/mongodb/jdbc/LiquibaseJdbcSpec.scala index 533e4646..e5505c57 100644 --- a/src/test/scala/dev/mongocamp/driver/mongodb/jdbc/LiquibaseJdbcSpec.scala +++ b/src/test/scala/dev/mongocamp/driver/mongodb/jdbc/LiquibaseJdbcSpec.scala @@ -33,6 +33,6 @@ class LiquibaseJdbcSpec extends BaseJdbcSpec with LazyLogging { logger.error(e.getMessage, e) false must beTrue } - }.pendingUntilFixed() + } } }