ResultTransformer AddQueryinput working with Sync Raven session - Exception in Async Raven session

80 views
Skip to first unread message

Rudi Thoeni

unread,
Oct 31, 2014, 4:47:31 AM10/31/14
to rav...@googlegroups.com

Hello

I am using RavenDB 2.5. 
I have an Activity Set, that includes more Languages, Simple Example the Name of the Activity is inside a Dictionary wich Key is the language.

I want to retrieve a "Reduced Set" from RavenDB that include only the Entitiy Id and Name based on the passed Language.
So i used the RavenDB ResultTransformer to implement this Functionality, and the AddQueryInput Method to pass the desired Language.

Code:

///Transformer

    public class ActivityPoiReducedTransformer : AbstractTransformerCreationTask<PoiBaseInfos>
    {
        public ActivityPoiReducedTransformer()
        {
            TransformResults = activities => from activity in activities
                                             let language = this.Query("lang").Value<String>()
                                             select new ActivityPoiReduced
                                             {
                                                 Id = activity.Id,
                                                 Name = activity.Detail[language].Title
                                             };
        }
    }    

    public class ActivityPoiReduced
    {
        public string Id { get; set; }
        public string Name { get; set; }
    }

//END Transformer

//Query

using (var session = documentStore.OpenSession())
            {
              
               var activitylist = session.Query<PoiBaseInfos>("ActivityPoiMegaFilterMM")                    
                    .AddQueryInput("lang", language)                                        
                    .Where(x => x.Type == activitytype)
                    .TransformWith<ActivityPoiReducedTransformer, ActivityPoiReduced>();
            }

//End Query

With the Sync Ravensession (documentStore.OpenSession()) all is working perfectly.

When i use this on an Async Ravensession i get an Error that the AddQueryInput Parameter is not provided..... What am I missing?
Thank you in advance ;)

//Example using Asnyc session
var activitylist = await RavenSession.Query<PoiBaseInfos>("ActivityPoiMegaFilterMM")
                .AddQueryInput("lang", language)                    
                .Where(x => x.Type == activitytype)
                .TransformWith<ActivityPoiReducedTransformer, ActivityPoiReduced>()                   
                .ToListAsync();

///Exception, Full Stack Trace:

