private void ParseDimensions(Dictionary <string, object> dimensionsJson)
        {
            foreach (KeyValuePair <string, object> systemKeyValuePair in dimensionsJson)
            {
                var dimensionJson = (Dictionary <string, object>)systemKeyValuePair.Value;
                var dimension     = new DimensionDefinition {
                    Key             = systemKeyValuePair.Key,
                    Name            = Parse <string>(dimensionJson, "name"),
                    Symbol          = Parse <string>(dimensionJson, "symbol"),
                    DerivedString   = Parse <string>(dimensionJson, "derived"),
                    BaseUnitName    = Parse <string>(dimensionJson, "baseUnit"),
                    Vector          = Parse <bool>(dimensionJson, "vector"),
                    IsDimensionless = Parse <bool>(dimensionJson, "dimensionless"),
                    InheritedUnits  = Parse <string>(dimensionJson, "inheritedUnits")
                };
                dimension.OtherNames.AddRange(ParseArray <string>(dimensionJson, "otherNames"));
                dimension.OtherSymbols.AddRange(ParseArray <string>(dimensionJson, "otherSymbols"));

                ParseUnits(dimensionJson, dimension);
                MeasurementCorpus.Dimensions.Add(dimension);
            }
            MeasurementCorpus.Dimensions.ForEach(s => s.UpdateDerived());
            List <DimensionDefinition> inheritingDims = MeasurementCorpus.Dimensions.Where(d => !string.IsNullOrWhiteSpace(d.InheritedUnits)).ToList();

            inheritingDims.ForEach(a => a.Units.AddRange(MeasurementCorpus.Dimensions.First(d => d.Key == a.InheritedUnits).Units));
            inheritingDims.ForEach(a => a.Units.ForEach(u => u.InheritedDimensionDefinitions.Add(a)));
            inheritingDims.ForEach(a => a.BaseUnit = a.Units.First(u => u.Key == a.BaseUnitName));
        }
Esempio n. 2
0
        public void TestDimensionComparer()
        {
            var def1 = new DimensionDefinition {
                Key = "test1"
            };
            var def2 = new DimensionDefinition {
                Key = "test1"
            };

            Assert.AreEqual(0, DimensionDefinitionComparer.Comparer.Compare(null, null));
            Assert.AreEqual(1, DimensionDefinitionComparer.Comparer.Compare(def1, null));
            Assert.AreEqual(-1, DimensionDefinitionComparer.Comparer.Compare(null, def2));
            Assert.AreEqual(0, DimensionDefinitionComparer.Comparer.Compare(def1, def2));

            def2.Key = "test0";
            Assert.AreEqual(-1, DimensionDefinitionComparer.Comparer.Compare(def1, def2));
            def2.Key = "test1";

            def1.IsDimensionless = true;
            Assert.AreEqual(-1, DimensionDefinitionComparer.Comparer.Compare(def1, def2));
            def2.IsDimensionless = true;
            Assert.AreEqual(0, DimensionDefinitionComparer.Comparer.Compare(def1, def2));
            def1.Vector = true;
            Assert.AreEqual(-1, DimensionDefinitionComparer.Comparer.Compare(def1, def2));
            def2.Vector = true;
            Assert.AreEqual(0, DimensionDefinitionComparer.Comparer.Compare(def1, def2));
            def2.DerivedString = "temperature";
            def2.UpdateDerived();
            Assert.AreEqual(1, DimensionDefinitionComparer.Comparer.Compare(def1, def2));
            def1.DerivedString = "time*time";
            def1.UpdateDerived();
            Assert.AreEqual(0, DimensionDefinitionComparer.Comparer.Compare(def1, def2));
        }
 private void ParseUnits(Dictionary <string, object> dimensionJson, DimensionDefinition dimension)
 {
     foreach (KeyValuePair <string, object> unitKeyValuePair in (Dictionary <string, object>)dimensionJson["units"])
     {
         var unitJson = (Dictionary <string, object>)unitKeyValuePair.Value;
         var unit     = new Unit {
             Key    = unitKeyValuePair.Key,
             Name   = Parse <string>(unitJson, "name"),
             Plural = Parse <string>(unitJson, "plural"),
             DimensionDefinition = dimension,
             Type           = Parse <UnitType>(unitJson, "type"),
             Symbol         = Parse <string>(unitJson, "symbol"),
             Multiplier     = Parse <double>(unitJson, "multiplier"),
             Offset         = Parse <double>(unitJson, "offset"),
             IsRare         = Parse <bool>(unitJson, "rare"),
             IsEstimation   = Parse <bool>(unitJson, "estimation"),
             PrefixName     = Parse <string>(unitJson, "prefixName"),
             PrefixFreeName = Parse <string>(unitJson, "prefixFreeName")
         };
         unit.MeasurementSystemNames.AddRange(ParseArray <string>(unitJson, "systems"));
         unit.OtherNames.AddRange(ParseArray <string>(unitJson, "otherNames"));
         unit.OtherSymbols.AddRange(ParseArray <string>(unitJson, "otherSymbols"));
         unit.UpdateMeasurementSystems();
         dimension.Units.Add(unit);
         if (dimension.BaseUnitName == unit.Key)
         {
             dimension.BaseUnit = unit;
         }
     }
 }
 public static bool DimensionFilter(DimensionDefinition arg)
 {
     if (!Options.AllowVectorDimensions && arg.Vector)
     {
         return(false);
     }
     if (!Options.AllowDerivedDimensions && arg.IsDerived())
     {
         return(false);
     }
     if (Options.IgnoredDimensions.Contains(arg))
     {
         return(false);
     }
     return(true);
 }
