Skip to content

Commit

Permalink
Improve DAT compare speed leveraging new hashes from DMSLib
Browse files Browse the repository at this point in the history
  • Loading branch information
tslater2006 committed May 7, 2019
1 parent 1ca9e77 commit d279ece
Showing 1 changed file with 61 additions and 89 deletions.
150 changes: 61 additions & 89 deletions DMS Viewer/DATCompareDialog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using System.Drawing;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using DMSLib;

Expand Down Expand Up @@ -327,122 +328,93 @@ public CompareWorker(DMSTable[] selected, DMSFile target)

private void OnDoWork(object sender, DoWorkEventArgs e)
{
foreach (var table in tables)
{
/* determine if this table exists in target file */
var targetTables = file.Tables.Where(t => t.Name == table.Name).ToList();
if (targetTables.Count == 0)
Parallel.ForEach(tables, table =>
{
foreach (var row in table.Rows)
/* determine if this table exists in target file */
var targetTables = file.Tables.Where(t => t.Name == table.Name).ToList();
if (targetTables.Count == 0)
{
row.CompareResult = DMSCompareResult.NEW;
}

ReportProgress(table.Rows.Count);
}
else
{
var keyFieldIndexes = table.Metadata.FieldMetadata
.Where(m => m.UseEditMask.HasFlag(UseEditFlags.KEY))
.Select(t => table.Columns.IndexOf(table.Columns
.First(c => c.Name == t.FieldName))).ToArray();
foreach (var row in table.Rows)
{
row.CompareResult = DMSCompareResult.NEW;
}

/* for each row in source table, compare against target tables */
foreach (var row in table.Rows)
ReportProgress(table.Rows.Count);
}
else
{
row.CompareResult = DMSCompareResult.NONE;
var keyFieldIndexes = table.Metadata.FieldMetadata
.Where(m => m.UseEditMask.HasFlag(UseEditFlags.KEY))
.Select(t => table.Columns.IndexOf(table.Columns
.First(c => c.Name == t.FieldName))).ToArray();

foreach (var targetRow in targetTables.SelectMany(t => t.Rows))
{
CompareRows(row, targetRow, keyFieldIndexes);
if (row.CompareResult != DMSCompareResult.NONE)
/* for each row in source table, compare against target tables */
Parallel.ForEach(table.Rows, row =>
{
break;
row.CompareResult = DMSCompareResult.NONE;

foreach (var targetRow in targetTables.SelectMany(t => t.Rows))
{
CompareRows(row, targetRow, keyFieldIndexes);
if (row.CompareResult != DMSCompareResult.NONE)
{
break;
}
}

if (row.CompareResult == DMSCompareResult.NONE)
{
row.CompareResult = DMSCompareResult.NEW;
}

ReportProgress(1);
}
}
);

if (row.CompareResult == DMSCompareResult.NONE)
if (table.Rows.Any(r => r.CompareResult == DMSCompareResult.UPDATE))
{
row.CompareResult = DMSCompareResult.NEW;
table.CompareResult = DMSCompareResult.UPDATE;
}
else
{
table.CompareResult = table.Rows.Any(r => r.CompareResult == DMSCompareResult.NEW)
? DMSCompareResult.NEW
: DMSCompareResult.SAME;
}

ReportProgress(1);
}

if (table.Rows.Any(r => r.CompareResult == DMSCompareResult.UPDATE))
{
table.CompareResult = DMSCompareResult.UPDATE;
}
else
{
table.CompareResult = table.Rows.Any(r => r.CompareResult == DMSCompareResult.NEW)
? DMSCompareResult.NEW
: DMSCompareResult.SAME;
}
}
}
);
}

void CompareRows(DMSRow left, DMSRow right, int[] keyFields)
{
/* get list of values */
List<string> leftValues = new List<string>();
List<string> rightValues = new List<string>();

for(var x =0; x < left.Indexes.Length - 1; x++)
bool isSame = false;
if (left.ValueHash == right.ValueHash)
{
var colType = left.GetFieldType(x);
var isDate = (colType == FieldTypes.DATE || colType == FieldTypes.DATETIME || colType == FieldTypes.TIME);
var isVersion = left.GetColumnName(x).Equals("VERSION");

if (ignoreDates && isDate)
isSame = true;
if (!ignoreDates)
{
continue;
} else if (ignoreVersion && isVersion)
{
continue;
} else
{
leftValues.Add(left.GetStringValue(x));
isSame = left.DateHash == right.DateHash;
}
}

for (var x = 0; x < right.Indexes.Length - 1; x++)
{
var colType = right.GetFieldType(x);
var isDate = (colType == FieldTypes.DATE || colType == FieldTypes.DATETIME || colType == FieldTypes.TIME);
var isVersion = right.GetColumnName(x).Equals("VERSION");

if (ignoreDates && isDate)
{
continue;
}
else if (ignoreVersion && isVersion)
if (!ignoreVersion && isSame)
{
continue;
}
else
{
rightValues.Add(right.GetStringValue(x));
isSame = left.VersionHash == right.VersionHash;
}
}

/* check for "same" first */
if (leftValues.SequenceEqual(rightValues))
if (isSame)
{
/* rows are identical */
left.CompareResult = DMSCompareResult.SAME;
return;
}

/* do the rows have the same keys? if so its changed */
if (keyFields.Select(left.GetStringValue).SequenceEqual(keyFields.Select(right.GetStringValue)))
{
left.CompareResult = DMSCompareResult.UPDATE;
}
else
} else
{
left.CompareResult = DMSCompareResult.NONE;
if (left.KeyHash == right.KeyHash)
{
left.CompareResult = DMSCompareResult.UPDATE;
} else
{
left.CompareResult = DMSCompareResult.NEW;
}
}
}
}
Expand Down

0 comments on commit d279ece

Please sign in to comment.