create query output

master
xieguigang 5 years ago
parent a46f3649ef
commit 67662fc9db

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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
<Extension>

@ -127,6 +127,10 @@
</None>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\sciBASIC#\Data\DataFrame\47_dotnet_ms-vb_data.framework.vbproj">
<Project>{7283c179-f852-4ead-8d8f-b82ef2cbd7db}</Project>
<Name>47_dotnet_ms-vb_data.framework</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\..\sciBASIC#\Microsoft.VisualBasic.Core\src\47-dotnet_Microsoft.VisualBasic.vbproj">
<Project>{fecce1fd-e1d4-49e3-a668-60bb5e7aed99}</Project>
<Name>47-dotnet_Microsoft.VisualBasic</Name>

Loading…
Cancel
Save