private async Task <QueryResult> GetTerminalsInternal(string outBaseUrl, NeuronQuery neuronQuery, CancellationToken token = default(CancellationToken))
 {
     return(await requestProvider.GetAsync <QueryResult>(
                $"{outBaseUrl}{HttpNeuronGraphQueryClient.GetTerminalsPathTemplate}{neuronQuery.ToString()}",
                token : token
                ));
 }
Example #2
0
        public async Task <CommonTerminal> GetTerminalById(string id, NeuronQuery neuronQuery, CancellationToken token = default(CancellationToken))
        {
            CommonTerminal result = null;

            await this.terminalRepository.Initialize();

            result = (await this.terminalRepository.Get(Guid.Parse(id), neuronQuery, token))?.ToCommon();

            return(result);
        }
Example #3
0
        private async Task <Domain.Model.QueryResult> GetAllCore(Guid?centralGuid, NeuronQuery neuronQuery, CancellationToken token = default(CancellationToken))
        {
            Domain.Model.QueryResult result = null;
            NeuronRepository.FillWithDefaults(neuronQuery, this.settingsService);

            result = NeuronRepository.GetNeuronResults(
                centralGuid,
                null,
                this.settingsService.DatabaseName,
                neuronQuery,
                token
                );

            return(result);
        }
Example #4
0
        internal static Graph.Common.NeuronQuery ToExternalType(this NeuronQuery value)
        {
            var result = new Graph.Common.NeuronQuery();

            result.Id                           = value.Id?.ToArray();
            result.IdNot                        = value.IdNot?.ToArray();
            result.Postsynaptic                 = value.Postsynaptic?.ToArray();
            result.PostsynapticNot              = value.PostsynapticNot?.ToArray();
            result.Presynaptic                  = value.Presynaptic?.ToArray();
            result.PresynapticNot               = value.PresynapticNot?.ToArray();
            result.TagContains                  = value.TagContains?.ToArray();
            result.TagContainsNot               = value.TagContainsNot?.ToArray();
            result.TagContainsIgnoreWhitespace  = value.TagContainsIgnoreWhitespace;
            result.RegionId                     = value.RegionId?.ToArray();
            result.RegionIdNot                  = value.RegionIdNot?.ToArray();
            result.ExternalReferenceUrl         = value.ExternalReferenceUrl?.ToArray();
            result.ExternalReferenceUrlContains = value.ExternalReferenceUrlContains?.ToArray();

            result.RelativeValues = Extensions.ConvertNullableEnumToExternal <RelativeValues, Graph.Common.RelativeValues>(
                value.RelativeValues,
                v => ((int)v).ToString()
                );

            result.NeuronActiveValues = Extensions.ConvertNullableEnumToExternal <ActiveValues, Graph.Common.ActiveValues>(
                value.NeuronActiveValues,
                v => ((int)v).ToString()
                );

            result.TerminalActiveValues = Extensions.ConvertNullableEnumToExternal <ActiveValues, Graph.Common.ActiveValues>(
                value.TerminalActiveValues,
                v => ((int)v).ToString()
                );

            result.Page     = value.Page;
            result.PageSize = value.PageSize;

            result.SortBy = Extensions.ConvertNullableEnumToExternal <SortByValue, Graph.Common.SortByValue>(
                value.SortBy,
                v => ((int)v).ToString()
                );

            result.SortOrder = Extensions.ConvertNullableEnumToExternal <SortOrderValue, Graph.Common.SortOrderValue>(
                value.SortOrder,
                v => ((int)v).ToString()
                );

            return(result);
        }
        public async Task <QueryResult <Terminal> > GetTerminals(NeuronQuery neuronQuery, string userId, CancellationToken token = default(CancellationToken))
        {
            var commonResult = await this.graphQueryClient.GetTerminals(
                this.settingsService.CortexGraphOutBaseUrl + "/",
                neuronQuery.ToExternalType(),
                token
                );

            return(await TerminalQueryService.ConvertProcessValidate(
                       commonResult,
                       userId,
                       validationClient,
                       settingsService,
                       token
                       ));
        }
Example #6
0
        public async Task <QueryResult <Neuron> > GetNeurons(NeuronQuery neuronQuery, string userId, CancellationToken token = default(CancellationToken))
        {
            var commonResult = await this.graphQueryClient.GetNeurons(
                this.settingsService.CortexGraphOutBaseUrl + "/",
                neuronQuery.ToExternalType(),
                token
                );

            var result = commonResult.ToInternalType(n => n.ToInternalType());

            result.Items = await result.Items.ProcessValidate(
                userId,
                this.validationClient,
                this.settingsService,
                token
                );

            return(result);
        }
