1 #Region "Microsoft.VisualBasic::5f3407c6cf7421d90535ca5dec6a757f, Microsoft.VisualBasic.Core\ComponentModel\DataStructures\Tree\BinaryTree\Extensions.vb"
2
3     ' Author:
4     
5     '       asuka (amethyst.asuka@gcmodeller.org)
6     '       xie (genetics@smrucc.org)
7     '       xieguigang (xie.guigang@live.com)
8     
9     ' Copyright (c) 2018 GPL3 Licensed
10     
11     
12     ' GNU GENERAL PUBLIC LICENSE (GPL3)
13     
14     
15     ' This program is free software: you can redistribute it and/or modify
16     ' it under the terms of the GNU General Public License as published by
17     ' the Free Software Foundation, either version 3 of the License, or
18     ' (at your option) any later version.
19     
20     ' This program is distributed in the hope that it will be useful,
21     ' but WITHOUT ANY WARRANTY; without even the implied warranty of
22     ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23     ' GNU General Public License for more details.
24     
25     ' You should have received a copy of the GNU General Public License
26     ' along with this program. If not, see <http://www.gnu.org/licenses/>.
27
28
29
30     ' /********************************************************************************/
31
32     ' Summaries:
33
34     '     Module Extensions
35     
36     '         Function: Add, NameCompare, NameFuzzyMatch
37     
38     
39     ' /********************************************************************************/
40
41 #End Region
42
43 Imports System.Runtime.CompilerServices
44 Imports Microsoft.VisualBasic.ComponentModel.DataSourceModel
45 Imports sys = System.Math
46
47 Namespace ComponentModel.DataStructures.BinaryTree
48
49     Public Module Extensions
50
51         <MethodImpl(MethodImplOptions.AggressiveInlining)>
52         <Extension>
53         Public Function Add(Of T)(tree As BinaryTree(Of NamedValue(Of T)), node As NamedValue(Of T)) As TreeNode(Of NamedValue(Of T))
54             Return tree.insert(node.Name, node)
55         End Function
56
57         ''' <summary>
58         ''' 字符串名字的比较规则:
59         ''' 
60         ''' 假若字符串是空值或者空字符串,则该变量小
61         ''' 假若字符串相等(忽略大小写),则变量值一样
62         ''' 最后逐个字符进行比较,按照字母的charcode大小来比较,第一个charcode大的变量大
63         ''' </summary>
64         ''' <param name="a$"></param>
65         ''' <param name="b$"></param>
66         ''' <returns></returns>
67         Public Function NameCompare(a$, b$) As Integer
68             Dim null1 = String.IsNullOrEmpty(a)
69             Dim null2 = String.IsNullOrEmpty(b)
70
71             If null1 AndAlso null2 Then
72                 Return 0
73             ElseIf null1 Then
74                 Return -1
75             ElseIf null2 Then
76                 Return 1
77             ElseIf String.Equals(a, b, StringComparison.OrdinalIgnoreCase) Then
78                 Return 0
79             Else
80
81                 Dim minl = sys.Min(a.Length, b.Length)
82                 Dim c1, c2 As Char
83
84                 For i As Integer = 0 To minl - 1
85                     c1 = Char.ToLower(a.Chars(i))
86                     c2 = Char.ToLower(b.Chars(i))
87
88                     If c1 <> c2 Then
89                         Return c1.CompareTo(c2)
90                     End If
91                 Next
92
93                 If a.Length < b.Length Then
94                     Return -1
95                 Else
96                     Return 1
97                 End If
98             End If
99         End Function
100
101         ''' <summary>
102         ''' The term index search engine.
103         ''' 
104         ''' + If the string similarity less than threshold, then will returns negative value
105         ''' + If the string similarity greater than threshold, then will returns positive value
106         ''' + If the string text equals to other, then will reutrns ZERO
107         ''' </summary>
108         ''' <param name="a$"></param>
109         ''' <param name="b$"></param>
110         ''' <returns></returns>
111         Public Function NameFuzzyMatch(a$, b$) As Integer
112             Dim similarity = Text.Levenshtein.ComputeDistance(a, b)
113
114             If a.TextEquals(b) Then
115                 Return 0
116             ElseIf similarity Is Nothing Then
117                 Return -1
118             ElseIf similarity.MatchSimilarity < 0.6 Then
119                 Return -1
120             Else
121                 Return 1
122             End If
123         End Function
124     End Module
125 End Namespace