Skip to content

Commit

Permalink
Merge pull request #5 from amirrajan/oak-dynamicdb
Browse files Browse the repository at this point in the history
Updates for dynamic ORMs
  • Loading branch information
FransBouma committed Dec 12, 2013
2 parents 84b0ddf + 1b56948 commit ad9a984
Show file tree
Hide file tree
Showing 6 changed files with 97 additions and 10 deletions.
4 changes: 2 additions & 2 deletions OakDynamicDb.Bencher/Oak/Gemini.cs
Expand Up @@ -660,11 +660,11 @@ public virtual IEnumerable<string> Members()
{
var dictionary = new Prototype() as IDictionary<string, object>;

var delegates = Delegates();
var hashset = new HashSet<string>(Delegates().Select(s => s.Key));

Hash().ForEach<KeyValuePair<string, object>>(s =>
{
if (!delegates.Contains(s)) dictionary.Add(s.Key, s.Value);
if (!hashset.Contains(s.Key)) dictionary.Add(s.Key, s.Value);
});

return dictionary;
Expand Down
22 changes: 17 additions & 5 deletions OakDynamicDb.Bencher/Oak/Massive.cs
Expand Up @@ -95,11 +95,23 @@ public static List<dynamic> ToGeminiList(this IDataReader rdr, Func<dynamic, dyn

public static dynamic RecordToGemini(this IDataReader rdr, Func<dynamic, dynamic> projection)
{
dynamic e = new Gemini();
var d = e.Prototype as IDictionary<string, object>;
for (int i = 0; i < rdr.FieldCount; i++)
d.Add(rdr.GetName(i), DBNull.Value.Equals(rdr[i]) ? null : rdr[i]);
return projection(e);
if (projection == null)
{
var e = new Prototype() as IDictionary<string, object>;;
PopluateDynamicDictionary(rdr, e);
return e;
}
else
{
dynamic e = new Gemini();
PopluateDynamicDictionary(rdr, e.Prototype);
return projection(e);
}
}

public static void PopluateDynamicDictionary(this IDataReader rdr, IDictionary<string, object> d)
{
for (int i = 0; i < rdr.FieldCount; i++) d.Add(rdr.GetName(i), DBNull.Value.Equals(rdr[i]) ? null : rdr[i]);
}
}

Expand Down
14 changes: 14 additions & 0 deletions OakDynamicDb.Bencher/Oak/ReleaseNotes.txt
@@ -1,4 +1,18 @@
============== FOR VERSIONS ==============
gemini 1.3.2+
oak 2.7.0+
oak-edge 2.1.0+
cambium 1.5.7+
oak-json 1.1.5+
==============
Gemini method sped up to use hash set instead of a list. Performance
improvements for determinging which members are methods vs properties.

Performance improvements to DynamicRepository. Setting the projection to null
will give you a fast dictionary object as opposed to a dynamic type.


============== FOR VERSIONS ==============
gemini 1.3.1+
oak 2.6.9+
oak-edge 2.0.9+
Expand Down
8 changes: 7 additions & 1 deletion OakDynamicDb.Bencher/SalesOrderHeaders.cs
Expand Up @@ -15,11 +15,17 @@ public class SalesOrderHeader : DynamicModel
public SalesOrderHeader() : base() { }
}

public class SalesOrderHeaderDto : Gemini
{
public SalesOrderHeaderDto(object dto) : base(dto) { }
public SalesOrderHeaderDto() : base() { }
}

public class SalesOrderHeaders : DynamicRepository
{
public SalesOrderHeaders() : base("Sales.SalesOrderHeader", "SalesOrderID")
{
Projection = d => new SalesOrderHeader(d);

}
}
}
2 changes: 1 addition & 1 deletion OakDynamicDb.Bencher/packages.config
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="cambium" version="1.5.6" targetFramework="net45" />
<package id="cambium" version="1.5.7" targetFramework="net45" />
</packages>
57 changes: 56 additions & 1 deletion RawBencher/Program.cs
Expand Up @@ -97,9 +97,18 @@ static void Main(string[] args)
FetchSalesOrderHeaderDataTable();
}
for (int i = 0; i < loopAmount; i++)
{
FetchSalesOrderHeaderOakDynamicDbTypeless();
}
for (int i = 0; i < loopAmount; i++)
{
FetchSalesOrderHeaderOakDynamicDbDto();
}
for (int i = 0; i < loopAmount; i++)
{
FetchSalesOrderHeaderOakDynamicDb();
}


Console.WriteLine("\nIndividual entity fetch benches");
Console.WriteLine("------------------------------------------");
Expand Down Expand Up @@ -488,13 +497,56 @@ private static void FetchSalesOrderHeaderNH()

private static void FetchSalesOrderHeaderOakDynamicDb()
{
var frameworkName = "Oak.DynamicDb hydrating a dynamic type";
var frameworkName = "Oak.DynamicDb hydrating and binding a dynamic class, with change tracking";
var sw = new Stopwatch();
sw.Start();
var db = new OakDynamicDb.Bencher.SalesOrderHeaders();
db.Projection = d => new OakDynamicDb.Bencher.SalesOrderHeader(d);
var headers = db.All();

foreach (var header in headers)
{
if (header.SalesOrderID <= 0)
{
Console.WriteLine("Oak: Data is empty");
break;
}
}
sw.Stop();

ReportResult(frameworkName, sw.ElapsedMilliseconds, headers.Count());
}

private static void FetchSalesOrderHeaderOakDynamicDbTypeless()
{
var frameworkName = "Oak.DynamicDb hydrating and binding a typeless dynamic object, without change tracking";
var sw = new Stopwatch();
sw.Start();
var db = new OakDynamicDb.Bencher.SalesOrderHeaders();
db.Projection = null;
var headers = db.All();

foreach (var header in headers)
{
if (header.SalesOrderID <= 0)
{
Console.WriteLine("Oak: Data is empty");
break;
}
}
sw.Stop();

ReportResult(frameworkName, sw.ElapsedMilliseconds, headers.Count());
}

private static void FetchSalesOrderHeaderOakDynamicDbDto()
{
var frameworkName = "Oak.DynamicDb hydrating and binding a dynamic class, without change tracking";
var sw = new Stopwatch();
sw.Start();
var db = new OakDynamicDb.Bencher.SalesOrderHeaders();
db.Projection = d => new OakDynamicDb.Bencher.SalesOrderHeaderDto(d);
var headers = db.All();

foreach (var header in headers)
{
Expand All @@ -504,6 +556,9 @@ private static void FetchSalesOrderHeaderOakDynamicDb()
break;
}
}
sw.Stop();

ReportResult(frameworkName, sw.ElapsedMilliseconds, headers.Count());
}

private static void GetVersionStrings(Assembly a, out string fileVersion, out string assemblyVersion)
Expand Down

0 comments on commit ad9a984

Please sign in to comment.