Skip to content

Commit fc65eb1

Browse files
max-zillalmarini
andauthored
Allow searching by created date (#174)
* Implement created flag * Fix lt gt lte gte functions Co-authored-by: Luigi Marini <[email protected]>
1 parent 4c02952 commit fc65eb1

File tree

4 files changed

+40
-5
lines changed

4 files changed

+40
-5
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
66

77
## Unreleased
88

9+
### Added
10+
- Added a new `created` search option for filtering by upload/creation date of resource.
11+
912
### Fixed
1013
- Clowder will no longer offer a Download button for a file until it has been PROCESSED.
1114

app/services/ElasticsearchPlugin.scala

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -724,12 +724,35 @@ class ElasticsearchPlugin(application: Application) extends Plugin {
724724

725725
/** Create appropriate search object based on operator */
726726
def parseMustOperators(builder: XContentBuilder, key: String, value: String, operator: String): XContentBuilder = {
727+
// TODO: Other date fields may need handling like this? ES always appends 00:00:00 if missing, breaking some things
728+
val startdate = if (value.length == 10) value+"T00:00:00.000Z" else value
729+
val enddate = if (value.length == 10) value+"T23:59:59.999Z" else value
727730
operator match {
728731
case "==" => builder.startObject().startObject("match_phrase").field(key, value).endObject().endObject()
729-
case "<" => builder.startObject().startObject("range").startObject(key).field("lt", value).endObject().endObject().endObject()
730-
case ">" => builder.startObject().startObject("range").startObject(key).field("gt", value).endObject().endObject().endObject()
731-
case "<=" => builder.startObject().startObject("range").startObject(key).field("lte", value).endObject().endObject().endObject()
732-
case ">=" => builder.startObject().startObject("range").startObject(key).field("gte", value).endObject().endObject().endObject()
732+
case "<" => {
733+
if (key=="created")
734+
builder.startObject().startObject("range").startObject(key).field("lt", startdate).endObject().endObject().endObject()
735+
else
736+
builder.startObject().startObject("range").startObject(key).field("lt", value).endObject().endObject().endObject()
737+
}
738+
case ">" => {
739+
if (key=="created")
740+
builder.startObject().startObject("range").startObject(key).field("gt", enddate).endObject().endObject().endObject()
741+
else
742+
builder.startObject().startObject("range").startObject(key).field("gt", value).endObject().endObject().endObject()
743+
}
744+
case "<=" => {
745+
if (key=="created")
746+
builder.startObject().startObject("range").startObject(key).field("lte", enddate).endObject().endObject().endObject()
747+
else
748+
builder.startObject().startObject("range").startObject(key).field("lte", value).endObject().endObject().endObject()
749+
}
750+
case ">=" => {
751+
if (key=="created")
752+
builder.startObject().startObject("range").startObject(key).field("gte", startdate).endObject().endObject().endObject()
753+
else
754+
builder.startObject().startObject("range").startObject(key).field("gte", value).endObject().endObject().endObject()
755+
}
733756
case ":" => {
734757
if (key == "_all")
735758
builder.startObject().startObject("regexp").field("_all", wrapRegex(value)).endObject().endObject()
@@ -740,6 +763,8 @@ class ElasticsearchPlugin(application: Application) extends Plugin {
740763
val cleaned = if (!value.startsWith("metadata.")) "metadata."+value else value
741764
builder.startObject().startObject("bool").startArray("must_not").startObject()
742765
.startObject("exists").field("field", cleaned).endObject().endObject().endArray().endObject().endObject()
766+
} else if (key == "created") {
767+
builder.startObject.startObject("range").startObject(key).field("gte", startdate).field("lte", enddate).endObject.endObject.endObject
743768
} else {
744769
val cleaned = value.replace(":", "\\:") // Colons have special meaning in query_string
745770
builder.startObject().startObject("query_string").field("default_field", key)
@@ -901,7 +926,7 @@ class ElasticsearchPlugin(application: Application) extends Plugin {
901926
}
902927

903928
// If a term is specified that isn't in this list, it's assumed to be a metadata field
904-
val official_terms = List("name", "creator", "email", "resource_type", "in", "contains", "tag", "exists", "missing")
929+
val official_terms = List("name", "creator", "created", "email", "resource_type", "in", "contains", "tag", "exists", "missing")
905930

906931
// Create list of (key, operator, value) for passing to builder
907932
val terms = ListBuffer[(String, String, String)]()
@@ -932,6 +957,9 @@ class ElasticsearchPlugin(application: Application) extends Plugin {
932957
else if (mt == "in") currkey = "child_of"
933958
else if (mt == "contains") currkey = "parent_of"
934959
else if (mt == "creator") currkey = "creator_name"
960+
else if (mt == "created") {
961+
currkey = "created"
962+
}
935963
else if (mt == "email") currkey = "creator_email"
936964
else if (!official_terms.contains(mt)) currkey = "metadata."+mt
937965
else

app/views/searchResults.scala.html

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ <h1>Search</h1>
5959
<tr><td>name</td>
6060
<td>name:VIS_SV_180_z1_1207272.png</td>
6161
<td>@Messages("help.search.name", Messages("dataset.title").toLowerCase, Messages("collection.title").toLowerCase)</td></tr>
62+
<tr><td>created</td>
63+
<td>created:2021-04-19</td>
64+
<td>@Messages("help.search.created")</td></tr>
6265
<tr><td>creator</td>
6366
<td>creator:Smith</td>
6467
<td>@Messages("help.search.creator")</td></tr>

conf/messages

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ help.search.allfields=name, description, creator name, and tag
7575
help.search.regex1=get anything with "trees" or "streetcars" in basic fields
7676
help.search.name=searches file, {0} or {1} names
7777
help.search.creator=creator name
78+
help.search.created=date of upload/creation
7879
help.search.email=creator email address
7980
help.search.resource_type=can be file, {0} or {1}
8081
help.search.tag=filter search results by specific tags

0 commit comments

Comments
 (0)