Skip to content

Commit

Permalink
Merge pull request #163 from mathijs-dumon/master
Browse files Browse the repository at this point in the history
Added a generic Oracle class
  • Loading branch information
ahmad-moussawi committed Nov 29, 2018
2 parents a33a677 + 8b6cacb commit b28d16a
Show file tree
Hide file tree
Showing 5 changed files with 367 additions and 79 deletions.
155 changes: 79 additions & 76 deletions QueryBuilder.Tests/Oracle11gLimitTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,86 +3,89 @@
using SqlKata.Compilers;
using Xunit;

public class Oracle11gLimitTests
namespace SqlKata.Tests
{
private const string TableName = "Table";
private const string SqlPlaceholder = "GENERATED_SQL";

private Oracle11gCompiler compiler = new Oracle11gCompiler();

[Fact]
public void CompileLimitThrowsException()
public class Oracle11gLimitTests
{
// Arrange:
var query = new Query(TableName);
var ctx = new SqlResult {Query = query};

// Act:
Assert.Throws<NotSupportedException>(() => compiler.CompileLimit(ctx));

// Assert: Assertion is handled by Throws
}

[Fact]
public void WithNoLimitNorOffset()
{
// Arrange:
var query = new Query(TableName);
var ctx = new SqlResult {Query = query, RawSql = SqlPlaceholder};

// Act:
compiler.ApplyLimit(ctx);

// Assert:
Assert.Equal(SqlPlaceholder, ctx.RawSql);
}
private const string TableName = "Table";
private const string SqlPlaceholder = "GENERATED_SQL";

[Fact]
public void WithNoOffset()
{
// Arrange:
var query = new Query(TableName).Limit(10);
var ctx = new SqlResult {Query = query, RawSql = SqlPlaceholder};

// Act:
compiler.ApplyLimit(ctx);

// Assert:
Assert.Matches($"SELECT \\* FROM \\({SqlPlaceholder}\\) WHERE ROWNUM <= ?", ctx.RawSql);
Assert.Equal(10, ctx.Bindings[0]);
Assert.Single(ctx.Bindings);
}
private Oracle11gCompiler compiler = new Oracle11gCompiler();

[Fact]
public void WithNoLimit()
{
// Arrange:
var query = new Query(TableName).Offset(20);
var ctx = new SqlResult {Query = query, RawSql = SqlPlaceholder};

// Act:
compiler.ApplyLimit(ctx);

// Assert:
Assert.Matches($"SELECT \\* FROM \\(SELECT \"(SqlKata_.*__)\"\\.\\*, ROWNUM \"(SqlKata_.*__)\" FROM \\({SqlPlaceholder}\\) \"(SqlKata_.*__)\"\\) WHERE \"(SqlKata_.*__)\" > \\?", ctx.RawSql);
Assert.Equal(20, ctx.Bindings[0]);
Assert.Single(ctx.Bindings);
}
[Fact]
public void CompileLimitThrowsException()
{
// Arrange:
var query = new Query(TableName);
var ctx = new SqlResult { Query = query };

[Fact]
public void WithLimitAndOffset()
{
// Arrange:
var query = new Query(TableName).Limit(5).Offset(20);
var ctx = new SqlResult {Query = query, RawSql = SqlPlaceholder};

// Act:
compiler.ApplyLimit(ctx);

// Assert:
Assert.Matches($"SELECT \\* FROM \\(SELECT \"(SqlKata_.*__)\"\\.\\*, ROWNUM \"(SqlKata_.*__)\" FROM \\({SqlPlaceholder}\\) \"(SqlKata_.*__)\" WHERE ROWNUM <= \\?\\) WHERE \"(SqlKata_.*__)\" > \\?", ctx.RawSql);
Assert.Equal(25, ctx.Bindings[0]);
Assert.Equal(20, ctx.Bindings[1]);
Assert.Equal(2, ctx.Bindings.Count);
// Act:
Assert.Throws<NotSupportedException>(() => compiler.CompileLimit(ctx));

// Assert: Assertion is handled by Throws
}

[Fact]
public void WithNoLimitNorOffset()
{
// Arrange:
var query = new Query(TableName);
var ctx = new SqlResult { Query = query, RawSql = SqlPlaceholder };

// Act:
compiler.ApplyLimit(ctx);

// Assert:
Assert.Equal(SqlPlaceholder, ctx.RawSql);
}

[Fact]
public void WithNoOffset()
{
// Arrange:
var query = new Query(TableName).Limit(10);
var ctx = new SqlResult { Query = query, RawSql = SqlPlaceholder };

// Act:
compiler.ApplyLimit(ctx);

// Assert:
Assert.Matches($"SELECT \\* FROM \\({SqlPlaceholder}\\) WHERE ROWNUM <= ?", ctx.RawSql);
Assert.Equal(10, ctx.Bindings[0]);
Assert.Single(ctx.Bindings);
}

[Fact]
public void WithNoLimit()
{
// Arrange:
var query = new Query(TableName).Offset(20);
var ctx = new SqlResult { Query = query, RawSql = SqlPlaceholder };

// Act:
compiler.ApplyLimit(ctx);

// Assert:
Assert.Matches($"SELECT \\* FROM \\(SELECT \"(SqlKata_.*__)\"\\.\\*, ROWNUM \"(SqlKata_.*__)\" FROM \\({SqlPlaceholder}\\) \"(SqlKata_.*__)\"\\) WHERE \"(SqlKata_.*__)\" > \\?", ctx.RawSql);
Assert.Equal(20, ctx.Bindings[0]);
Assert.Single(ctx.Bindings);
}

[Fact]
public void WithLimitAndOffset()
{
// Arrange:
var query = new Query(TableName).Limit(5).Offset(20);
var ctx = new SqlResult { Query = query, RawSql = SqlPlaceholder };

// Act:
compiler.ApplyLimit(ctx);

// Assert:
Assert.Matches($"SELECT \\* FROM \\(SELECT \"(SqlKata_.*__)\"\\.\\*, ROWNUM \"(SqlKata_.*__)\" FROM \\({SqlPlaceholder}\\) \"(SqlKata_.*__)\" WHERE ROWNUM <= \\?\\) WHERE \"(SqlKata_.*__)\" > \\?", ctx.RawSql);
Assert.Equal(25, ctx.Bindings[0]);
Assert.Equal(20, ctx.Bindings[1]);
Assert.Equal(2, ctx.Bindings.Count);
}
}
}
89 changes: 89 additions & 0 deletions QueryBuilder.Tests/OracleLegacyLimit.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
using System;
using SqlKata;
using SqlKata.Compilers;
using Xunit;