{"Message":"An error has occurred.","ExceptionMessage":"One or more errors occurred.","ExceptionType":"System.AggregateException","StackTrace":"   at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)\r\n   at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)\r\n   at System.Threading.Tasks.Task`1.get_Result()\r\n   at Raven.Client.Document.AbstractDocumentQuery`2.<ToListAsync>b__3f(Task`1 t)\r\n   at System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke()\r\n   at System.Threading.Tasks.Task.Execute()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n   at SuedtirolManager.Controllers.api.ActivityController.<GetReducedAsync>d__5e.MoveNext() in c:\\VSProjects\\SuedtirolDB\\suedtiroldb\\SuedtirolManager\\Controllers\\api\\ActivityController.cs:line 365\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n   at System.Threading.Tasks.TaskHelpersExtensions.<CastToObject>d__3`1.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n   at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n   at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n   at System.Web.Http.Controllers.AuthenticationFilterResult.<ExecuteAsync>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n   at SuedtirolManager.Controllers.api.RavenController.<ExecuteAsync>d__0.MoveNext() in c:\\VSProjects\\SuedtirolDB\\suedtiroldb\\SuedtirolManager\\Controllers\\api\\RavenController.cs:line 43\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n   at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()","InnerException":{"Message":"An error has occurred.","ExceptionMessage":"One or more errors occurred.","ExceptionType":"System.AggregateException","StackTrace":"   at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)\r\n   at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)\r\n   at System.Threading.Tasks.Task`1.get_Result()\r\n   at Raven.Client.Document.AbstractDocumentQuery`2.ProcessEnumerator(Task`1 task)\r\n   at Raven.Client.Document.AbstractDocumentQuery`2.<ToListAsync>b__40(Task`1 t)\r\n   at System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke()\r\n   at System.Threading.Tasks.Task.Execute()","InnerException":{"Message":"An error has occurred.","ExceptionMessage":"One or more errors occurred.","ExceptionType":"System.AggregateException","StackTrace":"   at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)\r\n   at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)\r\n   at System.Threading.Tasks.Task`1.get_Result()\r\n   at Raven.Client.Document.AbstractDocumentQuery`2.<ExecuteActualQueryAsync>b__2b(Task`1 task)\r\n   at System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke()\r\n   at System.Threading.Tasks.Task.Execute()","InnerException":{"Message":"An error has occurred.","ExceptionMessage":"One or more errors occurred.","ExceptionType":"System.AggregateException","StackTrace":"   at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)\r\n   at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)\r\n   at System.Threading.Tasks.Task`1.get_Result()\r\n   at Raven.Client.Connection.Async.AsyncServerClient.<>c__DisplayClassda.<>c__DisplayClassdd.<>c__DisplayClassdf.<QueryAsync>b__d9()\r\n   at Raven.Client.Connection.Async.AsyncServerClient.AttemptToProcessResponse[T](Func`1 process)\r\n   at Raven.Client.Connection.Async.AsyncServerClient.<>c__DisplayClassda.<>c__DisplayClassdd.<QueryAsync>b__d8(Task`1 task)\r\n   at System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke()\r\n   at System.Threading.Tasks.Task.Execute()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n   at Raven.Client.Connection.ReplicationInformer.<TryOperationAsync>d__21`1.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n   at Raven.Client.Connection.ReplicationInformer.<ExecuteWithReplicationAsync>d__12`1.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n   at Raven.Client.Connection.Async.AsyncServerClient.<ExecuteWithReplication>d__132`1.MoveNext()","InnerException":{"Message":"An error has occurred.","ExceptionMessage":"Url: \"/indexes/ActivityPoiMegaFilterMM?&query=Type%3ABerg&pageSize=128&fetch=Id&fetch=Name&resultsTransformer=ActivityPoiReducedTransformer\"\r\n\r\nSystem.InvalidOperationException: The transform results function failed.\r\nDoc '65bb0e08e714d83bfa6c39762ab515a4', Error: Query parameter lang was accessed, but it wasn't provided for this query.\r\nDoc '443d73d7a2c8adf9647ecd7dd6e28af5', Error: Query parameter lang was accessed, but it wasn't provided for this query.\r\nDoc '72d240d11ca5da88bb54be00d1a3111b', Error: Query parameter lang was accessed, but it wasn't provided for this query.\r\nDoc 'ab64331ad61bfc1f990536df16dcb7fc', Error: Query parameter lang was accessed, but it wasn't provided for this query.\r\nDoc '555dc97315c81d9312380980a1c67483', Error: Query parameter lang was accessed, but it wasn't provided for this query.\r\nDoc '4aff40ddf38c7c9cee601b5c2abd4255', Error: Query parameter lang was accessed, but it wasn't provided for this query.\r\nDoc 'ae65aaf383829422d0d1bf14c20f35e6', Error: Query parameter lang was accessed, but it wasn't provided for this query.\r\nDoc 'b91d9f4c8bf3b3c71cb991cf98b545b1', Error: Query parameter lang was accessed, but it wasn't provided for this query.\r\nDoc 'b28b182ecb997e2cf0a6f4795272b92a', Error: Query parameter lang was accessed, but it wasn't provided for this query.\r\nDoc '639205f5225da20cb225ca114686f210', Error: Query parameter lang was accessed, but it wasn't provided for this query.\r\nDoc '7aa3b7c5c5b412d4d952ed0cb49132b8', Error: Query parameter lang was accessed, but it wasn't provided for this query.\r\nDoc '2ed396bd38a1d2332078e78014df678a', Error: Query parameter lang was accessed, but it wasn't provided for this query.\r\nDoc '7b33fcee9900c8a04d2dc107b3585176', Error: Query parameter lang was accessed, but it wasn't provided for this query.\r\nDoc '517f8ac633eb33a6d18bec8ed1563e6e', Error: Query parameter lang was accessed, but it wasn't provided for this query.\r\nDoc '41153c9e0217c9f38264b6290b77c1f0', Error: Query parameter lang was accessed, but it wasn't provided for this query.\r\nDoc '7f3ff8e4b1b2c1b116d2e9d556dd6f22', Error: Query parameter lang was accessed, but it wasn't provided for this query.\r\n   at Raven.Database.DocumentDatabase.<>c__DisplayClass8f.<Query>b__84(IStorageActionsAccessor actions)\r\n   at Raven.Storage.Esent.TransactionalStorage.ExecuteBatch(Action`1 action, EsentTransactionContext transactionContext)\r\n   at Raven.Storage.Esent.TransactionalStorage.Batch(Action`1 action)\r\n   at Raven.Database.DocumentDatabase.Query(String index, IndexQuery query, CancellationToken externalCancellationToken, Action`1 headerInfo, Action`1 onResult)\r\n   at Raven.Database.DocumentDatabase.Query(String index, IndexQuery query, CancellationToken token)\r\n   at Raven.Database.Server.Responders.Index.PerformQueryAgainstExistingIndex(IHttpContext context, String index, IndexQuery indexQuery, CancellationToken token, Etag& indexEtag)\r\n   at Raven.Database.Server.Responders.Index.ExecuteQuery(IHttpContext context, String index, CancellationToken token, Etag& indexEtag)\r\n   at Raven.Database.Server.Responders.Index.GetIndexQueryResult(IHttpContext context, String index)\r\n   at Raven.Database.Server.HttpServer.DispatchRequest(IHttpContext ctx)\r\n   at Raven.Database.Server.HttpServer.HandleActualRequest(IHttpContext ctx)\r\n","ExceptionType":"System.InvalidOperationException","StackTrace":"   at Raven.Client.Connection.HttpJsonRequest.HandleErrors(WebException e)\r\n   at Raven.Client.Connection.HttpJsonRequest.<ReadJsonInternalAsync>d__28.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()\r\n   at Raven.Client.Connection.HttpJsonRequest.<ReadResponseJsonAsync>d__6.MoveNext()","InnerException":{"Message":"An error has occurred.","ExceptionMessage":"The remote server returned an error: (500) Internal Server Error.","ExceptionType":"System.Net.WebException","StackTrace":"   at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)\r\n   at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()\r\n   at Raven.Client.Connection.HttpJsonRequest.<ReadJsonInternalAsync>d__28.MoveNext()"}}}}}}

