Skip to content

Commit cab3314

Browse files
committed
adding unchecked file
1 parent ec87564 commit cab3314

File tree

1 file changed

+61
-31
lines changed

1 file changed

+61
-31
lines changed

RedditSharp/Search/DefaultSearchFormatter.cs

Lines changed: 61 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,21 @@ string ISearchFormatter.Format(Expression<Func<AdvancedSearchFilter, bool>> sear
1414
{
1515
Expression expression = null;
1616
Stack<Expression> expressionStack = new Stack<Expression>();
17+
Stack<FormatInfo> formatInfoStack = new Stack<FormatInfo>();
1718
expressionStack.Push(search.Body);
1819
Stack<string> searchStack = new Stack<string>();
1920
while (expressionStack.Count > 0) {
2021
expression = expressionStack.Pop();
2122
switch (expression)
2223
{
2324
case MemberExpression memberExpression:
24-
searchStack.Push(MemberExpressionHelper(memberExpression));
25+
MemberExpressionHelper(memberExpression, searchStack, formatInfoStack);
2526
break;
2627
case UnaryExpression unaryExpression:
27-
searchStack.Push(UnaryExpressionHelper(unaryExpression,expressionStack));
28+
UnaryExpressionHelper(unaryExpression, expressionStack, formatInfoStack);
2829
break;
2930
case BinaryExpression binaryExpression:
30-
BinaryExpressionHelper(binaryExpression, expressionStack, searchStack);
31+
BinaryExpressionHelper(binaryExpression, expressionStack, formatInfoStack);
3132
break;
3233
case ConstantExpression constantExpresssion:
3334
searchStack.Push(ConstantExpressionHelper(constantExpresssion));
@@ -37,20 +38,32 @@ string ISearchFormatter.Format(Expression<Func<AdvancedSearchFilter, bool>> sear
3738
}
3839
}
3940

40-
string searchQuery = searchStack.Pop();
41-
while(searchStack.Count > 0)
41+
string searchQuery = string.Empty;
42+
Stack<string> compoundSearchStack = new Stack<string>();
43+
while(formatInfoStack.Count >0)
4244
{
43-
searchQuery = string.Format(searchStack.Pop(), searchQuery);
45+
FormatInfo current = formatInfoStack.Pop();
46+
string[] formatParameters = new string[current.ParameterCount];
47+
int currentCount = current.ParameterCount;
48+
while(currentCount > 0)
49+
{
50+
formatParameters[formatParameters.Length - currentCount] = current.IsCompound ? compoundSearchStack.Pop() : searchStack.Pop();
51+
currentCount--;
52+
}
53+
54+
compoundSearchStack.Push(string.Format(current.Pattern, formatParameters));
55+
4456
}
45-
return searchQuery;
57+
58+
return compoundSearchStack.Pop();
4659
}
4760

4861
private string ConstantExpressionHelper(ConstantExpression constantExpresssion)
4962
{
5063
return constantExpresssion.ToString().Replace("\"","");
5164
}
5265

53-
private void BinaryExpressionHelper(BinaryExpression expression, Stack<Expression> expressionStack, Stack<string> searchStack)
66+
private void BinaryExpressionHelper(BinaryExpression expression, Stack<Expression> expressionStack, Stack<FormatInfo> formatInfoStack)
5467
{
5568
if(IsAdvancedSearchMemberExpression(expression.Left) && IsAdvancedSearchMemberExpression(expression.Right))
5669
{
@@ -70,40 +83,37 @@ private void BinaryExpressionHelper(BinaryExpression expression, Stack<Expressio
7083

7184
if (expression.NodeType != ExpressionType.Equal)
7285
{
73-
searchStack.Push(expression.ToOperator());
86+
formatInfoStack.Push(expression.ToFormatInfo());
7487
//searchStack.Push("NOT(+{0}+)");
7588
}
7689

7790

7891
}
7992

8093

81-
private string UnaryExpressionHelper(UnaryExpression expression, Stack<Expression> expressionStack)
94+
private void UnaryExpressionHelper(UnaryExpression expression, Stack<Expression> expressionStack,Stack<FormatInfo> formatInfoStack)
8295
{
83-
string expressionOperator = expression.ToOperator();
96+
formatInfoStack.Push( expression.ToFormatInfo());
8497
expressionStack.Push(expression.Operand);
85-
return expressionOperator;
98+
//return expressionOperator;
8699
}
87100

88-
private string MemberExpressionHelper(MemberExpression expression)
101+
private void MemberExpressionHelper(MemberExpression expression, Stack<string> searchStack, Stack<FormatInfo> formatInfoStack)
89102
{
90103
MemberInfo member = expression.Member;
91-
string result = string.Empty;
104+
92105

93106
if (member.DeclaringType == typeof(AdvancedSearchFilter))
94107
{
95-
result = member.Name.Replace(BOOL_PROPERTY_PREFIX, string.Empty).ToLower();
108+
string result = member.Name.Replace(BOOL_PROPERTY_PREFIX, string.Empty).ToLower();
109+
formatInfoStack.Push(expression.ToFormatInfo());
110+
searchStack.Push(result);
96111
if (expression.Type == typeof(bool))
97112
{
98-
result = result + ":1";
113+
searchStack.Push("1");
114+
99115
}
100-
else
101-
{
102-
result = result + ":{0}";
103-
}
104-
105116
}
106-
return result;
107117
}
108118

109119

@@ -137,28 +147,48 @@ private static bool IsAdvancedSearchMemberExpression(Expression expression)
137147
MemberExpression memberExpression = expression as MemberExpression;
138148
return memberExpression?.Member.DeclaringType == typeof(AdvancedSearchFilter);
139149
}
150+
151+
internal class FormatInfo
152+
{
153+
public string Pattern { get; private set; }
154+
public int ParameterCount { get; private set; }
155+
public bool IsCompound { get; private set; }
156+
157+
public FormatInfo(string pattern, int parameterCount = 0, bool isCompound = false)
158+
{
159+
Pattern = pattern;
160+
ParameterCount = parameterCount;
161+
IsCompound = isCompound;
162+
}
163+
164+
internal static FormatInfo Not = new FormatInfo("NOT(+{0}+)", 1, true);
165+
internal static FormatInfo NotEqual = Not;
166+
internal static FormatInfo AndAlso = new FormatInfo("(+{0}+AND+{1}+)", 2, true);
167+
internal static FormatInfo OrElse = new FormatInfo("(+{0}+OR+{1}+)", 2, true);
168+
internal static FormatInfo MemberAccess = new FormatInfo("{1}:{0}", 2);
169+
}
140170
}
141171

142172
public static class Extensions
143173
{
144-
public static string ToOperator(this Expression expression)
174+
internal static DefaultSearchFormatter.FormatInfo ToFormatInfo(this Expression expression)
145175
{
146176
ExpressionType? type = expression?.NodeType;
147-
string result = string.Empty;
148177
switch (type)
149178
{
150179
case ExpressionType.Not:
151180
case ExpressionType.NotEqual:
152-
result = "NOT(+{0}+)";
153-
break;
181+
return DefaultSearchFormatter.FormatInfo.Not;
154182
case ExpressionType.Equal:
155-
result = ":";
156-
break;
183+
throw new NotImplementedException("Currently not supporting Equal expression.");
157184
case ExpressionType.AndAlso:
158-
result = "(+{0}+AND)";
159-
break;
185+
return DefaultSearchFormatter.FormatInfo.AndAlso;
186+
case ExpressionType.MemberAccess:
187+
return DefaultSearchFormatter.FormatInfo.MemberAccess;
188+
case ExpressionType.OrElse:
189+
return DefaultSearchFormatter.FormatInfo.OrElse;
160190
}
161-
return result;
191+
throw new NotImplementedException($"{type.ToString()} is not implemented.");
162192
}
163193

164194
}

0 commit comments

Comments
 (0)