[Tween-svn] [1328] ・ラムダ式でRegexを使用可能に

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2011年 1月 9日 (日) 02:26:58 JST


Revision: 1328
          http://sourceforge.jp/projects/tween/svn/view?view=rev&revision=1328
Author:   syo68k
Date:     2011-01-09 02:26:58 +0900 (Sun, 09 Jan 2011)

Log Message:
-----------
・ラムダ式でRegexを使用可能に
・演算子にAndAlso,OrElseを追加
・ラムダ式にスペースを含んでいる場合に正しく動作しなかったのを修正

Modified Paths:
--------------
    branches/query/Tween/Dynamic.vb
    branches/query/Tween/StatusDictionary.vb


-------------- next part --------------
Modified: branches/query/Tween/Dynamic.vb
===================================================================
--- branches/query/Tween/Dynamic.vb	2011-01-06 13:04:29 UTC (rev 1327)
+++ branches/query/Tween/Dynamic.vb	2011-01-08 17:26:58 UTC (rev 1328)
@@ -13,12 +13,13 @@
 Imports System.Reflection.Emit
 Imports System.Threading
 Imports System.Runtime.CompilerServices
+Imports System.Text.RegularExpressions
 
 
 Public Module DynamicQueryable
 
     Const Id As String = "DynamicQueryModule Copyright © Microsoft Corporation.  All Rights Reserved." + _
-                         "This code released under the terms of the Microsoft Public License (MS-PL, http://opensource.org/licenses/ms-pl.html.) "
+                         " This code released under the terms of the Microsoft Public License (MS-PL, http://opensource.org/licenses/ms-pl.html.) "
 
     <Extension()> _
     Public Function Where(Of T)(ByVal source As IQueryable(Of T), ByVal predicate As String, ByVal ParamArray values() As Object) As IQueryable(Of T)
@@ -572,7 +573,8 @@
                                                     GetType(TimeSpan), _
                                                     GetType(Guid), _
                                                     GetType(Math), _
-                                                    GetType(Convert) _
+                                                    GetType(Convert), _
+                                                    GetType(Regex) _
                                                 }
 
     Shared ReadOnly trueLiteral As Expression = Expression.Constant(True)
@@ -686,10 +688,10 @@
         Return expr
     End Function
 
-    ' ||, or operator
+    ' ||, or,orelse operator
     Function ParseLogicalOr() As Expression
         Dim left As Expression = ParseLogicalAnd()
-        Do While tokenVal.id = TokenId.DoubleBar OrElse TokenIdentifierIs("or")
+        Do While tokenVal.id = TokenId.DoubleBar OrElse TokenIdentifierIs("or") OrElse TokenIdentifierIs("orelse")
             Dim op As Token = tokenVal
             NextToken()
             Dim right As Expression = ParseLogicalAnd()
@@ -699,10 +701,10 @@
         Return left
     End Function
 
-    ' &&, and operator
+    ' &&, and, andalso operator
     Function ParseLogicalAnd() As Expression
         Dim left As Expression = ParseComparison()
-        Do While tokenVal.id = TokenId.DoubleAmphersand OrElse TokenIdentifierIs("and")
+        Do While tokenVal.id = TokenId.DoubleAmphersand OrElse TokenIdentifierIs("and") OrElse TokenIdentifierIs("andalso")
             Dim op As Token = tokenVal
             NextToken()
             Dim right As Expression = ParseComparison()

Modified: branches/query/Tween/StatusDictionary.vb
===================================================================
--- branches/query/Tween/StatusDictionary.vb	2011-01-06 13:04:29 UTC (rev 1327)
+++ branches/query/Tween/StatusDictionary.vb	2011-01-08 17:26:58 UTC (rev 1328)
@@ -2162,6 +2162,17 @@
         End Set
     End Property
 
+    Public ReadOnly Property BodyFilterString As String
+        Get
+            Dim fs As New StringBuilder
+            For Each bf As String In _body
+                fs.Append(bf)
+                fs.Append(" ")
+            Next
+            Return fs.ToString.Trim()
+        End Get
+    End Property
+
     <Xml.Serialization.XmlIgnore()> _
     Public Property ExBodyFilter() As List(Of String)
         Get
