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],

Reply via email to