@@ -18,18 +18,18 @@ package de.upb.cs.swt.delphi.webapi.search
18
18
19
19
import com .sksamuel .elastic4s .http .ElasticDsl ._
20
20
import com .sksamuel .elastic4s .http .search .SearchHits
21
- import com .sksamuel .elastic4s .http .{ElasticClient , RequestSuccess }
21
+ import com .sksamuel .elastic4s .http .{ElasticClient , RequestFailure , RequestSuccess }
22
22
import com .sksamuel .elastic4s .searches .queries .{NoopQuery , Query }
23
- import de .upb .cs .swt .delphi .webapi .{Configuration , FeatureQuery }
24
- import de .upb .cs .swt .delphi .webapi .artifacts .ArtifactTransformer
23
+ import de .upb .cs .swt .delphi .webapi .artifacts .{Artifact , ArtifactTransformer }
25
24
import de .upb .cs .swt .delphi .webapi .search .querylanguage ._
25
+ import de .upb .cs .swt .delphi .webapi .{Configuration , FeatureQuery }
26
26
27
27
import scala .util .{Failure , Success , Try }
28
28
29
29
class SearchQuery (configuration : Configuration , featureExtractor : FeatureQuery ) {
30
30
private val client = ElasticClient (configuration.elasticsearchClientUri)
31
31
32
- private def checkAndExecuteParsedQuery (ast : CombinatorialExpr , limit : Int ): Try [SearchHits ] = {
32
+ private def checkAndExecuteParsedQuery (ast : CombinatorialExpr , limit : Int ): Try [SearchHits ] = {
33
33
val fields = collectFieldNames(ast)
34
34
if (fields.diff(featureExtractor.featureList.toSeq).size > 0 ) return Failure (new IllegalArgumentException (" Unknown field name used." ))
35
35
@@ -109,16 +109,42 @@ class SearchQuery(configuration: Configuration, featureExtractor: FeatureQuery)
109
109
}
110
110
}
111
111
112
- def search (query : QueryRequest ) = {
113
- val parserResult = new Syntax (query.query).QueryRule .run()
114
- parserResult match {
115
- case Failure (e) => Failure (e)
116
- case Success (ast) => {
117
- checkAndExecuteParsedQuery(ast, query.limit.getOrElse(50 )) match {
118
- case Failure (e) => Failure (e)
119
- case Success (hits) => Success (ArtifactTransformer .transformResults(hits))
112
+ def checkValidSize : Option [Int ] = {
113
+ import elastic4s .extns ._
114
+ import elastic4s .extns .ElasticDslExtn ._
115
+ val params = Map (" include_defaults" -> true )
116
+ val query = SettingsRequest (" delphi" , params)
117
+ val res = client.execute {
118
+ query
119
+ }.await
120
+ res match {
121
+ case RequestSuccess (_, b, _, _) => {
122
+ maxResultSize(b, configuration)
123
+ }
124
+ case RequestFailure (_, _, _, _) => {
125
+ None
126
+ }
127
+ }
128
+ }
129
+
130
+ def search (query : QueryRequest ): Try [Array [Artifact ]] = {
131
+ lazy val size = checkValidSize
132
+ val validSize = size.exists(query.limit.getOrElse(defaultFetchSize) <= _)
133
+ if (validSize) {
134
+ val parserResult = new Syntax (query.query).QueryRule .run()
135
+ parserResult match {
136
+ case Failure (e) => Failure (e)
137
+ case Success (ast) => {
138
+ checkAndExecuteParsedQuery(ast, query.limit.getOrElse(defaultFetchSize)) match {
139
+ case Failure (e) => Failure (e)
140
+ case Success (hits) => Success (ArtifactTransformer .transformResults(hits))
141
+ }
120
142
}
121
143
}
122
144
}
145
+ else {
146
+ val errorMsg = new SearchError (s " Query limit exceeded default limit: ${query.limit}> ${size}" )
147
+ Failure (errorMsg)
148
+ }
123
149
}
124
150
}
0 commit comments