Re: Facet Setup -- Facets on date time fields.

358 views
Skip to first unread message

Matt Warren

unread,
Jul 15, 2012, 4:22:48 AM7/15/12
to rav...@googlegroups.com
In that build you have access to the new strongly-typed facet api, you can now write something like this:

var newFacet = new Facet<Test>
{
    Name = x => x.Date,
    Ranges =
    {
        x => x.Date < new DateTime(2012, 07, 13),
        x => x.Date > new DateTime(2010, 07, 13) && x.Date > new DateTime(2010, 07, 15)
        x => x.Date > new DateTime(2012, 07, 15),
    }
};

See https://github.com/ayende/ravendb/blob/1.2/Raven.Tests/Faceted/FacetAdvancedAPI.cs for some more examples

On Sunday, 15 July 2012 06:53:18 UTC+1, Oceanswave wrote:
Hey, having odd trouble with this one -- attempting to create range facets on a date time field and it's totally driving me batty (maybe I'm just batty in the first place... probably more likely)

Here's my Facet Setup definition:

{
  "Facets": [
    {
      "Mode": "Default",
      "Name": "ForumId",
      "Ranges": []
    },
    {
      "Mode": "Default",
      "Name": "Prefix",
      "Ranges": []
    },
    {
      "Mode": "Ranges",
      "Name": "ViewCount_Range",
      "Ranges": [
        "[NULL TO 0x00000005]",
        "[0x00000005 TO 0x0000000A]",
        "[0x0000000A TO 0x00000014]",
        "[0x00000014 TO 0x00000064]",
        "[0x00000064 TO 0x000000C8]",
        "[0x000000C8 TO 0x0000012C]",
        "[0x0000012C TO 0x00000190]",
        "[0x00000190 TO 0x000001F4]",
        "[0x000001F4 TO 0x00000258]",
        "[0x00000258 TO 0x000002BC]",
        "[0x000002BC TO 0x00000320]",
        "[0x00000320 TO 0x00000384]",
        "[0x00000384 TO 0x000003E8]",
        "[0x000003E8 TO NULL]"
      ]
    },
    {
      "Mode": "Default",
      "Name": "Creator",
      "Ranges": []
    },
    {
      "Mode": "Ranges",
      "Name": "CreationDate_Range",
      "Ranges": [
        "[NULL TO 20120713]",
        "[20120713 TO 20120714]",
        "[20120714 TO NULL]"
      ]
    }
  ]
}

All the other facets work wonderfully .... except the redheaded stepchild of CreationDate_Range. Boo.

I'm using  DateTools.DateToString(...) with a resolution of Day -- everything else was completely simple except for this date time field.

using Raven Build 2022.

Thanks in advance.
Message has been deleted

Oceanswave

unread,
Jul 15, 2012, 9:54:20 AM7/15/12
to rav...@googlegroups.com
Does this handle nullable datetimes? If I don't use the .Value in the facet range, it throws an exception.

