/// <inheritdoc /> public async Task Save(IndexValue indexValue) { using var session = _sessionFunc(); var values = indexValue.IndexValues().ToArray(); var id = (StringValue)values.First(x => x.Name == "internal_forResource").Values[0]; var resource = (StringValue)values.First(x => x.Name == "internal_resource").Values[0]; var canonicalId = (StringValue)values.First(x => x.Name == "internal_Id").Values[0]; var entry = new IndexEntry(id.Value, canonicalId.Value, resource.Value, new Dictionary <string, object>()); foreach (var value in values) { var array = value.Values.Where(x => x != null).Select(GetValue).ToHashSet(); var o = array.Count == 1 ? array.First() : array; if (entry.Values.ContainsKey(value.Name)) { var existing = entry.Values[value.Name]; switch (existing) { case HashSet <object> l: switch (o) { case HashSet <object> list: foreach (var item in list) { l.Add(item); } break; default: l.Add(o); break; } entry.Values[value.Name] = l; break; case object x: entry.Values[value.Name] = new HashSet <object> { x, o }; break; } } else { entry.Values.Add(value.Name, o); } } session.DeleteWhere <IndexEntry>(x => x.CanonicalId == canonicalId.Value); session.Store(entry); await session.SaveChangesAsync().ConfigureAwait(false); }
public static IEnumerable <IndexValue> NonInternalValues(this IndexValue root) { return(root.IndexValues().Where(v => !v.Name.StartsWith("internal_"))); }