Revision 44663
Added by Katerina Iatropoulou over 7 years ago
SearchApiService.java | ||
---|---|---|
4 | 4 |
import eu.dnetlib.data.search.app.SearchServiceImpl; |
5 | 5 |
import eu.dnetlib.data.search.web.utils.RequestResponseHandler; |
6 | 6 |
import eu.dnetlib.domain.data.SearchResult; |
7 |
import eu.dnetlib.functionality.index.cql.CqlTranslator; |
|
8 |
import eu.dnetlib.functionality.index.cql.CqlTranslatorImpl; |
|
9 | 7 |
import org.apache.log4j.Logger; |
10 | 8 |
import org.springframework.beans.factory.annotation.Autowired; |
11 | 9 |
import org.springframework.stereotype.Component; |
12 |
import org.z3950.zing.cql.CQLParseException; |
|
13 | 10 |
|
14 | 11 |
import javax.servlet.http.HttpServletRequest; |
15 | 12 |
import javax.ws.rs.*; |
16 | 13 |
import javax.ws.rs.core.Context; |
17 | 14 |
import javax.ws.rs.core.MediaType; |
18 | 15 |
import javax.ws.rs.core.Response; |
19 |
import java.io.IOException; |
|
20 | 16 |
import java.util.List; |
21 | 17 |
import java.util.Locale; |
22 | 18 |
|
... | ... | |
74 | 70 |
@QueryParam("format") final String format, |
75 | 71 |
@Context final HttpServletRequest request) { |
76 | 72 |
String responseType = extractResponseFormat(format); |
77 |
String simpleQuery = createSimpleSearchQuery(RequestResponseHandler.Entity.PUBLICATION, keywords);
|
|
73 |
String simpleQuery = buildSimpleSearchQuery(RequestResponseHandler.Entity.PUBLICATION, keywords);
|
|
78 | 74 |
return getResponseByEntity(simpleQuery, RequestResponseHandler.Entity.PUBLICATION, offset, limit, responseType, request, refine, fields, fieldQueries, responseType); |
79 | 75 |
|
80 | 76 |
} |
81 | 77 |
|
82 |
private String createSimpleSearchQuery(RequestResponseHandler.Entity entity, String keywords) {
|
|
78 |
private String buildSimpleSearchQuery(RequestResponseHandler.Entity entity, String keywords) {
|
|
83 | 79 |
StringBuilder queryBuilder = new StringBuilder(); |
84 | 80 |
enhanceQueryWithEntityType(queryBuilder,entity); |
85 | 81 |
enhanceQueryWithKeywords(queryBuilder, keywords); |
... | ... | |
147 | 143 |
} |
148 | 144 |
return fq.toString(); |
149 | 145 |
} |
150 |
|
|
146 |
*/ |
|
151 | 147 |
@GET |
152 | 148 |
@Path("/api/publications/count") |
153 | 149 |
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) |
... | ... | |
155 | 151 |
String fullQuery = builtQueryByEntity(query, RequestResponseHandler.Entity.PUBLICATION); |
156 | 152 |
return getCount(fullQuery); |
157 | 153 |
} |
158 |
*/ |
|
159 | 154 |
|
155 |
|
|
160 | 156 |
@GET |
161 | 157 |
@Path("/api/publications/{publicationid}") |
162 | 158 |
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) |
... | ... | |
486 | 482 |
*/ |
487 | 483 |
|
488 | 484 |
private void enhanceQueryWithKeywords(StringBuilder queryBuilder, String keywords) { |
489 |
if (keywords != null && !keywords.trim().isEmpty()) { |
|
490 |
queryBuilder.append(" and (").append(keywords).append(")"); |
|
491 |
} |
|
485 |
CQLQueryGeneration.appendKeywords(queryBuilder,keywords); |
|
492 | 486 |
} |
493 | 487 |
|
494 |
//@Deprecated |
|
495 |
/*private void enhanceQueryWithKeywords(StringBuilder queryBuilder, List<String> keywordOperators, List<String> keywords) { |
|
496 |
if (keywordOperators != null && !keywordOperators.isEmpty()) { |
|
497 |
if (keywords != null && !keywords.isEmpty()) { |
|
498 |
if (keywordOperators.size() != keywords.size()) { |
|
499 |
throw new IllegalArgumentException("Keywords and Operators are not matched"); |
|
500 |
} |
|
501 |
} else { |
|
502 |
throw new IllegalArgumentException("Keywords and Operators are not matched"); |
|
503 |
} |
|
504 |
} |
|
505 |
|
|
506 |
for(int i = 0; i < keywords.size(); i++) { |
|
507 |
queryBuilder.append(' ').append(keywordOperators.get(i)).append(' ').append('(').append(keywords.get(i)).append(")"); |
|
508 |
} |
|
509 |
}*/ |
|
510 |
|
|
511 |
/* |
|
512 |
private void enhanceQueryWithParameters(StringBuilder queryBuilder, Map<String, String[]> operators, Map<String, String[]> parameters, Map<String, String> parameterIndexMap, Map<String, String> parameterOperatorMap) { |
|
513 |
if (parameterIndexMap != null && !parameterIndexMap.isEmpty()) { |
|
514 |
if (parameterOperatorMap != null && !parameterOperatorMap.isEmpty()) { |
|
515 |
for(String operatorType:operators.keySet()) { |
|
516 |
//enhance messages with >, < ?? or maybe move all checks in the beginning? |
|
517 |
if (operators.get(operatorType).length != parameters.get(parameterOperatorMap.get(operatorType)).length ) { |
|
518 |
throw new IllegalArgumentException("Parameters and Operators are not matched"); |
|
519 |
} |
|
520 |
|
|
521 |
String parameterName = parameterOperatorMap.get(operatorType); |
|
522 |
|
|
523 |
for(int i = 0; i < operators.get(operatorType).length; i++) { |
|
524 |
String indexField = parameterIndexMap.get(parameterOperatorMap.get(operatorType)); |
|
525 |
|
|
526 |
/*logger.debug("operator " + operatorType); |
|
527 |
logger.debug("operator map get" + parameterOperatorMap.get(operatorType)); |
|
528 |
|
|
529 |
logger.debug("index map" + parameterIndexMap.keySet()); |
|
530 |
logger.debug("index map values" + parameterIndexMap.values()); |
|
531 |
|
|
532 |
logger.debug("index field " + indexField);*/ |
|
533 |
/* |
|
534 |
if (indexField != null) { |
|
535 |
// logger.debug(indexField + " " + operators.get(operatorType)[i] + " " + parameters.get(parameterName)[i]); |
|
536 |
queryBuilder.append(' ').append(operators.get(operatorType)[i]).append('(').append(indexField).append(" = ").append(parameters.get(parameterName)[i]).append(")"); |
|
537 |
|
|
538 |
} else { //TODO check if needed |
|
539 |
logger.debug("and here!"); |
|
540 |
logger.debug(" " + operators.get(operatorType)[i] + " " + parameters.get(operatorType)[i]); |
|
541 |
queryBuilder.append(" " + operators.get(operatorType)[i] + " " + parameters.get(operatorType)[i]); |
|
542 |
} |
|
543 |
} |
|
544 |
} |
|
545 |
} else { |
|
546 |
throw new IllegalArgumentException("Keywords and Operators are not matched"); |
|
547 |
} |
|
548 |
|
|
549 |
} |
|
550 |
} |
|
551 |
*/ |
|
552 |
/* |
|
553 |
private boolean isFirstTerm(StringBuilder queryBuilder) { |
|
554 |
return queryBuilder.toString().trim().equals(""); |
|
555 |
}*/ |
|
556 |
|
|
557 |
public void builtEntityIdQuery(StringBuilder queryBuilder, RequestResponseHandler.Entity entity, String entityId){ |
|
488 |
private void builtEntityIdQuery(StringBuilder queryBuilder, RequestResponseHandler.Entity entity, String entityId){ |
|
558 | 489 |
enhanceQueryWithEntityType(queryBuilder, entity); |
559 | 490 |
enhanceQueryWithEntityId(queryBuilder, entityId); |
560 | 491 |
} |
561 | 492 |
|
562 |
public String builtEntity2EntityRelationQuery(RequestResponseHandler.Entity entity, String relationfield, String entityId){
|
|
493 |
private String builtEntity2EntityRelationQuery(RequestResponseHandler.Entity entity, String relationfield, String entityId){
|
|
563 | 494 |
StringBuilder queryBuilder = new StringBuilder(); |
564 | 495 |
enhanceQueryWithEntityType(queryBuilder, entity); |
565 |
enhanceQueryWithEntity2EntityId(queryBuilder, relationfield, entityId);
|
|
496 |
enhanceQueryWithRelationId(queryBuilder, relationfield, entityId);
|
|
566 | 497 |
return queryBuilder.toString(); |
567 | 498 |
} |
568 | 499 |
|
569 |
private void enhanceQueryWithEntity2EntityId(StringBuilder queryBuilder, String relationfield, String entityId) {
|
|
500 |
private void enhanceQueryWithRelationId(StringBuilder queryBuilder, String relationfield, String entityId) {
|
|
570 | 501 |
CQLQueryGeneration.appendTerm(queryBuilder, CQLQueryGeneration.Operator.AND, " " + relationfield + " ", CQLQueryGeneration.Operator.EXACT, entityId); |
571 | 502 |
} |
572 | 503 |
|
573 | 504 |
|
574 |
public void enhanceQueryWithEntityType(StringBuilder queryBuilder, RequestResponseHandler.Entity entity) {
|
|
505 |
private void enhanceQueryWithEntityType(StringBuilder queryBuilder, RequestResponseHandler.Entity entity) {
|
|
575 | 506 |
queryBuilder.append(entity.getQueryPrefix()); |
576 | 507 |
} |
577 | 508 |
|
578 |
public void enhanceQueryWithEntityId(StringBuilder queryBuilder, String entityId) {
|
|
509 |
private void enhanceQueryWithEntityId(StringBuilder queryBuilder, String entityId) {
|
|
579 | 510 |
CQLQueryGeneration.appendTerm(queryBuilder, CQLQueryGeneration.Operator.AND, "objidentifier", CQLQueryGeneration.Operator.EXACT, entityId); |
580 | 511 |
} |
581 | 512 |
|
582 |
public String builtQueryByEntity(String query, RequestResponseHandler.Entity entity) {
|
|
513 |
private String builtQueryByEntity(String query, RequestResponseHandler.Entity entity) {
|
|
583 | 514 |
StringBuilder queryBuilder = new StringBuilder(); |
584 |
queryBuilder.append(entity.getQueryPrefix());
|
|
515 |
enhanceQueryWithEntityType(queryBuilder, entity);
|
|
585 | 516 |
|
586 | 517 |
if (query != null && !query.trim().isEmpty()) { |
587 | 518 |
CQLQueryGeneration.appendSimpleTerm(queryBuilder, CQLQueryGeneration.Operator.AND, "(" + query + ")"); |
... | ... | |
589 | 520 |
|
590 | 521 |
return queryBuilder.toString(); |
591 | 522 |
} |
592 |
/* |
|
593 |
public void extractParameterNOperatorsValues(Map<String, String[]> parameterMap, Map<String, String[]> operatorTypeValues, Map<String, String[]> parameterTypeValues, RequestResponseHandler.Entity entity) { |
|
594 |
for (String parameter:parameterMap.keySet()) { |
|
595 |
Map<String, String> parameterIndexMap = entity.getParameterIndexMap(); |
|
596 |
Map<String, String> parameterOperatorMap = entity.getParameterOperatorMap(); |
|
597 | 523 |
|
598 |
if (parameterOperatorMap.get(parameter) != null) { |
|
599 |
operatorTypeValues.put(parameter, parameterMap.get(parameter)); |
|
600 |
|
|
601 |
} else if (parameterIndexMap.get(parameter) != null) { |
|
602 |
parameterTypeValues.put(parameter, parameterMap.get(parameter)); |
|
603 |
|
|
604 |
} else if (!parameter.equals("q") && !parameter.equals("op") && !parameter.equals("size") && !parameter.equals("page") && !parameter.equals("fields") && !parameter.equals("refine")){ |
|
605 |
throw new IllegalArgumentException("The parameter " + parameter + " is not supported."); |
|
606 |
} |
|
607 |
|
|
608 |
if (parameterTypeValues.get(parameter) == null) { |
|
609 |
logger.debug("parameterTypeValues is null"); |
|
610 |
} else { |
|
611 |
logger.debug("parameterTypeValues " + Arrays.asList(parameterTypeValues.get(parameter))); |
|
612 |
} |
|
613 |
|
|
614 |
} |
|
615 |
|
|
616 |
//TODO make checks per type???? |
|
617 |
if (operatorTypeValues.size() != parameterTypeValues.size()) { |
|
618 |
throw new IllegalArgumentException("Parameters and Operators do not match."); |
|
619 |
} |
|
620 |
} |
|
621 |
/* |
|
622 |
*//* For each parameter get the values and the operators *//* |
|
623 |
public void extractParameterOperatorsNValues(Map<String, String[]> requestParameterMap, Map<String, String[]> keywordOperatorValueMap, Map<String, String[]> keywordValuesMap, |
|
624 |
Map<String, String[]> operatorValueMap, Map<String, String[]> parameterValuesMap, RequestResponseHandler.Entity entity) { |
|
625 |
|
|
626 |
for (String parameter:requestParameterMap.keySet()) { |
|
627 |
Map<String, String> parameterIndexMap = entity.getParameterIndexMap(); |
|
628 |
Map<String, String> parameterOperatoMap = entity.getParameterOperatorMap(); |
|
629 |
|
|
630 |
if (parameterOperatoMap.get(parameter) != null) { |
|
631 |
operatorValueMap.put(parameter, requestParameterMap.get(parameter)); |
|
632 |
|
|
633 |
} else if (parameterIndexMap.get(parameter) != null) { |
|
634 |
parameterValuesMap.put(parameter, requestParameterMap.get(parameter)); |
|
635 |
|
|
636 |
} else if (parameter.equals("q")) { |
|
637 |
keywordValuesMap.put("q", requestParameterMap.get("q")); |
|
638 |
|
|
639 |
} else if (parameter.equals("op")) { |
|
640 |
keywordOperatorValueMap.put("op", requestParameterMap.get("op")); |
|
641 |
|
|
642 |
} else if (!parameter.equals("size") && !parameter.equals("page") && !parameter.equals("fields") && !parameter.equals("refine")){ |
|
643 |
throw new IllegalArgumentException("The parameter " + parameter + " is not supported."); |
|
644 |
} |
|
645 |
|
|
646 |
if (parameterValuesMap.get(parameter) == null) { |
|
647 |
logger.debug("parameterTypeValues is null"); |
|
648 |
} else { |
|
649 |
logger.debug("parameterTypeValues " + Arrays.asList(parameterValuesMap.get(parameter))); |
|
650 |
} |
|
651 |
} |
|
652 |
|
|
653 |
if ((operatorValueMap.size() != parameterValuesMap.size()) || (keywordOperatorValueMap.size() != keywordValuesMap.size())) { |
|
654 |
throw new IllegalArgumentException("Operators do not match parameters."); |
|
655 |
} |
|
656 |
}*/ |
|
657 |
|
|
658 | 524 |
private Response getCount(String query) { |
659 | 525 |
try { |
660 | 526 |
SearchResult searchResult = searchService.search(query, null, Locale.getDefault().toString(), 0, 0); |
... | ... | |
665 | 531 |
} |
666 | 532 |
} |
667 | 533 |
|
668 |
/* TODO remove? |
|
669 |
private Response getCountByEntity2EntityRelation(String query, RequestResponseHandler.Entity entity, String relationfield, String entityId) { |
|
670 |
String fullQuery = builtEntity2EntityRelationQuery(entity, relationfield, entityId); |
|
671 |
|
|
672 |
try { |
|
673 |
SearchResult searchResult = searchService.search(fullQuery, null, Locale.getDefault().toString(), 0, 0); |
|
674 |
return Response.status(Response.Status.OK).entity(ResponseFormatter.createCountMeta(fullQuery.replace("\"", "\\\""), searchResult.getTotal())).build(); |
|
675 |
|
|
676 |
} catch (SearchServiceException sse) { |
|
677 |
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(ResponseFormatter.compose500Message("Fail to fetch count for query " + fullQuery.replace("\"", "\\\"") + ".", sse.getMessage())).build(); |
|
678 |
} |
|
679 |
} */ |
|
680 |
|
|
681 | 534 |
private Response getResponseByEntityId(HttpServletRequest request, RequestResponseHandler.Entity entity, String entityId, String responseType) { |
682 | 535 |
try { |
683 | 536 |
StringBuilder queryBuilder = new StringBuilder(); |
... | ... | |
712 | 565 |
} |
713 | 566 |
} |
714 | 567 |
|
715 |
private void formatRefineResults(StringBuilder refineBuilder, SearchResult refineResults) { |
|
716 |
int i = 0; |
|
717 |
for (String json: refineResults.getBrowseResults()) { |
|
718 |
if (i == (refineResults.getBrowseResults().size() - 1)) { |
|
719 |
refineBuilder.append(json); |
|
720 |
} else { |
|
721 |
refineBuilder.append(json).append(","); |
|
722 |
} |
|
723 |
i++; |
|
568 |
|
|
569 |
/* TODO remove? |
|
570 |
private Response getCountByEntity2EntityRelation(String query, RequestResponseHandler.Entity entity, String relationfield, String entityId) { |
|
571 |
String fullQuery = builtEntity2EntityRelationQuery(entity, relationfield, entityId); |
|
572 |
|
|
573 |
try { |
|
574 |
SearchResult searchResult = searchService.search(fullQuery, null, Locale.getDefault().toString(), 0, 0); |
|
575 |
return Response.status(Response.Status.OK).entity(ResponseFormatter.createCountMeta(fullQuery.replace("\"", "\\\""), searchResult.getTotal())).build(); |
|
576 |
|
|
577 |
} catch (SearchServiceException sse) { |
|
578 |
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(ResponseFormatter.compose500Message("Fail to fetch count for query " + fullQuery.replace("\"", "\\\"") + ".", sse.getMessage())).build(); |
|
724 | 579 |
} |
725 |
} |
|
580 |
} */
|
|
726 | 581 |
|
727 | 582 |
|
728 | 583 |
/* |
... | ... | |
797 | 652 |
|
798 | 653 |
} |
799 | 654 |
*/ |
655 |
/* |
|
800 | 656 |
|
801 | 657 |
public static void main(String[] args) throws IOException, CQLParseException { |
802 | 658 |
CqlTranslator translator = new CqlTranslatorImpl(); |
803 | 659 |
System.out.println(translator.toLucene("relfundinglevel0_id = ec__________::EC::FP7")); |
804 | 660 |
} |
661 |
*/ |
|
805 | 662 |
|
806 | 663 |
} |
Also available in: Unified diff
more code cleaning