Skip to content

Commit f0408a3

Browse files
committed
Changed query interface to accomodate for new parameters
1 parent cb1bb23 commit f0408a3

File tree

6 files changed

+34
-25
lines changed

6 files changed

+34
-25
lines changed

src/it/scala/de/upb/cs/swt/delphi/webapi/SearchQueryTest.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package de.upb.cs.swt.delphi.webapi
1818

1919
import de.upb.cs.swt.delphi.webapi.featuredefinitions.FeatureExtractor
20+
import de.upb.cs.swt.delphi.webapi.search.{QueryRequest, SearchQuery}
2021
import org.scalatest.{FlatSpec, Matchers}
2122

2223
import scala.util.Success
@@ -26,7 +27,7 @@ class SearchQueryTest extends FlatSpec with Matchers {
2627
val configuration = new Configuration()
2728
val q = new SearchQuery(configuration, new FeatureExtractor(configuration))
2829

29-
val response = q.search("[if_icmpeq (opcode:159)]>1")
30+
val response = q.search(QueryRequest("[if_icmpeq (opcode:159)]>1"))
3031
response shouldBe a [Success[_]]
3132
}
3233
}

src/main/scala/de/upb/cs/swt/delphi/webapi/RetrieveQuery.scala

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,12 @@
1616

1717
package de.upb.cs.swt.delphi.webapi
1818

19-
import com.sksamuel.elastic4s.http.{ElasticClient, RequestSuccess, Response}
2019
import com.sksamuel.elastic4s.http.ElasticDsl.{termQuery, _}
21-
import com.sksamuel.elastic4s.http.search.{SearchHit, SearchHits, SearchResponse}
20+
import com.sksamuel.elastic4s.http.search.SearchResponse
21+
import com.sksamuel.elastic4s.http.{ElasticClient, RequestSuccess, Response}
2222
import com.sksamuel.elastic4s.searches.queries.Query
2323
import com.sksamuel.elastic4s.searches.queries.term.TermQuery
24-
import de.upb.cs.swt.delphi.webapi.artifacts.{Artifact, ArtifactMetadata, ArtifactTransformer}
25-
import org.joda.time.DateTime
26-
import org.joda.time.format.{DateTimeFormatter, ISODateTimeFormat}
27-
import spray.json.{DefaultJsonProtocol, DeserializationException, JsString, JsValue, RootJsonFormat}
24+
import de.upb.cs.swt.delphi.webapi.artifacts.ArtifactTransformer
2825

