Skip to content

Commit e70b834

Browse files
committed
Fix the contains filter for SQLite data source.
1 parent d3e57aa commit e70b834

2 files changed

Lines changed: 60 additions & 10 deletions

File tree

DataSource.DataProviders.SQLite/SQLiteDataProvider/SQLiteDataSourceFilterExpressionVisitor.cs

Lines changed: 50 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Text;
33
using SQLite;
4+
using System.Collections.Generic;
45

56
#if !PORTABLE
67
using System.Runtime.CompilerServices;
@@ -275,6 +276,7 @@ public override void VisitFunctionExpression(FunctionFilterExpression expression
275276
string prefix = null;
276277
string between = null;
277278
string postfix = null;
279+
bool unquote = false;
278280

279281
switch (expression.FunctionType)
280282
{
@@ -286,13 +288,15 @@ public override void VisitFunctionExpression(FunctionFilterExpression expression
286288
between = " || ";
287289
break;
288290
case FilterExpressionFunctionType.Contains:
291+
unquote = true;
289292
between = " LIKE '%";
290293
postfix = "%'";
291294
break;
292295
case FilterExpressionFunctionType.Day:
293296
throw new NotImplementedException();
294297
break;
295298
case FilterExpressionFunctionType.EndsWith:
299+
unquote = true;
296300
between = " LIKE '%";
297301
postfix = "'";
298302
break;
@@ -324,6 +328,7 @@ public override void VisitFunctionExpression(FunctionFilterExpression expression
324328
throw new NotImplementedException();
325329
break;
326330
case FilterExpressionFunctionType.StartsWith:
331+
unquote = true;
327332
between = " LIKE '";
328333
postfix = "%'";
329334
break;
@@ -351,7 +356,6 @@ public override void VisitFunctionExpression(FunctionFilterExpression expression
351356
}
352357
if (prefix != null)
353358
{
354-
_sb.Append("(");
355359
_sb.Append(prefix);
356360
}
357361
bool first = true;
@@ -373,7 +377,10 @@ public override void VisitFunctionExpression(FunctionFilterExpression expression
373377
_sb.Append(", ");
374378
}
375379
}
380+
381+
SuppressQuotes(true);
376382
Visit(expression.FunctionArguments[i]);
383+
UnsuppressQuotes();
377384
}
378385

379386
if (functionName != null)
@@ -383,14 +390,34 @@ public override void VisitFunctionExpression(FunctionFilterExpression expression
383390
if (postfix != null)
384391
{
385392
_sb.Append(postfix);
386-
_sb.Append(")");
387393
}
388394
}
389395

390-
/// <summary>
391-
/// Visits a literal expression.
392-
/// </summary>
393-
/// <param name="expression">The literal expression to visit.</param>
396+
private Stack<bool> _quotesSuppressed = new Stack<bool>();
397+
private void UnsuppressQuotes()
398+
{
399+
_quotesSuppressed.Pop();
400+
}
401+
402+
private void SuppressQuotes(bool suppress)
403+
{
404+
_quotesSuppressed.Push(suppress);
405+
}
406+
407+
private bool AreQuotesSuppressed()
408+
{
409+
if (_quotesSuppressed.Count == 0 || !_quotesSuppressed.Peek())
410+
{
411+
return false;
412+
}
413+
414+
return true;
415+
}
416+
417+
/// <summary>
418+
/// Visits a literal expression.
419+
/// </summary>
420+
/// <param name="expression">The literal expression to visit.</param>
394421
public override void VisitLiteralExpression(LiteralFilterExpression expression)
395422
{
396423
RenderLiteral(expression, expression.LiteralValue);
@@ -400,11 +427,25 @@ private void RenderLiteral(LiteralFilterExpression expression, object literalVal
400427
{
401428
var value = _literalEmitter.EmitLiteral(literalValue, expression.LeaveUnquoted);
402429

430+
if (AreQuotesSuppressed() && value is string)
431+
{
432+
if (value.StartsWith("'") && value.EndsWith("'"))
433+
{
434+
value = value.Substring(1, value.Length - 2);
435+
}
436+
}
437+
if (AreQuotesSuppressed() && value is string)
438+
{
439+
if (value.StartsWith("\"") && value.EndsWith("\""))
440+
{
441+
value = value.Substring(1, value.Length - 2);
442+
}
443+
}
403444
//TODO: need to do special stuff here for dates etc.
404445

405-
// JM 02-01-2016 - Graham: Please review this
406-
//if (literalValue is DateTime || literalValue is DateTimeOffset)
407-
// value = "datetime'" + value + "'";
446+
// JM 02-01-2016 - Graham: Please review this
447+
//if (literalValue is DateTime || literalValue is DateTimeOffset)
448+
// value = "datetime'" + value + "'";
408449

409450
_sb.Append(value);
410451
}

DataSource.DataProviders.SQLite/SQLiteDataProvider/SQLiteVirtualDataSourceDataProviderWorker.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -512,7 +512,16 @@ private async Task<SQLiteDataSourceQueryResult> GetResult(string query, MethodIn
512512
{
513513
SQLiteDataSourceQueryResult res = new SQLiteDataSourceQueryResult();
514514

515-
var count = await _connection.ExecuteScalarAsync<int>("SELECT count(*) FROM " + _tableExpression);
515+
var filter = _filterString;
516+
if (filter == null)
517+
{
518+
filter = "";
519+
}
520+
else
521+
{
522+
filter = " WHERE " + filter;
523+
}
524+
var count = await _connection.ExecuteScalarAsync<int>("SELECT count(*) FROM " + _tableExpression + filter);
516525
res.FullCount = count;
517526

518527
t.Wait();

0 commit comments

Comments
 (0)