Example #7
0
        public async Task <QueryResult <Neuron> > SendQueryInternal(string queryUrl, string bearerToken, CancellationToken token = default)
        {
            QueryResult <Neuron> result = new QueryResult <Neuron>()
            {
                Items = new Neuron[0]
            };

            if (QueryUrl.TryParse(queryUrl, out QueryUrl request))
            {
                NeuronQuery query = NeuronQuery.TryParse(request.QueryString, out NeuronQuery nquery) ?
                                    nquery :
                                    new NeuronQuery();

                if (request.Id.Length > 0)
                {
                    if (request.HasRelatives)
                    {
                        // http://[avatar]/cortex/neurons/[id]/relatives/[id2]
                        if (request.Id2.Length > 0)
                        {
                            result = await this.GetNeuronByIdInternal(request.AvatarUrl, request.Id2, request.Id, query, bearerToken, token);
                        }
                        // http://[avatar]/cortex/neurons/[id]/relatives
                        else
                        {
                            result = await this.GetNeuronsInternal(request.AvatarUrl, request.Id, query, bearerToken, token);
                        }
                    }
                    else
                    {
                        // http://[avatar]/cortex/neurons/[id]
                        result = await this.GetNeuronByIdInternal(request.AvatarUrl, request.Id, query, bearerToken, token);
                    }
                }
                // http://[avatar]/cortex/neurons
                else
                {
                    result = await this.GetNeuronsInternal(request.AvatarUrl, request.Id, query, bearerToken, token);
                }
            }

            return(result);
        }
Example #8
0
 internal static void FillWithDefaults(NeuronQuery neuronQuery, ISettingsService settingsService)
 {
     if (!neuronQuery.RelativeValues.HasValue)
     {
         neuronQuery.RelativeValues = settingsService.DefaultRelativeValues;
     }
     if (!neuronQuery.NeuronActiveValues.HasValue)
     {
         neuronQuery.NeuronActiveValues = settingsService.DefaultNeuronActiveValues;
     }
     if (!neuronQuery.TerminalActiveValues.HasValue)
     {
         neuronQuery.TerminalActiveValues = settingsService.DefaultTerminalActiveValues;
     }
     if (!neuronQuery.PageSize.HasValue)
     {
         neuronQuery.PageSize = settingsService.DefaultPageSize;
     }
     if (!neuronQuery.Page.HasValue)
     {
         neuronQuery.Page = settingsService.DefaultPage;
     }
 }
Example #9
0
        private static NeuronQuery ExtractQuery(dynamic query)
        {
            var nq = new NeuronQuery();

            nq.TagContains          = GraphModule.GetQueryArrayOrDefault(query, nameof(NeuronQuery.TagContains));
            nq.TagContainsNot       = GraphModule.GetQueryArrayOrDefault(query, nameof(NeuronQuery.TagContainsNot));
            nq.Id                   = GraphModule.GetQueryArrayOrDefault(query, nameof(NeuronQuery.Id));
            nq.IdNot                = GraphModule.GetQueryArrayOrDefault(query, nameof(NeuronQuery.IdNot));
            nq.Postsynaptic         = GraphModule.GetQueryArrayOrDefault(query, nameof(NeuronQuery.Postsynaptic));
            nq.PostsynapticNot      = GraphModule.GetQueryArrayOrDefault(query, nameof(NeuronQuery.PostsynapticNot));
            nq.Presynaptic          = GraphModule.GetQueryArrayOrDefault(query, nameof(NeuronQuery.Presynaptic));
            nq.PresynapticNot       = GraphModule.GetQueryArrayOrDefault(query, nameof(NeuronQuery.PresynapticNot));
            nq.RegionId             = GraphModule.GetQueryArrayOrDefault(query, nameof(NeuronQuery.RegionId));
            nq.RegionIdNot          = GraphModule.GetQueryArrayOrDefault(query, nameof(NeuronQuery.RegionIdNot));
            nq.RelativeValues       = GraphModule.GetNullableEnumValue <RelativeValues>("relative", query);
            nq.PageSize             = GraphModule.GetNullableIntValue("pagesize", query);
            nq.Page                 = GraphModule.GetNullableIntValue("page", query);
            nq.NeuronActiveValues   = GraphModule.GetNullableEnumValue <ActiveValues>("nactive", query);
            nq.TerminalActiveValues = GraphModule.GetNullableEnumValue <ActiveValues>("tactive", query);
            nq.SortBy               = GraphModule.GetNullableEnumValue <SortByValue>("sortby", query);
            nq.SortOrder            = GraphModule.GetNullableEnumValue <SortOrderValue>("sortorder", query);
            return(nq);
        }