new Facet<Thread>() {
            Name = t => t.CreationDate,
            Ranges =
            {
              t => t.CreationDate.Value < DateTime.Now,
            }

var query = session.Query<Threads_Search.ReduceResult, Threads_Search>()
                             .Statistics(out stats)
                             .OrderByDescending(t => t.CreationDate)
                             .ToFacets("facets/klthreadfacets");


System.InvalidOperationException was unhandled by user code
  HResult=-2146233079
  Message=Url: "/facets/Threads/Search?facetDoc=facets%2Fthreadfacets&query="

Lucene.Net.QueryParsers.ParseException: Cannot parse 'CreationDate_Range:Value_Range:[NULL TO 20120715095144830]': Encountered " ":" ": "" at line 1, column 30.
Was expecting one of:
    <EOF> 
    <AND> ...
    <OR> ...
    <NOT> ...
    "+" ...
    "-" ...
    "(" ...
    "*" ...
    "^" ...
    <QUOTED> ...
    <TERM> ...
    <FUZZY_SLOP> ...
    <PREFIXTERM> ...
    <WILDTERM> ...
    "[" ...
    "{" ...
    <NUMBER> ...
     ---> Lucene.Net.QueryParsers.ParseException: Encountered " ":" ": "" at line 1, column 30.
Was expecting one of:
    <EOF> 
    <AND> ...
    <OR> ...
    <NOT> ...
    "+" ...
    "-" ...
    "(" ...
    "*" ...
    "^" ...
    <QUOTED> ...
    <TERM> ...
    <FUZZY_SLOP> ...
    <PREFIXTERM> ...
    <WILDTERM> ...
    "[" ...
    "{" ...
    <NUMBER> ...
    
   at Lucene.Net.QueryParsers.QueryParser.Jj_consume_token(Int32 kind)
   at Lucene.Net.QueryParsers.QueryParser.Parse(String query)
   --- End of inner exception stack trace ---
   at Lucene.Net.QueryParsers.QueryParser.Parse(String query)
   at Raven.Database.Indexing.QueryBuilder.BuildQuery(String query, String defaultField, PerFieldAnalyzerWrapper analyzer)
   at Raven.Database.Indexing.Index.IndexQueryOperation.GetLuceneQuery(String query, String defaultField)
   at Raven.Database.Indexing.Index.IndexQueryOperation.GetLuceneQuery()
   at Raven.Database.Indexing.IndexStorage.GetLuceneQuery(String index, IndexQuery query, OrderedPartCollection`1 indexQueryTriggers)
   at Raven.Database.Queries.FacetedQueryRunner.HandleRangeFacet(String index, Facet facet, IndexQuery indexQuery, IndexSearcher currentIndexSearcher, Dictionary`2 results)
   at Raven.Database.Queries.FacetedQueryRunner.GetFacets(String index, IndexQuery indexQuery, String facetSetupDoc)
   at Raven.Database.Server.Responders.Facets.Respond(IHttpContext context)
   at Raven.Database.Server.HttpServer.DispatchRequest(IHttpContext ctx)
   at Raven.Database.Server.HttpServer.HandleActualRequest(IHttpContext ctx)

  Source=Raven.Client.Lightweight
  StackTrace:
       at Raven.Client.Connection.HttpJsonRequest.HandleErrors(WebException e) in c:\Builds\RavenDB-Unstable-v1.2\Raven.Client.Lightweight\Connection\HttpJsonRequest.cs:line 422
       at Raven.Client.Connection.HttpJsonRequest.ReadJsonInternal(Func`1 getResponse) in c:\Builds\RavenDB-Unstable-v1.2\Raven.Client.Lightweight\Connection\HttpJsonRequest.cs:line 292
       at Raven.Client.Connection.HttpJsonRequest.ReadResponseJson() in c:\Builds\RavenDB-Unstable-v1.2\Raven.Client.Lightweight\Connection\HttpJsonRequest.cs:line 202
       at Raven.Client.Connection.ServerClient.<>c__DisplayClass88.<GetFacets>b__87(String operationUrl) in c:\Builds\RavenDB-Unstable-v1.2\Raven.Client.Lightweight\Connection\ServerClient.cs:line 1310
       at Raven.Client.Connection.ReplicationInformer.TryOperation[T](Func`2 operation, String operationUrl, Boolean avoidThrowing, T& result) in c:\Builds\RavenDB-Unstable-v1.2\Raven.Client.Lightweight\Connection\ReplicationInformer.cs:line 548
       at Raven.Client.Connection.ReplicationInformer.ExecuteWithReplication[T](String method, String primaryUrl, Int32 currentRequest, Int32 currentReadStripingBase, Func`2 operation) in c:\Builds\RavenDB-Unstable-v1.2\Raven.Client.Lightweight\Connection\ReplicationInformer.cs:line 520
       at Raven.Client.Connection.ServerClient.ExecuteWithReplication[T](String method, Func`2 operation) in c:\Builds\RavenDB-Unstable-v1.2\Raven.Client.Lightweight\Connection\ServerClient.cs:line 165
       at Raven.Client.Connection.ServerClient.GetFacets(String index, IndexQuery query, String facetSetupDoc) in c:\Builds\RavenDB-Unstable-v1.2\Raven.Client.Lightweight\Connection\ServerClient.cs:line 1299
       at Raven.Client.Linq.LinqExtensions.ToFacets[T](IQueryable`1 queryable, String facetDoc) in c:\Builds\RavenDB-Unstable-v1.2\Raven.Client.Lightweight\Linq\LinqExtensions.cs:line 36
       
  InnerException: 

Oren Eini (Ayende Rahien)

unread,
Jul 15, 2012, 10:59:30 AM7/15/12
to rav...@googlegroups.com
It doesn't, it seems.
Can you use a non nullable value?

Oren Eini (Ayende Rahien)

unread,
Jul 15, 2012, 10:59:41 AM7/15/12
to rav...@googlegroups.com
And please open an issue for this

Oceanswave

unread,
Jul 15, 2012, 12:39:03 PM7/15/12
to rav...@googlegroups.com
Yeah, I can work around it knowing more about the range syntax.

opened as RavenDB-432.

Oceanswave

unread,
Jul 15, 2012, 12:52:25 PM7/15/12
to rav...@googlegroups.com
Lemmie try getting a later build, the following:
new Facet<Thread>() {
            Name = t => t.CreationDate,
            Ranges =
            {
              t => t.CreationDate < DateTime.Today,
            }

results in a facetsetup doc that contains:
{
      "Mode": "Ranges",
      "Name": "CreationDate_Range",
      "Ranges": [
        "CreationDate_Range:[NULL TO 20120715000000000]"
      ]
    }

which is invalid as well.

Oren Eini (Ayende Rahien)

unread,
Jul 15, 2012, 12:54:47 PM7/15/12
to rav...@googlegroups.com
What is invalid here?

Oceanswave

unread,
Jul 15, 2012, 6:27:58 PM7/15/12
to rav...@googlegroups.com
System.InvalidOperationException was unhandled by user code
  HResult=-2146233079
  Message=Url: "/facets/Threads/Search?facetDoc=facets%2Fthreadfacets&query="

Lucene.Net.QueryParsers.ParseException: Cannot parse 'CreationDate_Range:CreationDate_Range:[NULL TO 20120715000000000]': Encountered " ":" ": "" at line 1, column 37.
Was expecting one of:
    <EOF> 
    <AND> ...
    <OR> ...
    <NOT> ...
    "+" ...
    "-" ...
    "(" ...
    "*" ...
    "^" ...
    <QUOTED> ...
    <TERM> ...
    <FUZZY_SLOP> ...
    <PREFIXTERM> ...
    <WILDTERM> ...
    "[" ...
    "{" ...
    <NUMBER> ...
     ---> Lucene.Net.QueryParsers.ParseException: Encountered " ":" ": "" at line 1, column 37.
Was expecting one of:
    <EOF> 
    <AND> ...
    <OR> ...
    <NOT> ...
    "+" ...
    "-" ...
    "(" ...
    "*" ...
    "^" ...
    <QUOTED> ...
    <TERM> ...
    <FUZZY_SLOP> ...
    <PREFIXTERM> ...
    <WILDTERM> ...
    "[" ...
    "{" ...
    <NUMBER> ...
    
   at Lucene.Net.QueryParsers.QueryParser.Jj_consume_token(Int32 kind) in z:\Libs\lucene.net\src\core\QueryParser\QueryParser.cs:line 2130
   at Lucene.Net.QueryParsers.QueryParser.Parse(String query) in z:\Libs\lucene.net\src\core\QueryParser\QueryParser.cs:line 232
   --- End of inner exception stack trace ---
   at Lucene.Net.QueryParsers.QueryParser.Parse(String query) in z:\Libs\lucene.net\src\core\QueryParser\QueryParser.cs:line 250
   at Raven.Database.Indexing.QueryBuilder.BuildQuery(String query, String defaultField, PerFieldAnalyzerWrapper analyzer) in c:\Builds\RavenDB-Unstable-v1.2\Raven.Database\Indexing\QueryBuilder.cs:line 37
   at Raven.Database.Indexing.Index.IndexQueryOperation.GetLuceneQuery(String query, String defaultField) in c:\Builds\RavenDB-Unstable-v1.2\Raven.Database\Indexing\Index.cs:line 891
   at Raven.Database.Indexing.Index.IndexQueryOperation.GetLuceneQuery() in c:\Builds\RavenDB-Unstable-v1.2\Raven.Database\Indexing\Index.cs:line 851
   at Raven.Database.Indexing.IndexStorage.GetLuceneQuery(String index, IndexQuery query, OrderedPartCollection`1 indexQueryTriggers) in c:\Builds\RavenDB-Unstable-v1.2\Raven.Database\Indexing\IndexStorage.cs:line 331
   at Raven.Database.Queries.FacetedQueryRunner.HandleRangeFacet(String index, Facet facet, IndexQuery indexQuery, IndexSearcher currentIndexSearcher, Dictionary`2 results) in c:\Builds\RavenDB-Unstable-v1.2\Raven.Database\Queries\FacetedQueryRunner.cs:line 67
   at Raven.Database.Queries.FacetedQueryRunner.GetFacets(String index, IndexQuery indexQuery, String facetSetupDoc) in c:\Builds\RavenDB-Unstable-v1.2\Raven.Database\Queries\FacetedQueryRunner.cs:line 43
   at Raven.Database.Server.Responders.Facets.Respond(IHttpContext context) in c:\Builds\RavenDB-Unstable-v1.2\Raven.Database\Server\Responders\Facets.cs:line 46
   at Raven.Database.Server.HttpServer.DispatchRequest(IHttpContext ctx) in c:\Builds\RavenDB-Unstable-v1.2\Raven.Database\Server\HttpServer.cs:line 582
   at Raven.Database.Server.HttpServer.HandleActualRequest(IHttpContext ctx) in c:\Builds\RavenDB-Unstable-v1.2\Raven.Database\Server\HttpServer.cs:line 347

  Source=Raven.Client.Lightweight
  StackTrace:
       at Raven.Client.Connection.HttpJsonRequest.HandleErrors(WebException e) in c:\Builds\RavenDB-Unstable-v1.2\Raven.Client.Lightweight\Connection\HttpJsonRequest.cs:line 422
       at Raven.Client.Connection.HttpJsonRequest.ReadJsonInternal(Func`1 getResponse) in c:\Builds\RavenDB-Unstable-v1.2\Raven.Client.Lightweight\Connection\HttpJsonRequest.cs:line 292
       at Raven.Client.Connection.HttpJsonRequest.ReadResponseJson() in c:\Builds\RavenDB-Unstable-v1.2\Raven.Client.Lightweight\Connection\HttpJsonRequest.cs:line 202
       at Raven.Client.Connection.ServerClient.<>c__DisplayClass8b.<GetFacets>b__8a(String operationUrl) in c:\Builds\RavenDB-Unstable-v1.2\Raven.Client.Lightweight\Connection\ServerClient.cs:line 1343
       at Raven.Client.Connection.ReplicationInformer.TryOperation[T](Func`2 operation, String operationUrl, Boolean avoidThrowing, T& result) in c:\Builds\RavenDB-Unstable-v1.2\Raven.Client.Lightweight\Connection\ReplicationInformer.cs:line 563
       at Raven.Client.Connection.ReplicationInformer.ExecuteWithReplication[T](String method, String primaryUrl, Int32 currentRequest, Int32 currentReadStripingBase, Func`2 operation) in c:\Builds\RavenDB-Unstable-v1.2\Raven.Client.Lightweight\Connection\ReplicationInformer.cs:line 535
       at Raven.Client.Connection.ServerClient.ExecuteWithReplication[T](String method, Func`2 operation) in c:\Builds\RavenDB-Unstable-v1.2\Raven.Client.Lightweight\Connection\ServerClient.cs:line 173
       at Raven.Client.Connection.ServerClient.GetFacets(String index, IndexQuery query, String facetSetupDoc) in c:\Builds\RavenDB-Unstable-v1.2\Raven.Client.Lightweight\Connection\ServerClient.cs:line 1332

Matt Warren

unread,
Jul 16, 2012, 5:02:04 AM7/16/12
to rav...@googlegroups.com
Whoops that's a bug, it's putting "CreationDate_Range" in there twice, sorry about that

I'll take a look at this and the issue above (with nullable types)

Oren Eini (Ayende Rahien)

unread,
Jul 23, 2012, 12:14:52 AM7/23/12
to rav...@googlegroups.com
Fixed in the next build
Reply all
Reply to author
Forward
0 new messages