2926
object RetrieveQuery {
3027
def retrieve(identifier: String)(implicit configuration: Configuration) = {

src/main/scala/de/upb/cs/swt/delphi/webapi/Server.scala

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,14 @@ import akka.http.scaladsl.model.{HttpResponse, StatusCodes}
2323
import akka.http.scaladsl.server.{HttpApp, Route}
2424
import akka.stream.ActorMaterializer
2525
import akka.util.Timeout
26-
import de.upb.cs.swt.delphi.webapi.featuredefinitions.{FeatureExtractor, FeatureListMapping}
2726
import de.upb.cs.swt.delphi.instancemanagement.InstanceRegistry
28-
import spray.json._
2927
import de.upb.cs.swt.delphi.webapi.artifacts.ArtifactJson._
28+
import de.upb.cs.swt.delphi.webapi.search.QueryRequestJson._
29+
import de.upb.cs.swt.delphi.webapi.featuredefinitions.FeatureExtractor
30+
import de.upb.cs.swt.delphi.webapi.search.{QueryRequest, SearchQuery}
31+
import spray.json._
3032

31-
import scala.concurrent.{ExecutionContext, Future}
33+
import scala.concurrent.ExecutionContext
3234
import scala.util.{Failure, Success}
3335

3436
/**
@@ -111,11 +113,10 @@ object Server extends HttpApp with JsonSupport with AppLogging {
111113
def search: Route = {
112114
post {
113115
parameter('pretty.?) { (pretty) =>
114-
entity(as[JsValue]) { input =>
115-
val query = input.asJsObject.fields("query").convertTo[String]
116-
log.info(s"Received search query: $query")
116+
entity(as[QueryRequest]) { input =>
117+
log.info(s"Received search query: ${input.query}")
117118
complete(
118-
new SearchQuery(configuration, featureExtractor).search(query) match {
119+
new SearchQuery(configuration, featureExtractor).search(input) match {
119120
case Success(result) => prettyPrint(pretty, result.toJson)
120121
case Failure(e) => e.getMessage
121122
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package de.upb.cs.swt.delphi.webapi.search
2+
3+
case class QueryRequest (query : String, limit : Option[Int] = Some(50))
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package de.upb.cs.swt.delphi.webapi.search
2+
3+
import spray.json.DefaultJsonProtocol
4+
5+
object QueryRequestJson extends DefaultJsonProtocol {
6+
implicit val queryRequestFormat = jsonFormat2(QueryRequest)
7+
}

src/main/scala/de/upb/cs/swt/delphi/webapi/search/SearchQuery.scala

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,30 +14,30 @@
1414
// See the License for the specific language governing permissions and
1515
// limitations under the License.
1616

17-
package de.upb.cs.swt.delphi.webapi
17+
package de.upb.cs.swt.delphi.webapi.search
1818

19-
import com.sksamuel.elastic4s.http.{ElasticClient, RequestSuccess}
20-
import de.upb.cs.swt.delphi.webapi.featuredefinitions.FeatureExtractor
21-
import de.upb.cs.swt.delphi.webapi.querylanguage._
2219
import com.sksamuel.elastic4s.http.ElasticDsl._
2320
import com.sksamuel.elastic4s.http.search.SearchHits
21+
import com.sksamuel.elastic4s.http.{ElasticClient, RequestSuccess}
2422
import com.sksamuel.elastic4s.searches.queries.{NoopQuery, Query}
23+
import de.upb.cs.swt.delphi.webapi.Configuration
2524
import de.upb.cs.swt.delphi.webapi.artifacts.ArtifactTransformer
25+
import de.upb.cs.swt.delphi.webapi.featuredefinitions.FeatureExtractor
26+
import de.upb.cs.swt.delphi.webapi.search.querylanguage._
2627

2728
import scala.util.{Failure, Success, Try}
2829

2930
class SearchQuery(configuration: Configuration, featureExtractor: FeatureExtractor) {
3031
private val client = ElasticClient(configuration.elasticsearchClientUri)
3132

32-
private def checkAndExecuteParsedQuery(ast: CombinatorialExpr): Try[SearchHits] = {
33+
private def checkAndExecuteParsedQuery(ast: CombinatorialExpr, limit : Int): Try[SearchHits] = {
3334
val fields = collectFieldNames(ast)
34-
if (fields.diff(featureExtractor.featureList.toSeq).size > 0) return Failure(null)
35+
if (fields.diff(featureExtractor.featureList.toSeq).size > 0) return Failure(new IllegalArgumentException("Unknown field name used."))
3536

3637
val query = searchWithType(configuration.esProjectIndex)
3738
.query(translate(ast))
3839
.sourceInclude(ArtifactTransformer.baseFields ++ fields.intersect(featureExtractor.featureList.toSeq).map(i => addPrefix(i)))
39-
40-
40+
.limit(limit)
4141

4242
val response = client.execute {
4343
query
@@ -110,12 +110,12 @@ class SearchQuery(configuration: Configuration, featureExtractor: FeatureExtract
110110
}
111111
}
112112

113-
def search(query: String) = {
114-
val parserResult = new Syntax(query).QueryRule.run()
113+
def search(query: QueryRequest) = {
114+
val parserResult = new Syntax(query.query).QueryRule.run()
115115
parserResult match {
116116
case Failure(e) => Failure(e)
117117
case Success(ast) => {
118-
checkAndExecuteParsedQuery(ast) match {
118+
checkAndExecuteParsedQuery(ast, query.limit.getOrElse(50)) match {
119119
case Failure(e) => Failure(e)
120120
case Success(hits) => Success(ArtifactTransformer.transformResults(hits))
121121
}

0 commit comments

Comments
 (0)