Example #10
0
 private async Task <QueryResult <Terminal> > GetTerminalsInternal(string avatarUrl, NeuronQuery neuronQuery, string bearerToken, CancellationToken token = default(CancellationToken))
 {
     return(await requestProvider.GetAsync <QueryResult <Terminal> >(
                $"{avatarUrl}{HttpTerminalQueryClient.GetTerminalsPathTemplate}{neuronQuery.ToString()}",
                bearerToken,
                token
                ));
 }
Example #11
0
        private static Domain.Model.QueryResult GetNeuronResults(Guid?centralGuid, Guid?relativeGuid, string settingName, NeuronQuery neuronQuery, CancellationToken token = default(CancellationToken))
        {
            Domain.Model.QueryResult result = null;

            using (var db = ArangoDatabase.CreateWithSetting(settingName))
            {
                var queryResult = db.CreateStatement <Domain.Model.NeuronResult>(
                    NeuronRepository.CreateQuery(centralGuid, relativeGuid, neuronQuery, out List <QueryParameter> queryParameters),
                    queryParameters,
                    options: new QueryOption()
                {
                    FullCount = true
                }
                    );
                var neurons = queryResult.AsEnumerable().ToArray();

                if (centralGuid.HasValue)
                {
                    neurons.ToList().ForEach(nr => nr.Terminal = nr.Terminal.CloneExcludeSynapticPrefix());
                }

                var fullCount = (int)queryResult.Statistics.Extra.Stats.FullCount;

                if (
                    neuronQuery.Page.Value != 1 &&
                    fullCount == NeuronRepository.CalculateOffset(neuronQuery.Page.Value, neuronQuery.PageSize.Value) &&
                    neurons.Length == 0
                    )
                {
                    throw new ArgumentOutOfRangeException("Specified/Default Page is invalid.");
                }

                result = new Domain.Model.QueryResult()
                {
                    Count   = fullCount,
                    Neurons = neurons
                };
            }

            return(result);
        }
Example #12
0
 public async Task <Domain.Model.QueryResult> GetAll(NeuronQuery neuronQuery, CancellationToken token = default(CancellationToken))
 {
     return(await this.GetAllCore(null, neuronQuery, token));
 }
Example #13
0
 private async Task <QueryResult <Neuron> > GetNeuronByIdInternal(string avatarUrl, string id, string centralId, NeuronQuery neuronQuery, string bearerToken, CancellationToken token = default(CancellationToken))
 {
     return(await HttpNeuronQueryClient.GetNeuronsUnescaped(
                avatarUrl,
                $"{HttpNeuronQueryClient.GetNeuronsPathTemplate}/{centralId}/relatives/{id}",
                neuronQuery.ToString(),
                token,
                requestProvider,
                bearerToken
                ));
 }
Example #14
0
 internal static NeuronQuery ParseNeuronQueryOrEmpty(string queryString)
 {
     return(NeuronQuery.TryParse(queryString, out NeuronQuery query) ? query : new NeuronQuery());
 }
 public async Task <QueryResult> GetTerminals(string outBaseUrl, NeuronQuery neuronQuery, CancellationToken token = default(CancellationToken)) =>
 await HttpNeuronGraphQueryClient.exponentialRetryPolicy.ExecuteAsync(
     async() => await this.GetTerminalsInternal(outBaseUrl, neuronQuery, token).ConfigureAwait(false));
Example #16
0
 public async Task <QueryResult <Neuron> > GetNeuronById(string avatarUrl, string id, string centralId, NeuronQuery neuronQuery, string bearerToken, CancellationToken token = default(CancellationToken)) =>
 await HttpNeuronQueryClient.exponentialRetryPolicy.ExecuteAsync(
     async() => await this.GetNeuronByIdInternal(avatarUrl, id, centralId, neuronQuery, bearerToken, token).ConfigureAwait(false));
Example #17
0
 public async Task <QueryResult <Neuron> > GetNeurons(string avatarUrl, NeuronQuery neuronQuery, string bearerToken, CancellationToken token = default(CancellationToken)) =>
 await this.GetNeurons(avatarUrl, null, neuronQuery, bearerToken, token);