Esempio n. 5
0
        public void TestDimensionFilter()
        {
            var def = new DimensionDefinition {
                Key = "test"
            };

            Assert.IsTrue(MeasurementCorpus.DimensionFilter(def));
            def.Vector = true;
            Assert.IsFalse(MeasurementCorpus.DimensionFilter(def));
            MeasurementCorpus.Options.AllowVectorDimensions = true;
            Assert.IsTrue(MeasurementCorpus.DimensionFilter(def));
            def.DerivedString = "temperature/time";
            def.UpdateDerived();
            Assert.IsTrue(MeasurementCorpus.DimensionFilter(def));
            MeasurementCorpus.Options.AllowDerivedDimensions = false;
            Assert.IsFalse(MeasurementCorpus.DimensionFilter(def));
            MeasurementCorpus.Options.AllowDerivedDimensions = true;
            Assert.IsTrue(MeasurementCorpus.DimensionFilter(def));
            MeasurementCorpus.Options.IgnoredDimensions.Add(def);
            Assert.IsFalse(MeasurementCorpus.DimensionFilter(def));
        }
        // Creates color scheme entries used to map dimension values, measures and colors.
        private ColorSchemeEntry CreateColorSchemeEntry(DataRow colorSchemeRecord,
                                                        IDashboardDataSource dataSource,
                                                        bool includeMeasures)
        {
            DimensionDefinition categoryDefinition = new DimensionDefinition("CategoryName");
            DimensionDefinition countryDefinition  = new DimensionDefinition("Country");
            MeasureDefinition   priceDefinition    = new MeasureDefinition("Extended Price");

            ColorSchemeEntry entry = new ColorSchemeEntry();

            entry.DimensionKeys.Add(new ColorSchemeDimensionKey(categoryDefinition,
                                                                colorSchemeRecord["CategoryName"]));
            entry.DimensionKeys.Add(new ColorSchemeDimensionKey(countryDefinition,
                                                                colorSchemeRecord["Country"]));
            if (includeMeasures)
            {
                entry.MeasureKey = new ColorSchemeMeasureKey(priceDefinition);
            }
            entry.ColorDefinition = new ColorDefinition((Color)colorSchemeRecord["color"]);
            entry.DataSource      = dataSource;
            return(entry);
        }
Esempio n. 7
0
        public static Population <Chromosome, BinaryRepresentation> GeneratePopulation(
            int populationSize,
            Domain domain,
            DimensionDefinition dimensionDefinition,
            int precision)
        {
            if (populationSize <= 0)
            {
                throw new InvalidOperationException("Population size should be greater than 0!");
            }

            var population = new List <Chromosome>();

            for (var size = 1; size <= populationSize; size++)
            {
                var chromosomeComponents =
                    DomainHelper.RandomDimensionalBinaryValueInDomainRange(domain, dimensionDefinition, precision);
                var chromosome = Chromosome.Create(chromosomeComponents);

                population.Add(chromosome);
            }

            return(Population <Chromosome, BinaryRepresentation> .Create(population));
        }
