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