Example #18
0
        private async Task <QueryResult <Neuron> > GetNeuronsInternal(string avatarUrl, string centralId, NeuronQuery neuronQuery, string bearerToken, CancellationToken token = default(CancellationToken))
        {
            var path = string.IsNullOrEmpty(centralId) ?
                       HttpNeuronQueryClient.GetNeuronsPathTemplate :
                       string.Format(HttpNeuronQueryClient.GetRelativesPathTemplate, centralId);

            return(await HttpNeuronQueryClient.GetNeuronsUnescaped(
                       avatarUrl,
                       path,
                       neuronQuery.ToString(),
                       token,
                       requestProvider,
                       bearerToken
                       ));
        }
Example #19
0
 public async Task <QueryResult <Terminal> > GetTerminals(string avatarUrl, NeuronQuery neuronQuery, string bearerToken, CancellationToken token = default(CancellationToken)) =>
 await HttpTerminalQueryClient.exponentialRetryPolicy.ExecuteAsync(
     async() => await this.GetTerminalsInternal(avatarUrl, neuronQuery, bearerToken, token).ConfigureAwait(false)
     );
        public async Task <IEnumerable <NeuronResult> > GetAll(Guid?centralGuid = null, RelativeType type = RelativeType.NotSet, NeuronQuery neuronQuery = null, int?limit = 1000, CancellationToken token = default(CancellationToken))
        {
            IEnumerable <NeuronResult> result = null;

            result = this.GetNeuronResults(
                centralGuid,
                string.Empty,
                InMemoryNeuronRepository.ConvertRelativeToDirection(type),
                neuronQuery,
                limit);

            return(await Task.FromResult(result));
        }
Example #21
0
 public async Task <Domain.Model.QueryResult> GetRelative(Guid guid, Guid centralGuid, NeuronQuery neuronQuery, CancellationToken token = default(CancellationToken))
 {
     return(await this.GetRelativeCore(guid, centralGuid, neuronQuery, token));
 }
 public async Task <QueryResult> GetNeuronById(string outBaseUrl, string id, string centralId, NeuronQuery neuronQuery, CancellationToken token = default(CancellationToken)) =>
 await HttpNeuronGraphQueryClient.exponentialRetryPolicy.ExecuteAsync(
     async() => await this.GetNeuronByIdWithCentralInternal(outBaseUrl, id, centralId, neuronQuery, token).ConfigureAwait(false));
        private IEnumerable <NeuronResult> GetNeuronResults(Guid?centralGuid, string settingName, EdgeDirection direction, NeuronQuery neuronQuery = null, int?limit = 1000, CancellationToken token = default(CancellationToken))
        {
            // IEnumerable<NeuronResult> result = null;

            //using (var db = ArangoDatabase.CreateWithSetting(settingName))
            //{
            //    var queryString = NeuronRepository.CreateQuery(centralGuid, direction, neuronQuery, limit, out List<QueryParameter> queryParameters);

            //    result = db.CreateStatement<NeuronResult>(queryString, queryParameters)
            //                .AsEnumerable()
            //                .ToArray();
            //}
            var ns     = this.cache.Values.Where(n => centralGuid == null || n.Id == centralGuid.ToString() || n.Terminals.Any(t => t.TargetId == centralGuid.ToString()));
            var result = new List <NeuronResult>();

            ns.ToList().ForEach(n =>
            {
                if (centralGuid == null || n.Id == centralGuid.ToString())
                {
                    result.Add(new NeuronResult()
                    {
                        Neuron = n
                    });
                }
                else
                {
                    result.Add(new NeuronResult()
                    {
                        Neuron = n, Terminal = n.Terminals.First(t => t.TargetId == centralGuid.ToString())
                    });
                }
            }
                                );

            return(result);
        }
