This is an automated email from the ASF dual-hosted git repository.
sergeykamov pushed a commit to branch NLPCRAFT-30
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git
The following commit(s) were added to refs/heads/NLPCRAFT-30 by this push:
new 3b7de5d WIP.
3b7de5d is described below
commit 3b7de5dc0af6aee3b5c953f36dad6e90110b2af4
Author: Sergey Kamov <[email protected]>
AuthorDate: Thu Apr 9 20:39:17 2020 +0300
WIP.
---
.../apache/nlpcraft/examples/sql/SqlModel.scala | 9 +++--
.../nlpcraft/examples/sql/db/SqlBuilder.scala | 39 +++-------------------
.../model/tools/sqlgen/NCSqlExtractor.java | 5 ++-
.../nlpcraft/model/tools/sqlgen/NCSqlSort.java | 11 ++----
.../model/tools/sqlgen/impl/NCSqlBeans.scala | 23 +++++--------
.../tools/sqlgen/impl/NCSqlExtractorImpl.scala | 36 +++++++++++++++-----
.../tools/sqlgen/impl/NCSqlSchemaBuilderImpl.scala | 37 ++++++++++++++------
7 files changed, 80 insertions(+), 80 deletions(-)
diff --git a/src/main/scala/org/apache/nlpcraft/examples/sql/SqlModel.scala
b/src/main/scala/org/apache/nlpcraft/examples/sql/SqlModel.scala
index 3a86cd3..ad65e69 100644
--- a/src/main/scala/org/apache/nlpcraft/examples/sql/SqlModel.scala
+++ b/src/main/scala/org/apache/nlpcraft/examples/sql/SqlModel.scala
@@ -202,7 +202,7 @@ class SqlModel extends
NCModelFileAdapter("org/apache/nlpcraft/examples/sql/sql_
query =
SqlBuilder(SCHEMA).
withTables(tabs.map(ext.extractTable): _*).
- withColumns(cols.map(col ⇒
(ext.extractColumn(findAnyColumnToken(col)))): _*).
+ withColumns(cols.map(col ⇒
ext.extractColumn(findAnyColumnToken(col))): _*).
withAndConditions(extractValuesConditions(ext, condVals):
_*).
withAndConditions(
condDates.map(t ⇒ extractColumnAndCondition(t,
"nlpcraft:date")).flatMap(h ⇒
@@ -214,7 +214,12 @@ class SqlModel extends
NCModelFileAdapter("org/apache/nlpcraft/examples/sql/sql_
extractNumConditions(ext, h.column, h.condition)
): _*
).
- withSorts(sortTokOpt.map(sortTok ⇒
ext.extractSort(sortTok)).toSeq: _*).
+ withSorts((
+ sortTokOpt match {
+ case Some(sortTok) ⇒
ext.extractSort(sortTok).asScala
+ case None ⇒ Seq.empty
+ }
+ ): _*).
withLimit(limitTokOpt.flatMap(limitTok ⇒
Some(ext.extractLimit(limitTok))).orNull).
withFreeDateRange(freeDateOpt.flatMap(freeDate ⇒
Some(ext.extractDateRange(freeDate))).orNull).
build()
diff --git
a/src/main/scala/org/apache/nlpcraft/examples/sql/db/SqlBuilder.scala
b/src/main/scala/org/apache/nlpcraft/examples/sql/db/SqlBuilder.scala
index cd48134..1ed674d 100644
--- a/src/main/scala/org/apache/nlpcraft/examples/sql/db/SqlBuilder.scala
+++ b/src/main/scala/org/apache/nlpcraft/examples/sql/db/SqlBuilder.scala
@@ -74,23 +74,7 @@ case class SqlBuilder(schema: NCSqlSchema) extends
LazyLogging {
private def sql(clause: NCSqlTable): String = clause.getTable
private def sql(clause: NCSqlColumn): String =
s"${clause.getTable}.${clause.getColumn}"
- private def sql(clause: NCSqlSort): String = {
- val cols: Seq[NCSqlColumn] =
- if (clause.getBy.isEmpty) {
- require(!clause.getSubj.isEmpty)
-
- clause.getSubj.asScala.flatMap(tab ⇒ {
- val cols = tab.getColumns.asScala
- val pkCols = cols.filter(_.isPk)
-
- if (pkCols.nonEmpty) pkCols else cols.take(1)
- })
- }
- else
- clause.getBy.asScala
-
- cols.map(col ⇒ s"${sql(col)} ${if (clause.isAscending) "ASC" else
"DESC"}").mkString(", ")
- }
+ private def sql(clause: NCSqlSort): String = s"${sql(clause.getColumn)}
${if (clause.isAscending) "ASC" else "DESC"}"
// TODO: implement based on join type.
private def sql(clause: NCSqlJoin): String =
@@ -146,15 +130,7 @@ case class SqlBuilder(schema: NCSqlSchema) extends
LazyLogging {
getOrElse(
tables.flatMap(_.getDefaultSort.asScala.
// 'Sort' can contain columns from select list
only (some databases restriction)
- flatMap(sort ⇒
- if (
-
sort.getSubj.asScala.toSet.subsetOf(tables.toSet) &&
- (sort.getBy.isEmpty ||
sort.getBy.asScala.toSet.subsetOf(cols.toSet))
- )
- Some(sort)
- else
- None
- )
+ flatMap(sort ⇒ if (cols.contains(sort.getColumn))
Some(sort) else None)
)
).distinct
case _ ⇒ sorts.distinct
@@ -189,11 +165,7 @@ case class SqlBuilder(schema: NCSqlSchema) extends
LazyLogging {
}
}
- private def limit2Sort(l: NCSqlLimit): NCSqlSort = NCSqlSortImpl(
- Seq(schemaTabsByNames(l.getColumn.getTable)),
- Seq(l.getColumn),
- l.isAscending
- )
+ private def limit2Sort(l: NCSqlLimit): NCSqlSort =
NCSqlSortImpl(l.getColumn, l.isAscending)
private def sort(cols2Sort: Seq[NCSqlColumn], cols: Seq[NCSqlColumn],
tabs: Seq[NCSqlTable]): Seq[NCSqlColumn] =
cols2Sort.sortBy(col ⇒
@@ -311,10 +283,7 @@ case class SqlBuilder(schema: NCSqlSchema) extends
LazyLogging {
colsNorm.foreach(col ⇒ tabsNorm += schemaTabsByNames(col.getTable))
condsNorm.foreach(cond ⇒ { tabsNorm +=
schemaTabsByNames(cond.column.getTable); colsNorm += cond.column })
- sortsNorm.foreach(sort ⇒ {
- tabsNorm ++= sort.getSubj.asScala ++ sort.getBy.asScala.map(col ⇒
schemaTabsByNames(col.getTable))
- colsNorm ++= sort.getBy.asScala
- })
+ sortsNorm.foreach(sort ⇒ {tabsNorm +=
schemaTabsByNames(sort.getColumn.getTable);colsNorm += sort.getColumn })
val freeDateColOpt = findDateColumn(tabsNorm)
diff --git
a/src/main/scala/org/apache/nlpcraft/model/tools/sqlgen/NCSqlExtractor.java
b/src/main/scala/org/apache/nlpcraft/model/tools/sqlgen/NCSqlExtractor.java
index e728b62..bd5ad2b 100644
--- a/src/main/scala/org/apache/nlpcraft/model/tools/sqlgen/NCSqlExtractor.java
+++ b/src/main/scala/org/apache/nlpcraft/model/tools/sqlgen/NCSqlExtractor.java
@@ -20,6 +20,8 @@ package org.apache.nlpcraft.model.tools.sqlgen;
import org.apache.nlpcraft.common.*;
import org.apache.nlpcraft.model.*;
+import java.util.List;
+
/**
* Utility methods for extracting various SQL components from {@link NCToken}
tokens. Instances
* of this interface are created using {@link NCSqlExtractorBuilder} builder.
@@ -44,13 +46,14 @@ public interface NCSqlExtractor {
NCSqlLimit extractLimit(NCToken limitTok);
/**
+ * TODO:
* Extracts sort object from given <code>nlpcraft:sort</code> token.
*
* @param sortTok Sort token with ID <code>nlpcraft:sort</code>.
* @return SQL sort object extracted from given token.
* @throws NCException Thrown in case of any errors.
*/
- NCSqlSort extractSort(NCToken sortTok);
+ List<NCSqlSort> extractSort(NCToken sortTok);
/**
* Extract table object from the token.
diff --git
a/src/main/scala/org/apache/nlpcraft/model/tools/sqlgen/NCSqlSort.java
b/src/main/scala/org/apache/nlpcraft/model/tools/sqlgen/NCSqlSort.java
index 74c0a4e..f41e3d3 100644
--- a/src/main/scala/org/apache/nlpcraft/model/tools/sqlgen/NCSqlSort.java
+++ b/src/main/scala/org/apache/nlpcraft/model/tools/sqlgen/NCSqlSort.java
@@ -17,9 +17,7 @@
package org.apache.nlpcraft.model.tools.sqlgen;
-import org.apache.nlpcraft.model.*;
-
-import java.util.List;
+import org.apache.nlpcraft.model.NCToken;
/**
* Object presentation of SQL sorting.
@@ -31,12 +29,7 @@ public interface NCSqlSort {
/**
* TODO:
*/
- List<NCSqlTable> getSubj();
-
- /**
- * TODO:
- */
- List<NCSqlColumn> getBy();
+ NCSqlColumn getColumn();
/**
* Gets sorting direction.
diff --git
a/src/main/scala/org/apache/nlpcraft/model/tools/sqlgen/impl/NCSqlBeans.scala
b/src/main/scala/org/apache/nlpcraft/model/tools/sqlgen/impl/NCSqlBeans.scala
index ecd34a4..a856006 100644
---
a/src/main/scala/org/apache/nlpcraft/model/tools/sqlgen/impl/NCSqlBeans.scala
+++
b/src/main/scala/org/apache/nlpcraft/model/tools/sqlgen/impl/NCSqlBeans.scala
@@ -81,13 +81,11 @@ case class NCSqlJoinImpl(
/**
*
- * @param subj
- * @param by
+ * @param column
* @param asc
*/
-case class NCSqlSortImpl(subj: Seq[NCSqlTable], by: Seq[NCSqlColumn], asc:
Boolean) extends NCSqlSort {
- override def getSubj: util.List[NCSqlTable] = subj.asJava
- override def getBy: util.List[NCSqlColumn] = by.asJava
+case class NCSqlSortImpl(column: NCSqlColumn, asc: Boolean) extends NCSqlSort {
+ override def getColumn: NCSqlColumn = column
override def isAscending: Boolean = asc
}
@@ -95,28 +93,25 @@ case class NCSqlSortImpl(subj: Seq[NCSqlTable], by:
Seq[NCSqlColumn], asc: Boole
*
* @param table
* @param columns
- * @param sort
- * @param select
+ * @param sorts
+ * @param selects
* @param extraTables
* @param defaultDate
*/
case class NCSqlTableImpl(
table: String,
columns: Seq[NCSqlColumn],
- sort: mutable.ArrayBuffer[NCSqlSort] = mutable.ArrayBuffer.empty,
- select: Seq[String],
+ sorts: Seq[NCSqlSort],
+ selects: Seq[String],
extraTables: Seq[String],
defaultDate: Option[NCSqlColumn]
) extends NCSqlTable {
override def getTable: String = table
override def getColumns: util.List[NCSqlColumn] = columns.asJava
- override def getDefaultSort: util.List[NCSqlSort] = sort.asJava
- override def getDefaultSelect: util.List[String] = select.asJava
+ override def getDefaultSort: util.List[NCSqlSort] = sorts.asJava
+ override def getDefaultSelect: util.List[String] = selects.asJava
override def getExtraTables: util.List[String] = extraTables.asJava
override def getDefaultDate: Optional[NCSqlColumn] = defaultDate.asJava
-
- // TODO: what about another fields for symmetry.
- def addSort(sort: NCSqlSort): Unit = this.sort += sort
}
/**
diff --git
a/src/main/scala/org/apache/nlpcraft/model/tools/sqlgen/impl/NCSqlExtractorImpl.scala
b/src/main/scala/org/apache/nlpcraft/model/tools/sqlgen/impl/NCSqlExtractorImpl.scala
index 299b373..b83db0a 100644
---
a/src/main/scala/org/apache/nlpcraft/model/tools/sqlgen/impl/NCSqlExtractorImpl.scala
+++
b/src/main/scala/org/apache/nlpcraft/model/tools/sqlgen/impl/NCSqlExtractorImpl.scala
@@ -214,16 +214,36 @@ class NCSqlExtractorImpl(schema: NCSqlSchema, variant:
NCVariant) extends NCSqlE
* @param sortTok
* @return
*/
- override def extractSort(sortTok: NCToken): NCSqlSort = {
+ override def extractSort(sortTok: NCToken): util.List[NCSqlSort] = {
checkTokenId(sortTok, "nlpcraft:sort")
- NCSqlSortImpl(
- getLinks(variant, sortTok, "subjindexes", "subjnotes", false).
- map(link ⇒ findTable(link, "SORT")),
- getLinks(variant, sortTok, "byindexes", "bynotes", true).
- map(link ⇒ findColumn(link, "SORT BY")),
- getAsc(sortTok, "nlpcraft:sort:asc", true)
- )
+ val tables = getLinks(variant, sortTok, "subjindexes", "subjnotes",
false).
+ map(link ⇒ findTable(link, "SORT"))
+
+ val cols = getLinks(variant, sortTok, "byindexes", "bynotes", true).
+ map(link ⇒ findColumn(link, "SORT BY"))
+
+ val asc = getAsc(sortTok, "nlpcraft:sort:asc", true)
+
+ require(tables.nonEmpty)
+
+ tables.flatMap(t ⇒ {
+ var colTabs = cols.filter(_.getTable == t.getTable)
+
+ if (colTabs.isEmpty)
+ colTabs = t.getColumns.asScala.filter(_.isPk)
+
+ if (colTabs.isEmpty)
+ colTabs = t.getColumns.asScala.take(1)
+
+ require(colTabs.nonEmpty)
+
+ colTabs.map(col ⇒ {
+ val sort: NCSqlSort = NCSqlSortImpl(col, asc)
+
+ sort
+ })
+ }).asJava
}
/**
diff --git
a/src/main/scala/org/apache/nlpcraft/model/tools/sqlgen/impl/NCSqlSchemaBuilderImpl.scala
b/src/main/scala/org/apache/nlpcraft/model/tools/sqlgen/impl/NCSqlSchemaBuilderImpl.scala
index b30a4e1..4a1793d 100644
---
a/src/main/scala/org/apache/nlpcraft/model/tools/sqlgen/impl/NCSqlSchemaBuilderImpl.scala
+++
b/src/main/scala/org/apache/nlpcraft/model/tools/sqlgen/impl/NCSqlSchemaBuilderImpl.scala
@@ -24,6 +24,7 @@ import org.apache.nlpcraft.model.NCModel
import org.apache.nlpcraft.model.tools.sqlgen._
import scala.collection.JavaConverters._
+import scala.collection.Seq
import scala.compat.java8.OptionConverters._
/**
@@ -67,8 +68,10 @@ object NCSqlSchemaBuilderImpl {
col
}).groupBy(_.getTable).map { case (tab, cols) ⇒ tab → cols }
-
- val tables =
+
+ val defSorts = collection.mutable.HashMap.empty[NCSqlSort, String]
+
+ var tables =
elems.filter(_.getGroups.contains("table")).
map(p ⇒ {
def x(l: util.List[String]): Seq[String] = if (l == null)
Seq.empty else l.asScala
@@ -86,7 +89,8 @@ object NCSqlSchemaBuilderImpl {
// TODO: columns should be list, but elements are set.
How should we order them?
// TODO: Seems elements should be seq too in model.
columns = cols.asScala,
- select = dfltSelect,
+ sorts = Seq.empty,
+ selects = dfltSelect,
extraTables = extra,
defaultDate = defDateOpt match {
case Some(defDate) ⇒
@@ -136,25 +140,36 @@ object NCSqlSchemaBuilderImpl {
if (asc != "asc" && asc != "desc")
error()
- table.addSort(NCSqlSortImpl(
- Seq(table),
- Seq(findSchemaColumn(cols, t, col)),
- asc == "asc"
- ))
+ defSorts += NCSqlSortImpl(findSchemaColumn(cols,
t, col), asc == "asc") → t
})
table
}).toSeq
-
+
+ val defSortsByTab =
+ defSorts.
+ groupBy { case (_, table) ⇒ table }.
+ map { case (table, seq) ⇒ table → seq.map { case (sort, _) ⇒
sort}.toSeq }
+
+ tables = tables.map(t ⇒
+ NCSqlTableImpl(
+ table = t.table,
+ columns = t.columns,
+ sorts = defSortsByTab.getOrElse(t.table, Seq.empty),
+ selects = t.selects,
+ extraTables = t.extraTables,
+ defaultDate = t.defaultDate
+ )
+ )
+
val joinsMap =
mdl.metax("sql:joins").asInstanceOf[util.List[util.Map[String, Object]]]
val joins = joinsMap.asScala.map(_.asScala).map(m ⇒ {
- def mget[T](prop: String): T = {
+ def mget[T](prop: String): T =
m.get(prop) match {
case Some(v) ⇒ v.asInstanceOf[T]
case None ⇒ throw new NCException(s"Metadata property not
found: $prop")
}
- }
val join: NCSqlJoin = NCSqlJoinImpl(
mget("fromtable").asInstanceOf[String],