namespace SqlKata.Tests
{
public class OracleLegacyLimitTests
{
private const string TableName = "Table";
private const string SqlPlaceholder = "GENERATED_SQL";

private OracleCompiler compiler = new OracleCompiler()
{
UseLegacyPagination = true
};

[Fact]
public void NoLimitNorOffset()
{
// Arrange:
var query = new Query(TableName);
var ctx = new SqlResult { Query = query, RawSql = SqlPlaceholder };

// Act & Assert:
var result = compiler.CompileLimit(ctx);
compiler.ApplyLegacyLimit(ctx, 0, 0);

Assert.Null(result);
Assert.Equal(SqlPlaceholder, ctx.RawSql);
}

[Fact]
public void LimitOnly()
{
// Arrange:
var query = new Query(TableName).Limit(10);
var ctx = new SqlResult { Query = query, RawSql = SqlPlaceholder };

// Act:
var result = compiler.CompileLimit(ctx);
compiler.ApplyLegacyLimit(ctx, 10, 0);

// Assert:
Assert.Null(result);
Assert.Matches($"SELECT \\* FROM \\({SqlPlaceholder}\\) WHERE ROWNUM <= ?", ctx.RawSql);
Assert.Equal(10, ctx.Bindings[0]);
Assert.Single(ctx.Bindings);
}

[Fact]
public void OffsetOnly()
{
// Arrange:
var query = new Query(TableName).Offset(20);
var ctx = new SqlResult { Query = query, RawSql = SqlPlaceholder };

// Act & Assert:
var result = compiler.CompileLimit(ctx);
compiler.ApplyLegacyLimit(ctx, 0, 20);

// Assert:
//Assert.Null(result);
Assert.Matches($"SELECT \\* FROM \\(SELECT \"(SqlKata_.*__)\"\\.\\*, ROWNUM \"(SqlKata_.*__)\" FROM \\({SqlPlaceholder}\\) \"(SqlKata_.*__)\"\\) WHERE \"(SqlKata_.*__)\" > \\?", ctx.RawSql);
Assert.Equal(20, ctx.Bindings[0]);
Assert.Single(ctx.Bindings);

}

[Fact]
public void LimitAndOffset()
{
// Arrange:
var query = new Query(TableName).Limit(5).Offset(20);
var ctx = new SqlResult { Query = query, RawSql = SqlPlaceholder };

// Act & Assert:
var result = compiler.CompileLimit(ctx);
compiler.ApplyLegacyLimit(ctx, 5, 20);

// Assert:
Assert.Null(result);
Assert.Matches($"SELECT \\* FROM \\(SELECT \"(SqlKata_.*__)\"\\.\\*, ROWNUM \"(SqlKata_.*__)\" FROM \\({SqlPlaceholder}\\) \"(SqlKata_.*__)\" WHERE ROWNUM <= \\?\\) WHERE \"(SqlKata_.*__)\" > \\?", ctx.RawSql);
Assert.Equal(25, ctx.Bindings[0]);
Assert.Equal(20, ctx.Bindings[1]);
Assert.Equal(2, ctx.Bindings.Count);
}
}
}
71 changes: 71 additions & 0 deletions QueryBuilder.Tests/OracleLimitTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
using System;
using SqlKata;
using SqlKata.Compilers;
using Xunit;