Example #24
0
        private static string CreateQuery(Guid?centralGuid, Guid?relativeGuid, NeuronQuery neuronQuery, out List <QueryParameter> queryParameters)
        {
            queryParameters = new List <QueryParameter>();
            var queryFiltersBuilder = new StringBuilder();
            var queryStringBuilder  = new StringBuilder();

            Func <string, string> valueBuilder = s => $"%{s}%";
            Func <string, List <string>, string, string> selector = (f, ls, s) => $"Upper(n.Tag) LIKE Upper(@{f + (ls.IndexOf(s) + 1)})";

            // TagContains
            NeuronRepository.ExtractFilters(neuronQuery.TagContains, nameof(NeuronQuery.TagContains), valueBuilder, selector, queryParameters, queryFiltersBuilder, "&&");
            // TagContainsNot
            NeuronRepository.ExtractFilters(neuronQuery.TagContainsNot, nameof(NeuronQuery.TagContainsNot), valueBuilder, selector, queryParameters, queryFiltersBuilder, "||", "NOT");

            valueBuilder = s => $"Neuron/{s}";
            selector     = (f, ls, s) => $"n._id == @{f + (ls.IndexOf(s) + 1)}";
            // IdEquals
            NeuronRepository.ExtractFilters(neuronQuery.Id, nameof(NeuronQuery.Id), valueBuilder, selector, queryParameters, queryFiltersBuilder, "||");
            // IdEqualsNot
            NeuronRepository.ExtractFilters(neuronQuery.IdNot, nameof(NeuronQuery.IdNot), valueBuilder, selector, queryParameters, queryFiltersBuilder, "||", "NOT");

            valueBuilder = s => s;
            selector     = (f, ls, s) => $"n.RegionId == @{f + (ls.IndexOf(s) + 1)}";
            // RegionIdEquals
            NeuronRepository.ExtractFilters(neuronQuery.RegionId, nameof(NeuronQuery.RegionId), valueBuilder, selector, queryParameters, queryFiltersBuilder, "||");
            // RegionIdEqualsNot
            NeuronRepository.ExtractFilters(neuronQuery.RegionIdNot, nameof(NeuronQuery.RegionIdNot), valueBuilder, selector, queryParameters, queryFiltersBuilder, "||", "NOT");

            var neuronAuthorRegion       = @"
                        LET neuronCreationAuthorTag = (
                            FOR neuronAuthorNeuron in Neuron
                            FILTER neuronAuthorNeuron._id == CONCAT(""Neuron/"", n.CreationAuthorId)
                            return neuronAuthorNeuron.Tag
                        )
                        LET neuronLastModificationAuthorTag = (
                            FOR neuronAuthorNeuron in Neuron
                            FILTER neuronAuthorNeuron._id == CONCAT(""Neuron/"", n.LastModificationAuthorId)
                            return neuronAuthorNeuron.Tag
                        )
                        LET neuronUnifiedLastModificationAuthorTag = (
                            FOR neuronAuthorNeuron in Neuron
                            FILTER neuronAuthorNeuron._id == CONCAT(""Neuron/"", n.UnifiedLastModificationAuthorId)
                            return neuronAuthorNeuron.Tag
                        )
                        LET neuronRegionTag = (
                            FOR regionNeuron in Neuron
                            FILTER regionNeuron._id == CONCAT(""Neuron/"", n.RegionId)
                            return regionNeuron.Tag
                        )";
            var neuronAuthorRegionReturn = ", NeuronCreationAuthorTag: FIRST(neuronCreationAuthorTag), NeuronLastModificationAuthorTag: FIRST(neuronLastModificationAuthorTag), NeuronUnifiedLastModificationAuthorTag: FIRST(neuronUnifiedLastModificationAuthorTag), NeuronRegionTag: FIRST(neuronRegionTag)";

            if (!centralGuid.HasValue)
            {
                // Neuron Active
                NeuronRepository.AddActiveFilter("n", neuronQuery.NeuronActiveValues.Value, queryFiltersBuilder);

                queryStringBuilder.Append($@"
                    FOR n IN Neuron
                        {queryFiltersBuilder}
                        {neuronAuthorRegion}
                            RETURN {{ Neuron: n, Terminal: {{}}{neuronAuthorRegionReturn} }}");
            }
            else
            {
                // Terminal Active
                NeuronRepository.AddActiveFilter("t", neuronQuery.TerminalActiveValues.Value, queryFiltersBuilder);

                string letPre    = string.Empty,
                       inPre     = string.Empty,
                       filterPre = string.Empty;

                string activeSynapticTemplate = string.Empty;
                if (Helper.TryConvert(neuronQuery.NeuronActiveValues.Value, out bool active))
                {
                    activeSynapticTemplate = " && {0}.Active == " + active.ToString();
                }

                if (neuronQuery.RelativeValues.Value.HasFlag(RelativeValues.Presynaptic))
                {
                    // get all presynaptic neurons of current terminal
                    letPre = $@"LET presynaptics = (
                            FOR presynaptic IN Neuron
                            FILTER presynaptic._id == t._from{string.Format(activeSynapticTemplate, "presynaptic")}
                            return presynaptic
                        )";
                    // where "to" is centralGuid
                    inPre     = $@"t._to == @{nameof(centralGuid)} && LENGTH(presynaptics) > 0 ?
                                    presynaptics :";
                    filterPre = $@"t._to == @{nameof(centralGuid)}";

                    if (relativeGuid.HasValue)
                    {
                        filterPre += $@" && t._from == @{nameof(relativeGuid)}";
                    }
                }

                string letPost    = string.Empty,
                       inPost     = string.Empty,
                       filterPost = string.Empty;

                if (neuronQuery.RelativeValues.Value.HasFlag(RelativeValues.Postsynaptic))
                {
                    // get postsynaptic neurons
                    letPost    = $@"LET postsynaptics = (
                            FOR postsynaptic IN Neuron
                            FILTER postsynaptic._id == t._to{string.Format(activeSynapticTemplate, "postsynaptic")}
                            return postsynaptic
                        )";
                    inPost     = $@"t._from == @{nameof(centralGuid)} && LENGTH(postsynaptics) > 0 ? 
                                postsynaptics :";
                    filterPost = $@"t._from == @{nameof(centralGuid)}";

                    if (relativeGuid.HasValue)
                    {
                        filterPost += $@" && t._to == @{nameof(relativeGuid)}";
                    }
                }

                queryStringBuilder.Append($@"
                    FOR t in Terminal 
                        {letPost}
                        {letPre}
                        FOR n IN (
                            {inPost}
                                {inPre}
                                    [ {{ }} ]
                            )
                        LET terminalCreationAuthorTag = (
                            FOR terminalAuthorNeuron in Neuron
                            FILTER terminalAuthorNeuron._id == CONCAT(""Neuron/"", t.CreationAuthorId)
                            return terminalAuthorNeuron.Tag
                        )
                        LET terminalLastModificationAuthorTag = (
                            FOR terminalAuthorNeuron in Neuron
                            FILTER terminalAuthorNeuron._id == CONCAT(""Neuron/"", t.LastModificationAuthorId)
                            return terminalAuthorNeuron.Tag
                        )
                        {neuronAuthorRegion}
                        FILTER {filterPost} {(!string.IsNullOrEmpty(filterPost) && !string.IsNullOrEmpty(filterPre) ? "||" : string.Empty)} {filterPre}
                        {queryFiltersBuilder}
                            RETURN {{ Neuron: n, Terminal: t, TerminalCreationAuthorTag: FIRST(terminalCreationAuthorTag), TerminalLastModificationAuthorTag: FIRST(terminalLastModificationAuthorTag){neuronAuthorRegionReturn}}}");

                queryParameters.Add(new QueryParameter()
                {
                    Name  = nameof(centralGuid),
                    Value = $"Neuron/{centralGuid.Value.ToString()}"
                });

                if (relativeGuid.HasValue)
                {
                    queryParameters.Add(new QueryParameter()
                    {
                        Name  = nameof(relativeGuid),
                        Value = $"Neuron/{relativeGuid.Value.ToString()}"
                    });
                }
            }

            var preSynapticParamCount = queryParameters.Count;

            // Postsynaptic
            NeuronRepository.ApplySynapticFilters(neuronQuery.Postsynaptic, nameof(NeuronQuery.Postsynaptic), queryParameters, queryStringBuilder);

            // PostsynapticNot
            NeuronRepository.ApplySynapticFilters(neuronQuery.PostsynapticNot, nameof(NeuronQuery.PostsynapticNot), queryParameters, queryStringBuilder, false);

            // Presynaptic
            NeuronRepository.ApplySynapticFilters(neuronQuery.Presynaptic, nameof(NeuronQuery.Presynaptic), queryParameters, queryStringBuilder);

            // PresynapticNot
            NeuronRepository.ApplySynapticFilters(neuronQuery.PresynapticNot, nameof(NeuronQuery.PresynapticNot), queryParameters, queryStringBuilder, false);

            // Sort and Limit
            var lastReturnIndex = queryStringBuilder.ToString().ToUpper().LastIndexOf("RETURN");

            queryStringBuilder.Remove(lastReturnIndex, 6);

            // were synaptic filters applied?
            bool   synapticFiltersApplied = preSynapticParamCount < queryParameters.Count;
            string sortFieldName          = synapticFiltersApplied ? "n.Neuron.Tag" : "n.Tag";
            string sortOrder = neuronQuery.SortOrder.HasValue ?
                               neuronQuery.SortOrder.Value.ToEnumString() :
                               "ASC";

            if (neuronQuery.SortBy.HasValue)
            {
                sortFieldName = neuronQuery.SortBy.Value.ToEnumString();

                if (synapticFiltersApplied)
                {
                    sortFieldName = "n." + sortFieldName;
                }
                else
                {
                    if (sortFieldName.StartsWith("Neuron."))
                    {
                        sortFieldName = sortFieldName.Replace("Neuron.", "n.");
                    }
                    else if (sortFieldName.StartsWith("Terminal."))
                    {
                        sortFieldName = sortFieldName.Replace("Terminal.", "t.");
                    }
                    else
                    {
                        sortFieldName = sortFieldName[0].ToString().ToLower() + sortFieldName.Substring(1);
                    }
                }
            }

            queryStringBuilder.Insert(lastReturnIndex, $"SORT {sortFieldName} {sortOrder} LIMIT @offset, @count RETURN");
            queryParameters.Add(new QueryParameter()
            {
                Name = "offset", Value = NeuronRepository.CalculateOffset(neuronQuery.Page.Value, neuronQuery.PageSize.Value)
            });
            queryParameters.Add(new QueryParameter()
            {
                Name = "count", Value = neuronQuery.PageSize.Value
            });

            return(queryStringBuilder.ToString());
        }
        public async Task<IEnumerable<Neuron>> GetNeurons(string avatarUrl, string centralId = null, RelativeType type = RelativeType.NotSet, NeuronQuery neuronQuery = null, int? limit = 1000, CancellationToken token = default(CancellationToken))
        {
            var relatives = await this.neuronQueryClient.GetNeurons(avatarUrl, centralId, type, neuronQuery, limit, token);

            if (string.IsNullOrEmpty(centralId))
                relatives = relatives.OrderBy(n => n.Tag);
            else
            {
                var posts = relatives.Where(n => n.Type == RelativeType.Postsynaptic);
                var pres = relatives.Where(n => n.Type == RelativeType.Presynaptic);
                posts = posts.ToList().OrderBy(n => n.Tag);
                pres = pres.ToList().OrderBy(n => n.Tag);
                relatives = posts.Concat(pres);
            }

            return relatives;
        }
 private async Task <QueryResult> GetNeuronByIdWithCentralInternal(string outBaseUrl, string id, string centralId, NeuronQuery neuronQuery, CancellationToken token = default(CancellationToken))
 {
     return(await HttpNeuronGraphQueryClient.GetNeuronsUnescaped(
                outBaseUrl,
                $"{HttpNeuronGraphQueryClient.GetNeuronsPathTemplate}/{centralId}/relatives/{id}",
                neuronQuery.ToString(),
                token,
                requestProvider
                ));
 }
        public async Task <ActionValidationResult> ReadNeurons(IEnumerable <Guid> neuronIds, string userId, CancellationToken token = default)
        {
            AssertionConcern.AssertArgumentNotNull(neuronIds, nameof(neuronIds));
            neuronIds.ToList().ForEach(g => AssertionConcern.AssertArgumentValid(
                                           guid => guid != Guid.Empty, g, Constants.Messages.Exception.InvalidId, nameof(neuronIds)
                                           ));
            AssertionConcern.AssertArgumentNotEmpty(userId, Constants.Messages.Exception.InvalidUserId, nameof(userId));

            var query = new NeuronQuery()
            {
                Id = neuronIds.Select(g => g.ToString()),
                NeuronActiveValues = ActiveValues.All,
                PageSize           = neuronIds.Count()
            };

            // get neurons which are also inactive
            var queryResult = await this.neuronGraphQueryClient.GetNeurons(
                this.settingsService.CortexGraphOutBaseUrl + "/",
                query,
                token
                );

            var actionErrors  = new List <ErrorInfo>();
            var neuronResults = new List <NeuronValidationResult>();

            await this.authorRepository.Initialize();

            Author author = await this.authorRepository.GetByUserId(userId);

            if (author == null)
            {
                actionErrors.Add(new ErrorInfo(Constants.Messages.Exception.UnauthorizedUserAccess, ErrorType.Error));
            }
            else if (queryResult.Neurons.Count() > 0)
            {
                // loop through each neuron
                foreach (var neuron in queryResult.Neurons)
                {
                    var regionTag = neuron.Region.Id != null ? neuron.Region.Tag : "Base";
                    // get region permit of author user for region
                    var permit = author.Permits.SingleOrDefault(p =>
                                                                p.RegionNeuronId.EqualsString(neuron.Region.Id) &&
                                                                p.ReadLevel > 0
                                                                );

                    // does author user have a read permit
                    if (permit == null)
                    {
                        neuronResults.Add(new NeuronValidationResult(Guid.Parse(neuron.Id), new ErrorInfo[]
                        {
                            new ErrorInfo(string.Format(Constants.Messages.Exception.UnauthorizedRegionReadTemplate, regionTag), ErrorType.Warning)
                        }));
                    }
                }
            }

            return(new ActionValidationResult(
                       author != null ? author.User.NeuronId : Guid.Empty,
                       actionErrors.ToArray(),
                       neuronResults.ToArray()
                       ));
        }
