enable sort key orders

master
xieguigang 5 years ago
parent 8e15ca353d
commit dcad1b86b1

@ -14,8 +14,9 @@ Namespace Interpreter.Expressions
Dim key As Expression
Dim desc As Boolean
Sub New(key As Expression)
Sub New(key As Expression, desc As Boolean)
Me.key = FixLiteral(key)
Me.desc = desc
End Sub
Public Overrides Function Exec(context As ExecutableContext) As Object

@ -44,7 +44,8 @@ Namespace Language
ReadOnly keywords As Index(Of String) = {
"imports",
"select", "from", "in", "let", "as", "distinct", "group", "by", "order", "aggregate",
"where", "take", "skip", "into"
"where", "take", "skip", "into",
"descending", "ascending"
}
ReadOnly operators As Index(Of String) = {"+", "-", "*", "/", "\", "%", "=", "<>", ">", "<", ">=", "<=", "^", "&"}
ReadOnly literal As Index(Of String) = {"true", "false"}

@ -1,5 +1,6 @@
Imports System.Runtime.CompilerServices
Imports LINQ.Language
Imports Microsoft.VisualBasic.ComponentModel.Collection
Imports Microsoft.VisualBasic.Language
Module StackParser
@ -36,9 +37,11 @@ Module StackParser
<Extension>
Public Function SplitByTopLevelStack(tokenList As IEnumerable(Of Token)) As IEnumerable(Of Token())
Static ignores As Index(Of String) = {"as", "by", "descending", "ascending"}
Return tokenList _
.DoSplitByTopLevelStack(Function(t)
Return t.name = Tokens.keyword AndAlso Not t.text.TextEquals("as") AndAlso Not t.text.TextEquals("by")
Return t.name = Tokens.keyword AndAlso (Not t.text.ToLower Like ignores)
End Function, True, True, False)
End Function

@ -2,7 +2,9 @@
Imports LINQ.Interpreter.Expressions
Imports LINQ.Interpreter.Query
Imports LINQ.Language
Imports Microsoft.VisualBasic.ComponentModel.Collection
Imports Microsoft.VisualBasic.ComponentModel.DataSourceModel
Imports Microsoft.VisualBasic.Linq
Namespace Script
@ -43,9 +45,29 @@ Namespace Script
Return list
End Function
ReadOnly sortOrders As Index(Of String) = {"descending", "ascending"}
<Extension>
Public Function PopulateQueryExpression(tokens As IEnumerable(Of Token)) As Expression
Dim blocks = tokens.JoinOperators.SplitByTopLevelStack.ToArray
Public Function PopulateQueryExpression(tokenList As IEnumerable(Of Token)) As Expression
Dim blocks As List(Of Token()) = tokenList _
.JoinOperators _
.SplitByTopLevelStack _
.ToList
For i As Integer = 1 To blocks.Count - 1
If i >= blocks.Count Then
Exit For
End If
If blocks(i).Length = 1 AndAlso blocks(i)(Scan0).name = Tokens.keyword Then
If blocks(i)(Scan0).text.ToLower Like sortOrders Then
blocks(i - 1) = blocks(i - 1) _
.JoinIterates(blocks(i)) _
.ToArray
blocks.RemoveAt(i)
End If
End If
Next
If blocks(Scan0).First.isKeywordFrom Then
Return blocks(Scan0).CreateProjectionQuery(blocks.Skip(1).ToArray)
@ -160,7 +182,15 @@ Namespace Script
ElseIf tokenList(Scan0).isKeyword("select") Then
Return tokenList.Skip(1).GetProjection
ElseIf tokenList(Scan0).isKeyword("order") Then
Return New OrderBy(ParseExpression(tokenList.Skip(2).ToArray))
Dim sortKey = tokenList.Skip(2).ToArray
Dim desc As Boolean
If sortKey.Last.name = Tokens.keyword AndAlso sortKey.Last.text.ToLower Like sortOrders Then
desc = sortKey.Last.text.TextEquals("descending")
sortKey = sortKey.Take(sortKey.Length - 1).ToArray
End If
Return New OrderBy(ParseExpression(sortKey), desc)
ElseIf tokenList(Scan0).isKeyword("take") Then
Return New TakeItems(ParseExpression(tokenList.Skip(1).ToArray))
Else

@ -1,9 +1,9 @@
Imports LINQ.Script
Imports LINQ.Interpreter
Imports LINQ.Interpreter.Query
Imports LINQ.Runtime
Imports LINQ.Script
Imports Microsoft.VisualBasic.ComponentModel.DataSourceModel
Imports LINQ.Interpreter.Query
Imports Microsoft.VisualBasic.My.JavaScript
Imports LINQ.Interpreter
Public Module Program
@ -11,7 +11,7 @@ Public Module Program
Dim test = From x As Double In {(1 + y) * 8, 2, 3, 4, 5, 6, 7, 8, 9}
Where x ^ 3 > (5 * x)
Select x = x ^ 2 + 99, y = x * 2
Order By y
Order By y Ascending
Sub Main()
Call parserTest()

@ -9,5 +9,5 @@ SELECT x.LipidIon,
x.Formula,
x.PeakQuality,
x."m-Score"
ORDER BY pow("m-Score", PeakQuality)
ORDER BY pow("m-Score", PeakQuality) DESCENDING
TAKE 15
Loading…
Cancel
Save