passing a string[] as a parameter to transformer

46 views
Skip to first unread message

Stacey

unread,
Apr 28, 2016, 12:13:30 PM4/28/16
to RavenDB - 2nd generation document database
I'm trying to pass a string[] value as a parameter to a transformer that is intending to use it, as seen below;

public ArticleByRolesTransformer()
        {
            TransformResults = results => from result in results
                                          let roles = ParameterOrDefault("roles", new string[] { "guest" }).Value<string[]>()
                                          select new Result
                                          {
                                              Id = result.Id,
                                              Name = result.Name,
                                              Actions = new Dictionary<string, bool>
                                              {
                                                  {"read", result.Roles["read"].ContainsAny(roles) },
                                                  {"edit", result.Roles["edit"].ContainsAny(roles) }
                                              }
                                          };
        }

and this is how I'm wiring it into the transformer;

var results = await RavenSession.Query<Article>()
                    .Where(n => n.Owner == node.ToIdentity<Article>())
                    .Where(n => n.Roles["read"].ContainsAny(roles))
                    .Where(n => n.Online)
                    .TransformWith<
                        Raven.ArticleByRolesTransformer,
                        Raven.ArticleByRolesTransformer.Result
                        >()
                    .AddTransformerParameter("roles", RavenJToken.FromObject(roles))
                    .ToListAsync();

But I'm getting an error ..

Url: "/databases/testing-isolated/indexes/dynamic/Articles?&query=%28Owner%3Aarticles%2F0%29%20AND%20%28%20%28Roles.read%3Aplayer%20OR%20Roles.read%3Astaff%20OR%20Roles.read%3Aadmin%29%29%20AND%20%28Online%3Atrue%29&pageSize=128&SortHint-Online=String&resultsTransformer=ArticleByRolesTransformer&tp-roles=[%0D%0A%20%20%22player%22,%0D%0A%20%20%22staff%22,%0D%0A%20%20%22admin%22%0D%0A]"
System.InvalidOperationException: The transform results function failed.
Doc 'articles/1', Error: Unable to find suitable conversion for System.String since it is not predefined and does not implement IConvertible.
Doc 'articles/8', Error: Unable to find suitable conversion for System.String since it is not predefined and does not implement IConvertible.
Doc 'articles/15', Error: Unable to find suitable conversion for System.String since it is not predefined and does not implement IConvertible.
Doc 'articles/22', Error: Unable to find suitable conversion for System.String since it is not predefined and does not implement IConvertible.
Doc 'articles/29', Error: Unable to find suitable conversion for System.String since it is not predefined and does not implement IConvertible.
Doc 'articles/36', Error: Unable to find suitable conversion for System.String since it is not predefined and does not implement IConvertible.
   at Raven.Database.Actions.QueryActions.DatabaseQueryOperation.Execute(Action`1 onResult) in c:\Builds\RavenDB-Stable-3.0\Raven.Database\Actions\QueryActions.cs:line 289
   at Raven.Database.Actions.QueryActions.<>c__DisplayClasse.<Query>b__a(IStorageActionsAccessor accessor) in c:\Builds\RavenDB-Stable-3.0\Raven.Database\Actions\QueryActions.cs:line 119
   at Raven.Storage.Esent.TransactionalStorage.ExecuteBatch(Action`1 action, EsentTransactionContext transactionContext) in c:\Builds\RavenDB-Stable-3.0\Raven.Database\Storage\Esent\TransactionalStorage.cs:line 850
   at Raven.Storage.Esent.TransactionalStorage.Batch(Action`1 action) in c:\Builds\RavenDB-Stable-3.0\Raven.Database\Storage\Esent\TransactionalStorage.cs:line 811
   at Raven.Database.Actions.QueryActions.Query(String index, IndexQuery query, CancellationToken externalCancellationToken) in c:\Builds\RavenDB-Stable-3.0\Raven.Database\Actions\QueryActions.cs:line 108
   at Raven.Database.Queries.DynamicQueryRunner.ExecuteActualQuery(IndexQuery query, DynamicQueryMapping map, Tuple`2 touchTemporaryIndexResult, String realQuery, CancellationToken token) in c:\Builds\RavenDB-Stable-3.0\Raven.Database\Queries\DynamicQueryRunner.cs:line 64
   at Raven.Database.Queries.DynamicQueryRunner.ExecuteDynamicQuery(String entityName, IndexQuery query, CancellationToken token) in c:\Builds\RavenDB-Stable-3.0\Raven.Database\Queries\DynamicQueryRunner.cs:line 42
   at Raven.Database.Queries.DynamicQueryExtensions.ExecuteDynamicQuery(DocumentDatabase self, String entityName, IndexQuery indexQuery, CancellationToken token) in c:\Builds\RavenDB-Stable-3.0\Raven.Database\Queries\DynamicQueryExtensions.cs:line 19
   at Raven.Database.Server.Controllers.IndexController.PerformQueryAgainstDynamicIndex(String index, IndexQuery indexQuery, Etag& indexEtag, HttpResponseMessage msg, CancellationToken token) in c:\Builds\RavenDB-Stable-3.0\Raven.Database\Server\Controllers\IndexController.cs:line 713
   at Raven.Database.Server.Controllers.IndexController.ExecuteQuery(String index, Etag& indexEtag, HttpResponseMessage msg, CancellationToken token) in c:\Builds\RavenDB-Stable-3.0\Raven.Database\Server\Controllers\IndexController.cs:line 607
   at Raven.Database.Server.Controllers.IndexController.GetIndexQueryResult(String index, CancellationToken token) in c:\Builds\RavenDB-Stable-3.0\Raven.Database\Server\Controllers\IndexController.cs:line 578
   at Raven.Database.Server.Controllers.IndexController.IndexGet(String id) in c:\Builds\RavenDB-Stable-3.0\Raven.Database\Server\Controllers\IndexController.cs:line 182
   at lambda_method(Closure , Object , Object[] )
   at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)
   at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Web.Http.Controllers.ExceptionFilterResult.<ExecuteAsync>d__0.MoveNext()

Which seems to me that it can't figure out what to do with a string[]. Is there another way to solve this? I'm a bit unclear about what kinds of parameters can be sent to a transformer.

Oren Eini (Ayende Rahien)

unread,
Apr 28, 2016, 1:50:11 PM4/28/16
to ravendb
What does the transformer looks like server side?


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.

Reply all
Reply to author
Forward
0 new messages