@@ -2184,6 +2195,17 @@
         End Set
     End Property
 
+    Public ReadOnly Property ExBodyFilterString As String
+        Get
+            Dim fs As New StringBuilder
+            For Each exbf As String In _exbody
+                fs.Append(exbf)
+                fs.Append(" ")
+            Next
+            Return fs.ToString.Trim()
+        End Get
+    End Property
+
     Public Property SearchBoth() As Boolean
         Get
             Return _searchBoth
@@ -2373,44 +2395,48 @@
                   (Not String.IsNullOrEmpty(post.RetweetedBy) AndAlso Regex.IsMatch(post.RetweetedBy, _name, rgOpt))
                  )
                 ) Then
+                If _useLambda Then
+                    If Not ExecuteLambdaExpression(BodyFilterString, post) Then bHit = False
+                Else
+                    For Each fs As String In _body
+                        If _useRegex Then
+                            If Not Regex.IsMatch(tBody, fs, rgOpt) Then bHit = False
+                        Else
+                            If _caseSensitive Then
+                                If Not tBody.Contains(fs) Then bHit = False
+                            Else
+                                If Not tBody.ToLower().Contains(fs.ToLower()) Then bHit = False
+                            End If
+                        End If
+                        If Not bHit Then Exit For
+                    Next
+                End If
+            Else
+                bHit = False
+            End If
+        Else
+            If _useLambda Then
+                If Not ExecuteLambdaExpression(BodyFilterString, post) Then bHit = False
+            Else
                 For Each fs As String In _body
                     If _useRegex Then
-                        If Not Regex.IsMatch(tBody, fs, rgOpt) Then bHit = False
-                    ElseIf _useLambda Then
-                        If Not ExecuteLambdaExpression(fs, post) Then bHit = False
+                        If Not (Regex.IsMatch(post.Name, fs, rgOpt) OrElse
+                                (Not String.IsNullOrEmpty(post.RetweetedBy) AndAlso Regex.IsMatch(post.RetweetedBy, fs, rgOpt)) OrElse
+                                Regex.IsMatch(tBody, fs, rgOpt)) Then bHit = False
                     Else
                         If _caseSensitive Then
-                            If Not tBody.Contains(fs) Then bHit = False
+                            If Not (post.Name.Contains(fs) OrElse _
+                                    post.RetweetedBy.Contains(fs) OrElse _
+                                    tBody.Contains(fs)) Then bHit = False
                         Else
-                            If Not tBody.ToLower().Contains(fs.ToLower()) Then bHit = False
+                            If Not (post.Name.ToLower().Contains(fs.ToLower()) OrElse _
+                                    post.RetweetedBy.ToLower().Contains(fs.ToLower()) OrElse _
+                                    tBody.ToLower().Contains(fs.ToLower())) Then bHit = False
                         End If
                     End If
                     If Not bHit Then Exit For
                 Next
-            Else
-                bHit = False
             End If
-        Else
-            For Each fs As String In _body
-                If _useRegex Then
-                    If Not (Regex.IsMatch(post.Name, fs, rgOpt) OrElse
-                            (Not String.IsNullOrEmpty(post.RetweetedBy) AndAlso Regex.IsMatch(post.RetweetedBy, fs, rgOpt)) OrElse
-                            Regex.IsMatch(tBody, fs, rgOpt)) Then bHit = False
-                ElseIf _useLambda Then
-                    If Not ExecuteLambdaExpression(fs, post) Then bHit = False
-                Else
-                    If _caseSensitive Then
-                        If Not (post.Name.Contains(fs) OrElse _
-                                post.RetweetedBy.Contains(fs) OrElse _
-                                tBody.Contains(fs)) Then bHit = False
-                    Else
-                        If Not (post.Name.ToLower().Contains(fs.ToLower()) OrElse _
-                                post.RetweetedBy.ToLower().Contains(fs.ToLower()) OrElse _
-                                tBody.ToLower().Contains(fs.ToLower())) Then bHit = False
-                    End If
-                End If
-                If Not bHit Then Exit For
-            Next
         End If
         If _isRt Then
             If post.RetweetedId = 0 Then bHit = False