Oren Eini (Ayende Rahien)

unread,
Oct 31, 2014, 10:03:22 AM10/31/14
to ravendb
Can you create a failing test for us to look at?

Hibernating Rhinos Ltd  

Oren Eini l CEO Mobile: + 972-52-548-6969

Office: +972-4-622-7811 l Fax: +972-153-4-622-7811

 


--
You received this message because you are subscribed to the Google Groups "RavenDB - 2nd generation document database" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ravendb+u...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Rudi Thoeni

unread,
Oct 31, 2014, 6:39:25 PM10/31/14
to rav...@googlegroups.com
Below my Test Sample....

The Async Session Query with the Transformer gives this Exception, the .AddQueryInput("lang", "de") seems to fail.

System.InvalidOperationException: The transform results function failed.
Doc 'franz18', Error: Query parameter lang was accessed, but it wasn't provided for this query.
Doc 'anton20', Error: Query parameter lang was accessed, but it wasn't provided for this query.

The reason why I am using the Result Transformer is that a Single Select over a Dictionary Property does not work, the Linq Translater gives an Exception

Example:
var result = session.Query<TestObject, TestObject_Index>()
                    .Where(x => x.Hobbies.In(hobbieslist))
                    .Select(x => new TestObjectReduced { Id = x.Id, Name = x.Name["de"] })
                    .ToList();

Exception:
Additional information: Could not understand how to translate 'x.Name.get_Item("de")' to a RavenDB query.



