diff --git a/LINQ/LINQ/Interpreter/Expressions/BinaryExpression.vb b/LINQ/LINQ/Interpreter/Expressions/BinaryExpression.vb index ccd66f0..97cf2cc 100644 --- a/LINQ/LINQ/Interpreter/Expressions/BinaryExpression.vb +++ b/LINQ/LINQ/Interpreter/Expressions/BinaryExpression.vb @@ -24,7 +24,21 @@ Namespace Interpreter.Expressions End Sub Public Overrides Function Exec(env As Environment) As Object - Throw New NotImplementedException() + Dim x As Double = left.Exec(env) + Dim y As Double = right.Exec(env) + + Select Case op + Case "+" : Return x + y + Case "-" : Return x - y + Case "*" : Return x * y + Case "/" : Return x / y + Case "^" : Return x ^ y + Case ">" : Return x > y + Case "<" : Return x < y + Case "=" : Return x = y + Case Else + Throw New NotImplementedException + End Select End Function Public Overrides Function ToString() As String diff --git a/LINQ/LINQ/Interpreter/Expressions/Keywords/OrderBy.vb b/LINQ/LINQ/Interpreter/Expressions/Keywords/OrderBy.vb index 78f81e8..4182050 100644 --- a/LINQ/LINQ/Interpreter/Expressions/Keywords/OrderBy.vb +++ b/LINQ/LINQ/Interpreter/Expressions/Keywords/OrderBy.vb @@ -1,4 +1,5 @@ Imports LINQ.Runtime +Imports Microsoft.VisualBasic.My.JavaScript Namespace Interpreter.Expressions @@ -11,13 +12,36 @@ Namespace Interpreter.Expressions End Property Dim key As Expression + Dim desc As Boolean Sub New(key As Expression) Me.key = key End Sub Public Overrides Function Exec(env As Environment) As Object - Throw New NotImplementedException() + Return key.Exec(env) + End Function + + Public Function Sort(result As IEnumerable(Of JavaScriptObject), env As Environment) As IEnumerable(Of JavaScriptObject) + If desc Then + Return result _ + .OrderByDescending(Function(obj) + For Each key As String In obj + env.FindSymbol(key).value = obj(key) + Next + + Return Exec(env) + End Function) + Else + Return result _ + .OrderBy(Function(obj) + For Each key As String In obj + env.FindSymbol(key).value = obj(key) + Next + + Return Exec(env) + End Function) + End If End Function Public Overrides Function ToString() As String diff --git a/LINQ/LINQ/Interpreter/Expressions/Keywords/OutputProjection.vb b/LINQ/LINQ/Interpreter/Expressions/Keywords/OutputProjection.vb index aeaf6d5..4891012 100644 --- a/LINQ/LINQ/Interpreter/Expressions/Keywords/OutputProjection.vb +++ b/LINQ/LINQ/Interpreter/Expressions/Keywords/OutputProjection.vb @@ -1,5 +1,6 @@ Imports LINQ.Runtime Imports Microsoft.VisualBasic.ComponentModel.DataSourceModel +Imports Microsoft.VisualBasic.My.JavaScript Namespace Interpreter.Expressions @@ -18,7 +19,13 @@ Namespace Interpreter.Expressions End Sub Public Overrides Function Exec(env As Environment) As Object - Throw New NotImplementedException() + Dim obj As New JavaScriptObject + + For Each field In fields + obj(field.Name) = field.Value.Exec(env) + Next + + Return obj End Function Public Overrides Function ToString() As String diff --git a/LINQ/LINQ/Interpreter/Expressions/Keywords/WhereFilter.vb b/LINQ/LINQ/Interpreter/Expressions/Keywords/WhereFilter.vb index f403d11..3f895f4 100644 --- a/LINQ/LINQ/Interpreter/Expressions/Keywords/WhereFilter.vb +++ b/LINQ/LINQ/Interpreter/Expressions/Keywords/WhereFilter.vb @@ -17,7 +17,7 @@ Namespace Interpreter.Expressions End Sub Public Overrides Function Exec(env As Environment) As Object - Throw New NotImplementedException() + Return filter.Exec(env) End Function Public Overrides Function ToString() As String diff --git a/LINQ/LINQ/Interpreter/Expressions/SymbolReference.vb b/LINQ/LINQ/Interpreter/Expressions/SymbolReference.vb index e58231b..e7943be 100644 --- a/LINQ/LINQ/Interpreter/Expressions/SymbolReference.vb +++ b/LINQ/LINQ/Interpreter/Expressions/SymbolReference.vb @@ -14,8 +14,9 @@ Namespace Interpreter.Expressions Dim symbol As Symbol = env.FindSymbol(symbolName) If symbol Is Nothing Then + Throw New MissingPrimaryKeyException(symbolName) Else - + Return symbol.value End If End Function diff --git a/LINQ/LINQ/Interpreter/Query/ProjectionExpression.vb b/LINQ/LINQ/Interpreter/Query/ProjectionExpression.vb index aee22e8..6e57337 100644 --- a/LINQ/LINQ/Interpreter/Query/ProjectionExpression.vb +++ b/LINQ/LINQ/Interpreter/Query/ProjectionExpression.vb @@ -1,6 +1,7 @@ Imports LINQ.Interpreter.Expressions Imports LINQ.Runtime Imports Microsoft.VisualBasic.Emit.Delegates +Imports Microsoft.VisualBasic.My.JavaScript Namespace Interpreter.Query @@ -19,12 +20,14 @@ Namespace Interpreter.Query Dim symbol As SymbolDeclare Dim executeQueue As Expression() Dim opt As Options + Dim project As OutputProjection - Sub New(symbol As SymbolDeclare, sequence As Expression, exec As IEnumerable(Of Expression), opt As Options) + Sub New(symbol As SymbolDeclare, sequence As Expression, exec As IEnumerable(Of Expression), proj As OutputProjection, opt As Options) Me.executeQueue = exec.ToArray Me.symbol = symbol Me.opt = opt Me.sequence = sequence + Me.project = proj End Sub Private Iterator Function GetSequenceObjects(env As Environment) As IEnumerable(Of Object) @@ -52,25 +55,34 @@ Namespace Interpreter.Query End Function Public Overrides Function Exec(env As Environment) As Object - Dim projections As New List(Of Object) + Dim projections As New List(Of JavaScriptObject) Dim closure As New Environment(parent:=env) + Dim skipVal As Boolean Call closure.AddSymbol(symbol.symbolName, symbol.type) For Each item As Object In GetSequenceObjects(env) - closure.FindSymbol(symbol.name).value = item + closure.FindSymbol(symbol.symbolName).value = item For Each line As Expression In executeQueue If TypeOf line Is WhereFilter Then - Dim result As Boolean = line.Exec(closure) + skipVal = Not DirectCast(line.Exec(closure), Boolean) - If Not result Then + If skipVal Then Exit For End If End If Next + + If Not skipVal Then + projections.Add(project.Exec(closure)) + End If Next + If Not opt.OrderBy Is Nothing Then + projections = opt.OrderBy.Sort(projections, closure).AsList + End If + Return projections.ToArray End Function End Class diff --git a/LINQ/LINQ/Runtime/Environment.vb b/LINQ/LINQ/Runtime/Environment.vb index ab2adad..14bea08 100644 --- a/LINQ/LINQ/Runtime/Environment.vb +++ b/LINQ/LINQ/Runtime/Environment.vb @@ -31,8 +31,10 @@ Namespace Runtime Public Function FindSymbol(name As String) As Symbol If symbols.ContainsKey(name) Then Return symbols(name) - Else + ElseIf Not parent Is Nothing Then Return parent.FindSymbol(name) + Else + Throw New MissingPrimaryKeyException(name) End If End Function diff --git a/LINQ/LINQ/Script/SyntaxImplements.vb b/LINQ/LINQ/Script/SyntaxImplements.vb index a0792b8..d119c24 100644 --- a/LINQ/LINQ/Script/SyntaxImplements.vb +++ b/LINQ/LINQ/Script/SyntaxImplements.vb @@ -27,17 +27,18 @@ Namespace Script Dim i As Integer = 0 Dim seq As Expression = blocks.GetSequence(offset:=i) Dim exec As Expression() = blocks.Skip(i).PopulateExpressions.ToArray + Dim proj As Expression = exec.Where(Function(t) TypeOf t Is OutputProjection).FirstOrDefault Dim opt As New Options With { .OrderBy = exec _ .Where(Function(t) TypeOf t Is OrderBy) _ .FirstOrDefault } Dim execProgram As Expression() = exec _ - .Where(Function(t) Not TypeOf t Is OrderBy) _ + .Where(Function(t) Not TypeOf t Is OrderBy AndAlso Not TypeOf t Is OutputProjection) _ .ToArray - Dim proj As New ProjectionExpression(symbolExpr, seq, execProgram, opt) + Dim Linq As New ProjectionExpression(symbolExpr, seq, execProgram, proj, opt) - Return proj + Return Linq End Function diff --git a/LINQ/LINQ/test/test.vbproj b/LINQ/LINQ/test/test.vbproj index bda80c8..175a14e 100644 --- a/LINQ/LINQ/test/test.vbproj +++ b/LINQ/LINQ/test/test.vbproj @@ -127,6 +127,10 @@ + + {7283c179-f852-4ead-8d8f-b82ef2cbd7db} + 47_dotnet_ms-vb_data.framework + {fecce1fd-e1d4-49e3-a668-60bb5e7aed99} 47-dotnet_Microsoft.VisualBasic