From c2ef2ea581d6bd967ebeeb93eca35c6b33cbded9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=93=E3=81=AE=E4=B8=AD=E4=BA=8C=E7=97=85=E3=81=AB?= =?UTF-8?q?=E7=88=86=E7=84=94=E3=82=92=EF=BC=81?= Date: Fri, 15 Sep 2023 18:49:41 +0800 Subject: [PATCH] get query --- src/LINQ/RQL/NodeMap.vb | 10 +++++ src/LINQ/RQL/RQL.vbproj | 6 +++ src/LINQ/RQL/Resource.vb | 88 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 104 insertions(+) create mode 100644 src/LINQ/RQL/NodeMap.vb create mode 100644 src/LINQ/RQL/Resource.vb diff --git a/src/LINQ/RQL/NodeMap.vb b/src/LINQ/RQL/NodeMap.vb new file mode 100644 index 0000000..4ca62e4 --- /dev/null +++ b/src/LINQ/RQL/NodeMap.vb @@ -0,0 +1,10 @@ +Imports Microsoft.VisualBasic.Data.IO + +''' +''' A descriptor of the specific resource file +''' +Public Class NodeMap + + Public Property resources As List(Of String) + +End Class diff --git a/src/LINQ/RQL/RQL.vbproj b/src/LINQ/RQL/RQL.vbproj index 74da151..de58c4e 100644 --- a/src/LINQ/RQL/RQL.vbproj +++ b/src/LINQ/RQL/RQL.vbproj @@ -243,6 +243,8 @@ + + True @@ -287,6 +289,10 @@ {c1413834-6eba-4668-b3e4-9dfa1edb9a5d} HDSPack + + {ae10f033-1ee2-44ef-af06-f1c81411d069} + graph-netcore5 + {ef075a21-793b-45ed-9c38-ad5d04744aec} Core diff --git a/src/LINQ/RQL/Resource.vb b/src/LINQ/RQL/Resource.vb new file mode 100644 index 0000000..924ef0a --- /dev/null +++ b/src/LINQ/RQL/Resource.vb @@ -0,0 +1,88 @@ +Imports System.IO +Imports Microsoft.VisualBasic.ComponentModel.Ranges +Imports Microsoft.VisualBasic.Data.GraphTheory +Imports Microsoft.VisualBasic.DataStorage.HDSPack.FileSystem + +''' +''' Resource query language +''' +Public Class Resource : Implements IDisposable + + ReadOnly buf As StreamPack + ReadOnly index As Trie(Of NodeMap) + + Private disposedValue As Boolean + + Sub New(res As StreamPack) + buf = res + End Sub + + Public Function Add(key As String, data As Byte()) As Boolean + Dim tokens As String() = Strings.LCase(key).Split + Dim map As String = key.MD5 + Dim path As String = $"/pool/{map.Substring(4, 2)}/{map.Substring(16, 6)}/{map}" + + For Each si As String In tokens + Dim v = index.Add(key) + Dim page As NodeMap = v.data + + Call page.resources.Add(map) + Next + + Dim file As Stream = buf.OpenFile(path, FileMode.OpenOrCreate, FileAccess.Write) + Call file.Write(data, Scan0, data.Length) + Call file.Flush() + Call file.Dispose() + + Return True + End Function + + Public Function [Get](query As String) As IEnumerable(Of NumericTagged(Of String)) + Dim tokens As String() = Strings.LCase(query).Split + Dim maps As New Dictionary(Of String, Double) + + For Each si As String In tokens + Dim v = index.Find(si) + Dim f As Double = 0.5 + + If v.success Then + f = 1 + End If + + For Each map As String In v.child.data.resources + maps(map) += f + Next + Next + + Return From a + In maps + Select o = New NumericTagged(Of String)(a.Value, a.Key) + Order By o.tag Descending + End Function + + Protected Overridable Sub Dispose(disposing As Boolean) + If Not disposedValue Then + If disposing Then + ' TODO: 释放托管状态(托管对象) + Call buf.Dispose() + End If + + ' TODO: 释放未托管的资源(未托管的对象)并重写终结器 + ' TODO: 将大型字段设置为 null + disposedValue = True + End If + End Sub + + ' ' TODO: 仅当“Dispose(disposing As Boolean)”拥有用于释放未托管资源的代码时才替代终结器 + ' Protected Overrides Sub Finalize() + ' ' 不要更改此代码。请将清理代码放入“Dispose(disposing As Boolean)”方法中 + ' Dispose(disposing:=False) + ' MyBase.Finalize() + ' End Sub + + Public Sub Dispose() Implements IDisposable.Dispose + ' 不要更改此代码。请将清理代码放入“Dispose(disposing As Boolean)”方法中 + Dispose(disposing:=True) + GC.SuppressFinalize(Me) + End Sub +End Class