Esempio n. 8
0
        protected override void Seed(NeuCMS.Repositories.EntityFramework.ContentRepository context)
        {
            var nameSpace = new NameSpace()
            {
                Id            = 1,
                Description   = "Sample NeuCMS Content Data",
                NameSpaceName = "NeuCMS.Samples"
            };

            context.NameSpaces.AddOrUpdate(
                n => n.Id,
                nameSpace);

            var contentDef1 = new ContentDefinition()
            {
                Id                  = 1,
                Name                = "Message",
                NameSpace           = nameSpace,
                AvailableOnAllViews = false
            };

            var contentDef2 = new ContentDefinition()
            {
                Id                  = 2,
                Name                = "Image",
                NameSpace           = nameSpace,
                AvailableOnAllViews = false
            };

            var view = new View()
            {
                Id                 = 1,
                NameSpace          = nameSpace,
                ViewName           = "Home",
                ContentDefinitions = new List <ContentDefinition>()
                {
                    contentDef1,
                    contentDef2
                }
            };

            var dimDef = new DimensionDefinition()
            {
                Id = 1, DimensionName = "Language", NameSpace = nameSpace
            };

            var elementContent = new ElementContent()
            {
                Id      = 1,
                Content = "Hello World!",
                ContentElementDefinition = view.ContentDefinitions[0],
                Dimensions = new List <DimensionValue>()
                {
                    new DimensionValue()
                    {
                        Id = 1,
                        DimensionDefinition = dimDef,
                        Value = "English"
                    }
                }
            };

            var converter = new ImageConverter();
            var imgBytes  = (byte[])converter.ConvertTo(TestData.Test, typeof(byte[]));

            var mediaContent = new MediaContent()
            {
                Id = 2,
                ContentElementDefinition = view.ContentDefinitions[1],
                Dimensions = new List <DimensionValue>()
                {
                    new DimensionValue()
                    {
                        Id = 1,
                        DimensionDefinition = dimDef,
                        Value = "English"
                    }
                },
                DigitalAsset = new DigitalAsset()
                {
                    Id          = 1,
                    ContentType = "image/jpeg",
                    Data        = imgBytes
                }
            };

            context.Views.AddOrUpdate(v => v.Id, view);
            context.ContentDefinitions.AddOrUpdate(c => c.Name, contentDef1);
            context.DimensionDefinitions.AddOrUpdate(d => d.DimensionName, dimDef);
            context.Contents.AddOrUpdate(c => c.Id, elementContent);
            context.Contents.AddOrUpdate(c => c.Id, mediaContent);
        }
        internal static RepositorySchema LoadSchemaForType(Type dsType, bool inheritedFieldList = false)
        {
            if (dsType == null)
            {
                throw new Exception("The type must be set");
            }

            if (!dsType.GetInterfaces().Any(x => x.Name == typeof(IDatastoreItem).Name))
            {
                throw new Exception($"The item must implement {typeof(IDatastoreItem).Name}.");
            }

            var dsRepositoryAttribute = dsType.GetCustomAttributes().FirstOrDefault(x => x is DatastoreRepositoryAttribute) as DatastoreRepositoryAttribute;

            if (dsRepositoryAttribute == null)
            {
                throw new InvalidOperationException("Cannot create repository for the specified type. Missing DataStoreRepositoryAttribute.");
            }

            var schema = new RepositorySchema();

            schema.Name        = dsRepositoryAttribute.Name;
            schema.ObjectAlias = dsRepositoryAttribute.ObjectAlias;

            Guid rid;

            Guid.TryParse(dsRepositoryAttribute.Id, out rid);
            if (rid == Guid.Empty)
            {
                rid = Guid.NewGuid();
            }
            schema.ID = rid;

            if (!string.IsNullOrEmpty(dsRepositoryAttribute.ParentId))
            {
                schema.ParentID = new Guid(dsRepositoryAttribute.ParentId);
            }
            schema.FieldIndexing = dsRepositoryAttribute.FieldIndexing;

            //var properties = GetTemplateFields(dsType);
            var properties = new List <MemberInfo>();

            properties.AddRange(dsType.GetProperties());
            properties.AddRange(dsType.GetFields());
            #region Loop Fields
            foreach (MemberInfo prop in properties)
            {
                var field = prop.CustomAttributes.FirstOrDefault(x => x.AttributeType == typeof(DatastoreFieldAttribute)) as CustomAttributeData;
                if (field != null)
                {
                    var isNullable       = false;
                    var fieldDefition    = default(FieldDefinition);
                    var defFieldType     = RepositorySchema.DataTypeConstants.String;
                    var defLength        = 100;
                    var propertyTypeName = "";
                    if (prop is PropertyInfo)
                    {
                        propertyTypeName = ((PropertyInfo)prop).PropertyType.Name;
                        if (propertyTypeName.Contains("Nullable"))
                        {
                            isNullable       = true;
                            propertyTypeName = ((PropertyInfo)prop).PropertyType.GenericTypeArguments.Select(x => x.Name).FirstOrDefault();
                        }
                    }
                    else if (prop is FieldInfo)
                    {
                        propertyTypeName = ((FieldInfo)prop).FieldType.Name;
                        if (propertyTypeName.Contains("Nullable"))
                        {
                            isNullable       = true;
                            propertyTypeName = ((FieldInfo)prop).FieldType.GenericTypeArguments.Select(x => x.Name).FirstOrDefault();
                        }
                    }

                    switch (propertyTypeName)
                    {
                    case "String[]":
                        defFieldType = RepositorySchema.DataTypeConstants.List;
                        isNullable   = true;
                        break;

                    case "String":
                        defFieldType = RepositorySchema.DataTypeConstants.String;
                        isNullable   = true;
                        break;

                    case "Int16":
                    case "Int32":
                    case "UInt32":
                    case "Byte":
                        defFieldType = RepositorySchema.DataTypeConstants.Int;
                        break;

                    case "Int64":
                        defFieldType = RepositorySchema.DataTypeConstants.Int64;
                        break;

                    case "Bool":
                    case "Boolean":
                        defFieldType = RepositorySchema.DataTypeConstants.Bool;
                        break;

                    case "DateTime":
                        defFieldType = RepositorySchema.DataTypeConstants.DateTime;
                        break;

                    case "Double":
                    case "Single":
                    case "Decimal":
                        defFieldType = RepositorySchema.DataTypeConstants.Float;
                        break;

                    case "Char":
                        defFieldType = RepositorySchema.DataTypeConstants.String;
                        defLength    = 1;
                        break;

                    case "GeoCode":
                        defFieldType = RepositorySchema.DataTypeConstants.GeoCode;
                        isNullable   = true;
                        break;

                    default:
                        break;
                    }

                    var name            = GetAttributeValue <string>(field, "Name", prop.Name);
                    var dataType        = GetAttributeValue <RepositorySchema.DataTypeConstants>(field, "DataType", defFieldType);
                    var fieldType       = GetAttributeValue <RepositorySchema.FieldTypeConstants>(field, "FieldType", RepositorySchema.FieldTypeConstants.Field);
                    var isPrimaryKey    = GetAttributeValue <bool>(field, "IsPrimaryKey", false);
                    var isDataGrouping  = GetAttributeValue <bool>(field, "IsDataGrouping", false);
                    var length          = GetAttributeValue <int>(field, "Length", defLength);
                    var allowTextSearch = GetAttributeValue <bool>(field, "AllowTextSearch", false);
                    var isPivot         = GetAttributeValue <bool>(field, "IsPivot", false);
                    var pivotGroup      = GetAttributeValue <string>(field, "PivotGroup", String.Empty);
                    var pivotOrder      = GetAttributeValue <int>(field, "PivotOrder", 0);
                    var description     = GetAttributeValue <string>(field, "Description", String.Empty);
                    var searchAsc       = GetAttributeValue <bool>(field, "SearchAsc", true);
                    var allowIndex      = GetAttributeValue <bool>(field, "AllowIndex", true);

                    if (fieldType == RepositorySchema.FieldTypeConstants.Dimension)
                    {
                        fieldDefition = new DimensionDefinition();
                    }
                    else
                    {
                        fieldDefition = new FieldDefinition();
                    }

                    fieldDefition.Name            = name;
                    fieldDefition.DataType        = dataType;
                    fieldDefition.FieldType       = fieldType;
                    fieldDefition.IsPrimaryKey    = isPrimaryKey;
                    fieldDefition.IsDataGrouping  = isDataGrouping;
                    fieldDefition.AllowNull       = isNullable;
                    fieldDefition.Length          = length;
                    fieldDefition.AllowTextSearch = allowTextSearch;
                    fieldDefition.Name            = name;
                    fieldDefition.IsPivot         = isPivot;
                    fieldDefition.PivotGroup      = pivotGroup;
                    fieldDefition.PivotOrder      = pivotOrder;
                    fieldDefition.Description     = description;
                    fieldDefition.SearchAsc       = searchAsc;
                    fieldDefition.AllowIndex      = allowIndex;

                    //If PK and nullable then error
                    if (isPrimaryKey && isNullable)
                    {
                        throw new Exception("The primary key cannot be nullable.");
                    }

                    if (isPrimaryKey && !allowIndex)
                    {
                        throw new Exception("The primary key must be indexed.");
                    }

                    //Default to unlimited string length
                    if (defFieldType == RepositorySchema.DataTypeConstants.String && defLength < 0)
                    {
                        defLength = 0;
                    }

                    if (fieldType == RepositorySchema.FieldTypeConstants.Dimension)
                    {
                        switch (defFieldType)
                        {
                        case RepositorySchema.DataTypeConstants.Bool:
                        case RepositorySchema.DataTypeConstants.String:
                        case RepositorySchema.DataTypeConstants.List:
                        case RepositorySchema.DataTypeConstants.Int:
                        case RepositorySchema.DataTypeConstants.Int64:
                        case RepositorySchema.DataTypeConstants.DateTime:
                            break;

                        default:
                            throw new Exception($"Field '{name}': The data type '{defFieldType}' cannot be a dimension.");
                        }
                    }

                    if (fieldType == RepositorySchema.FieldTypeConstants.Dimension)
                    {
                        var dimension = fieldDefition as DimensionDefinition;
                        if (dimension == null)
                        {
                            throw new Exception("Dimension is null");
                        }

                        var didx = GetAttributeValue <int?>(field, "Didx", null);
                        if (didx.HasValue)
                        {
                            dimension.DIdx = didx.Value;
                        }

                        dimension.Parent        = GetAttributeValue <string>(field, "Parent", String.Empty);
                        dimension.DimensionType = GetAttributeValue <RepositorySchema.DimensionTypeConstants>(field, "DimensionType", RepositorySchema.DimensionTypeConstants.Normal);
                        var numericBreak = GetAttributeValue <long?>(field, "NumericBreak", null);
                        if ((dimension.DataType == RepositorySchema.DataTypeConstants.Int || dimension.DataType == RepositorySchema.DataTypeConstants.Int64) && numericBreak.HasValue)
                        {
                            dimension.NumericBreak = numericBreak.Value;
                        }
                        else if (numericBreak.HasValue)
                        {
                            throw new Exception("Numeric breaks are only applicable for Integer fields.");
                        }

                        //If the datatype is list then the DimensionType must be list
                        if (dimension.DataType == RepositorySchema.DataTypeConstants.List)
                        {
                            dimension.DimensionType = RepositorySchema.DimensionTypeConstants.List;
                        }
                    }

                    if (GetAttributeValue <bool>(field, "UserPermission", false))
                    {
                        schema.UserPermissionField = fieldDefition;
                    }

                    schema.FieldList.Add(fieldDefition);
                }
            }
            #endregion

            var hasGeo          = schema.FieldList.Any(x => x.DataType == RepositorySchema.DataTypeConstants.GeoCode);
            var hasGroupingData = (schema.FieldList.Where(x => x.IsDataGrouping).Count() > 1);

            if (schema.FieldList.Count == 0)
            {
                throw new Exception("The item must have fields defined.");
            }
            if (schema.FieldList.Count(x => x.IsPrimaryKey) != 1)
            {
                throw new Exception("The item must have exactly one primary key defined.");
            }
            if (schema.FieldList.Count != schema.FieldList.Select(x => x.Name.ToLower()).Distinct().Count())
            {
                throw new Exception("The item cannot have duplicate fields.");
            }
            if (schema.FieldList.Where(x => x.IsDataGrouping).Count() > 1)
            {
                throw new Exception("The item cannot have more than one data group field.");
            }
            if (hasGeo && hasGroupingData)
            {
                throw new Exception("The item cannot have a data grouping and GeoCode field.");
            }

            //This is a child so remove parent fields from schema
            if (schema.ParentID != null && !inheritedFieldList)
            {
                if (!dsType.BaseType.GetInterfaces().Any(x => x.Name == typeof(IDatastoreItem).Name))
                {
                    throw new Exception($"The item base must implement {typeof(IDatastoreItem).Name}.");
                }
                var parentSchema = LoadSchemaForType(dsType.BaseType);
                schema = schema.Subtract(parentSchema);
            }

            foreach (var ditem in schema.DimensionList.Where(x => !string.IsNullOrEmpty(x.Parent)).ToList())
            {
                //Verify that no parent dimension is self-referential
                if (ditem.Parent.Match(ditem.Name))
                {
                    throw new Exception($"The dimension '{ditem.Name}' cannot be its own parent.");
                }

                //Error check that parent dimension actually exists
                if (!schema.DimensionList.Any(x => x.Name == ditem.Parent))
                {
                    throw new Exception($"The dimension '{ditem.Name}' defines a non-existent parent.");
                }
            }

            //TODO: Verify that no parent dimensions cause a cycle (A->B->A)

            return(schema);
        }
        private static List <Unit> FindUnitsImpl(List <Unit> existingMatches, string unitName, DimensionDefinition dimension, bool ignoreCase,
                                                 Matcher <Unit> matcher, ListMatcher <Unit> listMatcher)
        {
            if (string.IsNullOrWhiteSpace(unitName))
            {
                throw new ArgumentException("unitName must be a string at least one character of non-whitespace");
            }
            List <Unit> allUnits = (dimension == null) ? AllUnits : dimension.Units;

            return(existingMatches
                   .Union(matcher(allUnits, unitName, u => u.Key, ignoreCase))
                   .Union(matcher(allUnits, unitName, u => u.Name, ignoreCase))
                   .Union(matcher(allUnits, unitName, u => u.Plural, ignoreCase))
                   .Union(matcher(allUnits, unitName, u => u.Symbol, ignoreCase))
                   .Union(listMatcher(allUnits, unitName, u => u.OtherNames, ignoreCase))
                   .Union(listMatcher(allUnits, unitName, u => u.OtherSymbols, ignoreCase))
                   .Where(UnitFilter)
                   .OrderByDescending(x => x, UnitComparer.Comparer).ToList());
        }
 public static List <Unit> FindUnitsPartial(string unitName, DimensionDefinition dimension = null, bool ignoreCase = true)
 {
     return(FindUnitsImpl(FindUnits(unitName, dimension, ignoreCase), unitName, dimension, ignoreCase, PartialMatches, PartialListMatches));
 }
 public static List <Unit> FindUnits(string unitName, DimensionDefinition dimension = null, bool ignoreCase = true)
 {
     return(FindUnitsImpl(new List <Unit>(), unitName, dimension, ignoreCase, Matches, ListMatches));
 }
 public static Unit FindUnitPartial(string unitName, DimensionDefinition dimension = null, bool ignoreCase = true)
 {
     return(FindUnitsPartial(unitName, dimension, ignoreCase).FirstOrDefault());
 }
        public static Unit FindBaseUnitPartial(string dimensionName, bool ignoreCase = true)
        {
            DimensionDefinition dimension = FindDimensionPartial(dimensionName, ignoreCase);

            return((dimension != null) ? dimension.BaseUnit : null);
        }