Skip to content

Commit dda21e1

Browse files
author
rstam
committed
More work towards supporting LINQ queries against array elements.
1 parent 76c853c commit dda21e1

File tree

3 files changed

+471
-153
lines changed

3 files changed

+471
-153
lines changed

Driver/Linq/Expressions/ExpressionFormatter.cs

Lines changed: 87 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -132,90 +132,7 @@ protected override Expression VisitConditional(ConditionalExpression node)
132132
/// <returns>The ConstantExpression.</returns>
133133
protected override Expression VisitConstant(ConstantExpression node)
134134
{
135-
var value = node.Value;
136-
137-
var a = value as Array;
138-
if (a != null && a.Rank == 1)
139-
{
140-
var elementType = a.GetType().GetElementType();
141-
_sb.AppendFormat("{0}[]:{{ ", elementType.Name);
142-
var separator = "";
143-
foreach (var item in a)
144-
{
145-
_sb.Append(separator);
146-
_sb.Append(item.ToJson());
147-
separator = ", ";
148-
}
149-
_sb.Append(" }");
150-
return node;
151-
}
152-
153-
if (value.GetType() == typeof(bool))
154-
{
155-
_sb.Append(((bool)value) ? "true" : "false");
156-
return node;
157-
}
158-
159-
if (value.GetType() == typeof(DateTime))
160-
{
161-
var dt = (DateTime)value;
162-
163-
var formatted = dt.ToString("o");
164-
formatted = Regex.Replace(formatted, @"\.0000000", "");
165-
formatted = Regex.Replace(formatted, @"0000[Z+-]", "");
166-
167-
if (dt.Kind == DateTimeKind.Utc)
168-
{
169-
_sb.AppendFormat("DateTime:({0})", formatted);
170-
}
171-
else
172-
{
173-
_sb.AppendFormat("DateTime:({0}, {1})", formatted, dt.Kind);
174-
}
175-
return node;
176-
}
177-
178-
var e = value as Enum;
179-
if (e != null)
180-
{
181-
_sb.Append(e.GetType().Name + "." + e.ToString());
182-
return node;
183-
}
184-
185-
var regex = value as Regex;
186-
if (regex != null)
187-
{
188-
var pattern = regex.ToString();
189-
var options = regex.Options;
190-
_sb.Append("Regex:(@\"");
191-
_sb.Append(pattern);
192-
_sb.Append("\"");
193-
if (options != RegexOptions.None)
194-
{
195-
_sb.AppendFormat(", {0}", options.ToString());
196-
}
197-
_sb.Append(")");
198-
return node;
199-
}
200-
201-
var s = value as string;
202-
if (s != null)
203-
{
204-
s = Regex.Replace(s, @"([""\\])", @"\\$1");
205-
_sb.Append("\"");
206-
_sb.Append(s);
207-
_sb.Append("\"");
208-
return node;
209-
}
210-
211-
if (value.GetType() == typeof(TimeSpan))
212-
{
213-
var ts = (TimeSpan)value;
214-
_sb.AppendFormat("TimeSpan:({0})", ts.ToString());
215-
return node;
216-
}
217-
218-
_sb.Append(value.ToString());
135+
VisitValue(node.Value);
219136
return node;
220137
}
221138

@@ -504,5 +421,91 @@ private string PublicClassName(Type type)
504421
}
505422
return FriendlyClassName(type);
506423
}
424+
425+
private void VisitValue(object value)
426+
{
427+
var a = value as Array;
428+
if (a != null && a.Rank == 1)
429+
{
430+
var elementType = a.GetType().GetElementType();
431+
_sb.AppendFormat("{0}[]:{{ ", elementType.Name);
432+
var separator = "";
433+
foreach (var item in a)
434+
{
435+
_sb.Append(separator);
436+
VisitValue(item);
437+
separator = ", ";
438+
}
439+
_sb.Append(" }");
440+
return;
441+
}
442+
443+
if (value.GetType() == typeof(bool))
444+
{
445+
_sb.Append(((bool)value) ? "true" : "false");
446+
return;
447+
}
448+
449+
if (value.GetType() == typeof(DateTime))
450+
{
451+
var dt = (DateTime)value;
452+
453+
var formatted = dt.ToString("o");
454+
formatted = Regex.Replace(formatted, @"\.0000000", "");
455+
formatted = Regex.Replace(formatted, @"0000[Z+-]", "");
456+
457+
if (dt.Kind == DateTimeKind.Utc)
458+
{
459+
_sb.AppendFormat("DateTime:({0})", formatted);
460+
}
461+
else
462+
{
463+
_sb.AppendFormat("DateTime:({0}, {1})", formatted, dt.Kind);
464+
}
465+
return;
466+
}
467+
468+
var e = value as Enum;
469+
if (e != null)
470+
{
471+
_sb.Append(e.GetType().Name + "." + e.ToString());
472+
return;
473+
}
474+
475+
var regex = value as Regex;
476+
if (regex != null)
477+
{
478+
var pattern = regex.ToString();
479+
var options = regex.Options;
480+
_sb.Append("Regex:(@\"");
481+
_sb.Append(pattern);
482+
_sb.Append("\"");
483+
if (options != RegexOptions.None)
484+
{
485+
_sb.AppendFormat(", {0}", options.ToString());
486+
}
487+
_sb.Append(")");
488+
return;
489+
}
490+
491+
var s = value as string;
492+
if (s != null)
493+
{
494+
s = Regex.Replace(s, @"([""\\])", @"\\$1");
495+
_sb.Append("\"");
496+
_sb.Append(s);
497+
_sb.Append("\"");
498+
return;
499+
}
500+
501+
if (value.GetType() == typeof(TimeSpan))
502+
{
503+
var ts = (TimeSpan)value;
504+
_sb.AppendFormat("TimeSpan:({0})", ts.ToString());
505+
return;
506+
}
507+
508+
_sb.Append(value.ToString());
509+
}
507510
}
508511
}

0 commit comments

Comments
 (0)