Opened the 
PR: https://bitbucket.org/blais/beancount/pull-requests/89/date/diff. Sorry 
it took me this long!

Looking forward to seeing this merged in!

Thanks,
Shreedhar

On Saturday, September 15, 2018 at 7:56:11 AM UTC-5, Martin Blais wrote:
>
> On Thu, Sep 13, 2018 at 11:47 AM <shreedha...@gmail.com <javascript:>> 
> wrote:
>
>> Hi,
>>
>> Is there a way in bean-query to specify custom rate ranges e.g "last 30 
>> days". I tried to that with the following query, but get the following 
>> error:
>>
>> beancount> select * where (today() - date) < 30 limit 1
>> Traceback (most recent call last):
>>   File 
>> "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/cmd.py",
>>  
>> line 214, in onecmd
>>     func = getattr(self, 'do_' + cmd)
>> AttributeError: 'BQLShell' object has no attribute 'do_select'
>>
>> During handling of the above exception, another exception occurred:
>>
>> Traceback (most recent call last):
>>   File "/usr/local/lib/python3.7/site-packages/beancount/query/shell.py", 
>> line 270, in run_parser
>>     self.dispatch(statement)
>>   File "/usr/local/lib/python3.7/site-packages/beancount/query/shell.py", 
>> line 250, in dispatch
>>     return method(statement)
>>   File "/usr/local/lib/python3.7/site-packages/beancount/query/shell.py", 
>> line 418, in on_Select
>>     self.options_map)
>>   File 
>> "/usr/local/lib/python3.7/site-packages/beancount/query/query_execute.py", 
>> line 275, in execute_query
>>     if c_where is None or c_where(context):
>>   File 
>> "/usr/local/lib/python3.7/site-packages/beancount/query/query_compile.py", 
>> line 121, in __call__
>>     return self.operator(self.left(context), self.right(context))
>>   File 
>> "/usr/local/lib/python3.7/site-packages/beancount/query/query_compile.py", 
>> line 121, in __call__
>>     return self.operator(self.left(context), self.right(context))
>>   File 
>> "/usr/local/lib/python3.7/site-packages/beancount/query/query_compile.py", 
>> line 213, in <lambda>
>>     f = lambda x, y: Decimal(x - y)
>> TypeError: conversion from datetime.timedelta to Decimal is not supported
>>
>> I understand what's going on, I think. The EvalSub function in 
>> query_compile.py assumes the result to be Decimal, when "<date> - <date>" 
>> results in datetime.timedelta
>>
>> class EvalSub(EvalBinaryOp):
>>
>>     def __init__(self, left, right):
>>         f = lambda x, y: Decimal(x - y)
>>         super().__init__(f, left, right, Decimal)
>>
>> Do you know if there is already any way to write queries of this type? 
>>
>
> Not yet.
>
>  
>
>> This will be super useful is writing queries in the main beancount file 
>> (using the query directive) without needing to adjust the date directives 
>> every time.
>>
>> If there isn't, I wonder if we can implement such a feature.
>>
> Yes
>  
>
>> The way I see it, since beancount quantizes time by the day, I feel like 
>> these functions are easily defined:
>>
>>    - "<date> - <date>" should return the days. For example, '2018-01-01' 
>>    - '2017-01-01' = 365 etc.
>>    - "<date> +/- <int> should add/subtract days from the date. For 
>>    example, '2018-01-01' + 1 = '2018-01-02' etc.
>>
>> Using operator overloading would be difficult because the mini SQL parser 
> for this is not aware of types in this way.
> (I think the Right Thing to do eventually would be to use Ibis, which 
> AFAIK understands types in its parse tree, though I don't know if this 
> particular use case would work.)
>
>  
>
>> I see two ways of actually implementing it:
>>
>>    1. Add checks for the types of input to EvalSub/EvalMul etc methods 
>>    in query_compile.py. If both the first and second is date parameter for 
>>    EvalSub, extract the days from the result (<timedelta>.days); Else if the 
>>    first or second argument is of type date, convert the non-date param to a 
>>    timedelta(days=<value>). 
>>    2. Add new "simple functions" to the bean-query shell in 
>>    query_shell.py. They can be called date_diff(date, date) and 
>>    date_adjust(date, int) - or whatever else you feel works better. This is 
>>    probably cleaner and easier.
>>
>> (2) is much easier in this particular implementation.
>  
>
> Also, I can certainly help implement this if you need.
>>
>
> Go for it! Send me a patch
> Thank you
>
>
>  
>
>>
>> Thanks
>>
>>
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "Beancount" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to beancount+...@googlegroups.com <javascript:>.
>> To post to this group, send email to bean...@googlegroups.com 
>> <javascript:>.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/beancount/f04a7d37-066d-4148-88e8-0cf0a5291118%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/beancount/f04a7d37-066d-4148-88e8-0cf0a5291118%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>> For more options, visit https://groups.google.com/d/optout.
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Beancount" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to beancount+unsubscr...@googlegroups.com.
To post to this group, send email to beancount@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/beancount/dda69dfd-cfb2-4a6e-baf8-9878ff0412dc%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to