Example #28
0
        private async Task <Domain.Model.QueryResult> GetRelativeCore(Guid guid, Guid?centralGuid, NeuronQuery neuronQuery, CancellationToken token = default(CancellationToken))
        {
            Domain.Model.QueryResult result = null;
            NeuronRepository.FillWithDefaults(neuronQuery, this.settingsService);

            using (var db = ArangoDatabase.CreateWithSetting(this.settingsService.DatabaseName))
            {
                AssertionConcern.AssertStateTrue(await Helper.GraphExists(db), Constants.Messages.Error.GraphNotInitialized);

                if (!centralGuid.HasValue)
                {
                    var n = await db.DocumentAsync <Neuron>(guid.ToString());

                    if (
                        n != null && (
                            neuronQuery.NeuronActiveValues.Value.HasFlag(ActiveValues.All) ||
                            (
                                Helper.TryConvert(neuronQuery.NeuronActiveValues.Value, out bool activeValue) &&
                                n.Active == activeValue
                            )
                            )
                        )
                    {
                        var region = n.RegionId != null ? await db.DocumentAsync <Neuron>(n.RegionId) : null;

                        var creationAuthor         = (await db.DocumentAsync <Neuron>(n.CreationAuthorId));
                        var lastModificationAuthor = !string.IsNullOrEmpty(n.LastModificationAuthorId) ?
                                                     (await db.DocumentAsync <Neuron>(n.LastModificationAuthorId)) :
                                                     null;
                        var unifiedLastModificationAuthor = !string.IsNullOrEmpty(n.UnifiedLastModificationAuthorId) ?
                                                            (await db.DocumentAsync <Neuron>(n.UnifiedLastModificationAuthorId)) :
                                                            null;

                        AssertionConcern.AssertStateTrue(creationAuthor != null, string.Format(Constants.Messages.Error.AuthorNeuronNotFound, n.CreationAuthorId));

                        result = new Domain.Model.QueryResult()
                        {
                            Count   = 1,
                            Neurons = new Domain.Model.NeuronResult[] { new Domain.Model.NeuronResult()
                                                                        {
                                                                            Neuron = n,
                                                                            NeuronCreationAuthorTag         = creationAuthor.Tag,
                                                                            NeuronLastModificationAuthorTag = lastModificationAuthor != null ?
                                                                                                              lastModificationAuthor.Tag : string.Empty,
                                                                            NeuronUnifiedLastModificationAuthorTag = unifiedLastModificationAuthor != null ? unifiedLastModificationAuthor.Tag : string.Empty,
                                                                            NeuronRegionTag = region != null ? region.Tag : string.Empty
                                                                        } }
                        };
                    }
                    else
                    {
                        result = new Domain.Model.QueryResult()
                        {
                            Count   = 0,
                            Neurons = new Domain.Model.NeuronResult[0]
                        }
                    };
                }
                else
                {
                    result = NeuronRepository.GetNeuronResults(centralGuid.Value, guid, this.settingsService.DatabaseName, neuronQuery, token);
                }

                // KEEP: circular references will now be allowed 2018/10/24
                // int c = db.Query()
                //    .Traversal<Neuron, Terminal>(EdgePrefix + guid.ToString())
                //    .Depth(1, 999)
                //    .OutBound()
                //    .Graph(NeuronRepository.GraphName)
                //    .Filter(n => n.Vertex.Id == guid.ToString())
                //    .Select(g => g.Vertex.Id)
                //    .ToList()
                //    .Count();
            }

            return(result);
        }
 public async Task <QueryResult> GetNeurons(string outBaseUrl, NeuronQuery neuronQuery, CancellationToken token = default(CancellationToken)) =>
 await this.GetNeurons(outBaseUrl, null, neuronQuery, token);