_____________________
Failing Test class:

using Raven.Client;
using Raven.Client.Indexes;
using Raven.Tests.Helpers;
using Raven.Client.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xunit;

namespace RavenTest
{
    public class RavenTestSample : RavenTestBase
    {
        [Fact]        
        public void ThisIsMyTest()
        {
            IDocumentStore store = NewDocumentStore();

            Console.WriteLine("Fill Database");
            FillDatabase(store);

            Console.WriteLine("Create Index");
            new TestObject_Index().Execute(store);

            Console.WriteLine("Create Transformer");
            new TestObject_Transformer().Execute(store);

            Console.WriteLine("Sync Session --> Transform");
            TransformResult(store);

            Console.WriteLine("Async Session --> Transform");
            //Fails
            TransformResultAsync(store);

            Console.ReadLine();
        }

        public static void FillDatabase(IDocumentStore store)
        {
            Dictionary<string, string> namedict = new Dictionary<string, string>();
            namedict.Add("de", "Franz");
            namedict.Add("it", "Francesco");
            var firstobject = new TestObject() { Id = "Franz18", Age = 18, Hobbies = new List<string>() { "Soccer", "Volleyball" }, Name = namedict };

            Dictionary<string, string> namedict2 = new Dictionary<string, string>();
            namedict2.Add("de", "Anton");
            namedict2.Add("it", "Antonio");
            var secondobject = new TestObject() { Id = "Anton20", Age = 20, Hobbies = new List<string>() { "Soccer", "Volleyball", "Skiing" }, Name = namedict2 };


            using (var session = store.OpenSession())
            {
                session.Store(firstobject);
                session.Store(secondobject);

                session.SaveChanges();
            }
        }

        public static void TransformResult(IDocumentStore store)
        {
            var hobbieslist = new List<string>() { "Soccer", "Volleyball" };

            using (var session = store.OpenSession())
            {
                var result = session.Query<TestObject, TestObject_Index>()
                    .Where(x => x.Hobbies.In(hobbieslist))
                    .AddQueryInput("lang", "de")
                    .TransformWith<TestObject_Transformer, TestObjectReduced>()
                    .ToList();

                Console.WriteLine(result.Count + " objekcs found & Transformed");
            }
        }

        public static async void TransformResultAsync(IDocumentStore store)
        {
            var hobbieslist = new List<string>() { "Soccer", "Volleyball" };

            using (var session = store.OpenAsyncSession())
            {

                var result = await session.Query<TestObject, TestObject_Index>()
                    .Where(x => x.Hobbies.In(hobbieslist))
                    .AddQueryInput("lang", "de")
                    .TransformWith<TestObject_Transformer, TestObjectReduced>()
                    .ToListAsync();

                Console.WriteLine(result.Count + " objects found & Transformed");
            }
        }       
    }

    public class TestObject
    {
        public TestObject()
        {
            Name = new Dictionary<string, string>();
        }

        public string Id { get; set; }
        public int Age { get; set; }
        public IDictionary<string, string> Name { get; set; }
        public ICollection<string> Hobbies { get; set; }
    }

    public class TestObjectReduced
    {
        public string Id { get; set; }
        public string Name { get; set; }
    }

    public class TestObject_Index : AbstractIndexCreationTask<TestObject>
    {
        public TestObject_Index()
        {
            Map = docs => from doc in docs
                          select new
                          {
                              doc.Hobbies
                          };
        }
    }

    public class TestObject_Transformer : AbstractTransformerCreationTask<TestObject>
    {
        public TestObject_Transformer()
        {
            TransformResults = activities => from activity in activities
                                             let language = this.Query("lang").Value<String>()
                                             select new TestObjectReduced
                                             {
                                                 Id = activity.Id,
                                                 Name = activity.Name[language]
                                             };
        }
    }
}
RavenTestSample.cs

Oren Eini (Ayende Rahien)

unread,
Oct 31, 2014, 9:01:37 PM10/31/14
to ravendb
Reply all
Reply to author
Forward
0 new messages