public override void OnPut(string key, RavenJObject document, RavenJObject metadata, TransactionInformation transactionInformation)
{
if (key.StartsWith("Raven/"))
{
return;
}
var entityName = metadata.Value <string>(Constants.RavenEntityName) + "/";
var properties = metadata.Value <RavenJArray>(Constants.EnsureUniqueConstraints);
if (properties == null || properties.Length <= 0)
{
return;
}
var oldDoc = Database.Get(key, transactionInformation);
if (oldDoc == null)
{
return;
}
foreach (var property in metadata.Value <RavenJArray>(Constants.EnsureUniqueConstraints))
{
var constraint = Util.GetConstraint(property);
var newProp = document[constraint.PropName];
// Handle Updates in the constraint since it changed
var prefix = "UniqueConstraints/" + entityName + constraint.PropName + "/";
var oldProp = oldDoc.DataAsJson[constraint.PropName];
string[] oldUniqueValues;
if (!Util.TryGetUniqueValues(oldProp, out oldUniqueValues))
{
continue;
}
string[] newUniqueValues;
if (Util.TryGetUniqueValues(newProp, out newUniqueValues))
{
var join = (from oldValue in oldUniqueValues
join newValue in newUniqueValues
on oldValue equals newValue
select oldValue);
if (join.Count() == oldUniqueValues.Count())
{
continue;
}
}
foreach (var oldUniqueValue in oldUniqueValues)
{
Database.Delete(prefix + Util.EscapeUniqueValue(oldUniqueValue, constraint.CaseInsensitive), null, transactionInformation);
}
}
}