namespace SqlKata.Tests
{
public class OracleLimitTests
{
private const string TableName = "Table";
private const string SqlPlaceholder = "GENERATED_SQL";

private OracleCompiler compiler = new OracleCompiler();

[Fact]
public void NoLimitNorOffset()
{
// Arrange:
var query = new Query(TableName);
var ctx = new SqlResult { Query = query, RawSql = SqlPlaceholder };

// Act & Assert:
Assert.Null(compiler.CompileLimit(ctx));
}

[Fact]
public void LimitOnly()
{
// Arrange:
var query = new Query(TableName).Limit(10);
var ctx = new SqlResult { Query = query, RawSql = SqlPlaceholder };

// Act & Assert:
Assert.EndsWith("OFFSET ? ROWS FETCH NEXT ? ROWS ONLY", compiler.CompileLimit(ctx));
Assert.Equal(2, ctx.Bindings.Count);
Assert.Equal(0, ctx.Bindings[0]);
Assert.Equal(10, ctx.Bindings[1]);
}

[Fact]
public void OffsetOnly()
{
// Arrange:
var query = new Query(TableName).Offset(20);
var ctx = new SqlResult { Query = query, RawSql = SqlPlaceholder };

// Act & Assert:
Assert.EndsWith("OFFSET ? ROWS", compiler.CompileLimit(ctx));

Assert.Single(ctx.Bindings);
Assert.Equal(20, ctx.Bindings[0]);
}

[Fact]
public void LimitAndOffset()
{
// Arrange:
var query = new Query(TableName).Limit(5).Offset(20);
var ctx = new SqlResult { Query = query, RawSql = SqlPlaceholder };

// Act & Assert:
Assert.EndsWith("OFFSET ? ROWS FETCH NEXT ? ROWS ONLY", compiler.CompileLimit(ctx));

Assert.Equal(2, ctx.Bindings.Count);
Assert.Equal(20, ctx.Bindings[0]);
Assert.Equal(5, ctx.Bindings[1]);

compiler.CompileLimit(ctx);
}
}
}
Loading

0 comments on commit b28d16a

Please sign in to comment.