public void TestRelationCrud()
        {
            var taxonRepo = Container.Resolve <TaxonRepository>();
            var taxon1    = new TaxonEntity();

            taxon1.Name = "Test1";
            taxonRepo.SaveOrUpdate(taxon1);

            var taxon2 = new TaxonEntity();

            taxon2.Name = "Test2";
            taxonRepo.SaveOrUpdate(taxon2);

            var taxon3 = new TaxonEntity();

            taxon3.Name = "Test3";
            taxonRepo.SaveOrUpdate(taxon3);

            var taxon4 = new TaxonEntity();

            taxon4.Name = "Test4";
            taxonRepo.SaveOrUpdate(taxon4);

            var relationService = Container.Resolve <RelationService>();

            //relationService.Relate(taxon1, taxon2, RelationDirection.Both);
            //relationService.Relate(taxon1, taxon2, RelationDirection.Forward);

            relationService.AddRelation(taxon1, taxon3, RelationDirection.Forward);
            relationService.AddRelation(taxon1, taxon3);

            //relationService.Relate(taxon3, taxon4, RelationDirection.Both);
        }
 internal TaxonomyNode(TaxonomyTree tree, TaxonEntity entity)
 {
     this.tree       = tree;
     this.entity     = entity;
     this.IsDetached = false;
     //tree.log.Debug("Node init:" + Name);
 }
        public TaxonomyTree(ILog log, TaxonRepository repo, RelationService relationSrv, int rootId)
        {
            this.log         = log;
            this.rootId      = rootId;
            this.repo        = repo;
            this.relationSrv = relationSrv;
            rootEntity       = repo.Get(rootId);

            if (rootEntity == null)
            {
                if (rootId == 1)
                {
                    rootEntity = new TaxonEntity()
                    {
                        Name        = "Root",
                        Description = "Root node - parent of all taxon entries"
                    };
                    repo.Save(rootEntity);
                }
                else
                {
                    throw new Exception("Root node is not found");
                }
            }
            rootNode = new TaxonomyNode(this, rootEntity);
        }
        internal TaxonomyNode AddChildTo(TaxonomyNode taxon, string name, string description)
        {
            if (taxon.IsDetached)
            {
                throw new Exception(String.Format("Taxon '{0}' is detached", taxon.Name));
            }
            if (taxon.Children.Any(x => x.Name == name))
            {
                throw new DataLayerException("Duplicate taxon name in node");
            }
            var entity = new TaxonEntity()
            {
                Name        = name,
                Description = description
            };

            repo.Save(entity);
            relationSrv.AddRelation(taxon.entity, entity, RelationDirection.Forward, rootNode);
            var newNode = new TaxonomyNode(this, entity)
            {
                parent = taxon
            };

            taxon.children.Add(newNode);
            return(newNode);
        }
        public void TestTaxonCrud()
        {
            var taxonRepo = Container.Resolve <TaxonRepository>();
            var taxon     = new TaxonEntity();

            taxon.Name = "aaa";
            taxonRepo.SaveOrUpdate(taxon);

            var persistentTaxon = taxonRepo.Get(taxon.Id);

            taxonRepo.Delete(taxon);

            var deletedTaxon = taxonRepo.Get(taxon.Id);

            Assert.IsNull(deletedTaxon);
        }
        internal TaxonomyNode FindByEntity(TaxonEntity entity)
        {
            //TODO: optimize
            var         path   = "";
            TaxonEntity parent = entity;

            do
            {
                path   = parent.Name + (String.IsNullOrEmpty(path) ? "" : "/" + path);
                parent = relationSrv.GetByRelated <TaxonEntity>(parent, RelationDirection.Forward, rootNode).FirstOrDefault();
            } while (parent != null && parent.Id != rootNode.Id);

            var ret = FindOne(path);

            if (ret == null)
            {
                throw new InvalidOperationException(
                          String.Format("Entity not found in tree ({0}:{1}", entity.Id, path));
            }
            return(ret);
        }