using LinqToDB; using LinqToDB.Mapping; using Newtonsoft.Json; namespace Azaion.Common.Database; public static class AnnotationsDbSchemaHolder { public static readonly MappingSchema MappingSchema; static AnnotationsDbSchemaHolder() { MappingSchema = new MappingSchema(); var builder = new FluentMappingBuilder(MappingSchema); var annotationBuilder = builder.Entity(); annotationBuilder.HasTableName(Constants.ANNOTATIONS_TABLENAME) .HasPrimaryKey(x => x.Name) .Association(a => a.Detections, (a, d) => a.Name == d.AnnotationName) .Property(x => x.Time) .HasDataType(DataType.Int64) .HasConversion(ts => ts.Ticks, t => new TimeSpan(t)); annotationBuilder .Ignore(x => x.Milliseconds) .Ignore(x => x.Classes) .Ignore(x => x.ImagePath) .Ignore(x => x.LabelPath) .Ignore(x => x.ThumbPath) .Ignore(x => x.ClassName) .Ignore(x => x.Colors) .Ignore(x => x.SplitTile) .Ignore(x => x.IsSplit) .Ignore(x => x.TimeStr); builder.Entity() .HasTableName(Constants.DETECTIONS_TABLENAME); builder.Entity() .HasTableName(Constants.ANNOTATIONS_QUEUE_TABLENAME) .HasPrimaryKey(x => x.Id) .Property(x => x.AnnotationNames) .HasDataType(DataType.NVarChar) .HasConversion(list => JsonConvert.SerializeObject(list), str => JsonConvert.DeserializeObject>(str) ?? new List()); builder.Entity() .HasTableName(Constants.MEDIAFILE_TABLENAME) .HasPrimaryKey(x => x.Hash) .Association(a => a.Annotations, (mf, a) => mf.Name == a.OriginalMediaName || mf.Hash == a.MediaHash); builder.Build(); } }