@@ -2454,45 +2480,51 @@
                             )
                         ) Then
                         If _exbody.Count > 0 Then
-                            For Each fs As String In _exbody
-                                If _exuseRegex Then
-                                    If Regex.IsMatch(tBody, fs, rgOpt) Then exFlag = True
-                                ElseIf _exuseLambda Then
-                                    If ExecuteLambdaExpression(fs, post) Then exFlag = True
-                                Else
-                                    If _excaseSensitive Then
-                                        If tBody.Contains(fs) Then exFlag = True
+                            If _exuseLambda Then
+                                If ExecuteLambdaExpression(ExBodyFilterString, post) Then exFlag = True
+                            Else
+                                For Each fs As String In _exbody
+                                    If _exuseRegex Then
+                                        If Regex.IsMatch(tBody, fs, rgOpt) Then exFlag = True
+                                    ElseIf _exuseLambda Then
+
                                     Else
-                                        If tBody.ToLower().Contains(fs.ToLower()) Then exFlag = True
+                                        If _excaseSensitive Then
+                                            If tBody.Contains(fs) Then exFlag = True
+                                        Else
+                                            If tBody.ToLower().Contains(fs.ToLower()) Then exFlag = True
+                                        End If
                                     End If
-                                End If
-                                If exFlag Then Exit For
-                            Next
+                                    If exFlag Then Exit For
+                                Next
+                            End If
                         Else
                             exFlag = True
                         End If
                     End If
                 Else
-                    For Each fs As String In _exbody
-                        If _exuseRegex Then
-                            If Regex.IsMatch(post.Name, fs, rgOpt) OrElse
-                               (Not String.IsNullOrEmpty(post.RetweetedBy) AndAlso Regex.IsMatch(post.RetweetedBy, fs, rgOpt)) OrElse
-                               Regex.IsMatch(tBody, fs, rgOpt) Then exFlag = True
-                        ElseIf _exuseLambda Then
-                            If ExecuteLambdaExpression(fs, post) Then exFlag = True
-                        Else
-                            If _excaseSensitive Then
-                                If post.Name.Contains(fs) OrElse _
-                                   post.RetweetedBy.Contains(fs) OrElse _
-                                   tBody.Contains(fs) Then exFlag = True
+                    If _exuseLambda Then
+                        If ExecuteLambdaExpression(ExBodyFilterString, post) Then exFlag = True
+                    Else
+                        For Each fs As String In _exbody
+                            If _exuseRegex Then
+                                If Regex.IsMatch(post.Name, fs, rgOpt) OrElse
+                                   (Not String.IsNullOrEmpty(post.RetweetedBy) AndAlso Regex.IsMatch(post.RetweetedBy, fs, rgOpt)) OrElse
+                                   Regex.IsMatch(tBody, fs, rgOpt) Then exFlag = True
                             Else
-                                If post.Name.ToLower().Contains(fs.ToLower()) OrElse _
-                                   post.RetweetedBy.ToLower().Contains(fs.ToLower()) OrElse _
-                                   tBody.ToLower().Contains(fs.ToLower()) Then exFlag = True
+                                If _excaseSensitive Then
+                                    If post.Name.Contains(fs) OrElse _
+                                       post.RetweetedBy.Contains(fs) OrElse _
+                                       tBody.Contains(fs) Then exFlag = True
+                                Else
+                                    If post.Name.ToLower().Contains(fs.ToLower()) OrElse _
+                                       post.RetweetedBy.ToLower().Contains(fs.ToLower()) OrElse _
+                                       tBody.ToLower().Contains(fs.ToLower()) Then exFlag = True
+                                End If
                             End If
-                        End If
-                        If exFlag Then Exit For
-                    Next
+                            If exFlag Then Exit For
+                        Next
+                    End If
                 End If
             End If
             If _isExRt Then



Tween-svn メーリングリストの案内
Back to archive index