From 31e2e99c36fed832c272100e6f9f0dbe4b32a378 Mon Sep 17 00:00:00 2001 From: Eike Kettner Date: Sun, 7 Mar 2021 13:34:35 +0100 Subject: [PATCH] Add a `$year` shortcut for selecting items within some year --- .../shared/src/main/scala/docspell/query/ItemQuery.scala | 8 ++++++++ .../main/scala/docspell/query/internal/DateParser.scala | 3 +++ .../main/scala/docspell/query/internal/MacroParser.scala | 8 +++++++- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/modules/query/shared/src/main/scala/docspell/query/ItemQuery.scala b/modules/query/shared/src/main/scala/docspell/query/ItemQuery.scala index eb927a87..61bec94d 100644 --- a/modules/query/shared/src/main/scala/docspell/query/ItemQuery.scala +++ b/modules/query/shared/src/main/scala/docspell/query/ItemQuery.scala @@ -131,6 +131,14 @@ object ItemQuery { and(date(Operator.Gte, attr, left), date(Operator.Lte, attr, right)) } + case class YearMacro(attr: DateAttr, year: Int) extends MacroExpr { + val body = + DateRangeMacro(attr, date(year), date(year + 1)) + + private def date(y: Int): Date = + Date(y, 1, 1).fold(throw _, identity) + } + def or(expr0: Expr, exprs: Expr*): OrExpr = OrExpr(Nel.of(expr0, exprs: _*)) diff --git a/modules/query/shared/src/main/scala/docspell/query/internal/DateParser.scala b/modules/query/shared/src/main/scala/docspell/query/internal/DateParser.scala index 33e0d556..02d99926 100644 --- a/modules/query/shared/src/main/scala/docspell/query/internal/DateParser.scala +++ b/modules/query/shared/src/main/scala/docspell/query/internal/DateParser.scala @@ -43,6 +43,9 @@ object DateParser { private val dateFromToday: P[Date.DateLiteral] = P.string("today").as(Date.Today) + val yearOnly: P[Int] = + digits4 + val dateLiteral: P[Date.DateLiteral] = P.oneOf(List(dateFromString, dateFromToday, dateFromMillis)) diff --git a/modules/query/shared/src/main/scala/docspell/query/internal/MacroParser.scala b/modules/query/shared/src/main/scala/docspell/query/internal/MacroParser.scala index 856a2d96..0cfdda0f 100644 --- a/modules/query/shared/src/main/scala/docspell/query/internal/MacroParser.scala +++ b/modules/query/shared/src/main/scala/docspell/query/internal/MacroParser.scala @@ -16,6 +16,9 @@ object MacroParser { Expr.DateRangeMacro(attr, left, right) } + private def yearMacroImpl(name: String, attr: Attr.DateAttr): P[Expr.YearMacro] = + (macroDef(name) *> DateParser.yearOnly).map(year => Expr.YearMacro(attr, year)) + val namesMacro: P[Expr.NamesMacro] = (macroDef("names") *> BasicParser.singleString).map(Expr.NamesMacro.apply) @@ -25,9 +28,12 @@ object MacroParser { val dueDateRangeMacro: P[Expr.DateRangeMacro] = dateRangeMacroImpl("duein", Attr.DueDate) + val yearDateMacro: P[Expr.YearMacro] = + yearMacroImpl("year", Attr.Date) + // --- all macro parser val all: P[Expr] = - P.oneOf(List(namesMacro, dateRangeMacro, dueDateRangeMacro)) + P.oneOf(List(namesMacro, dateRangeMacro, dueDateRangeMacro, yearDateMacro)) }