Project

General

Profile

« Previous | Next » 

Revision 63331

json parser for portal apis + csv and html download

View differences:

modules/uoa-search/branches/uoa-search-json/pom.xml
22 22
            </snapshots>
23 23
            <id>cloudera-central</id>
24 24
            <name>cloundera-libs-release</name>
25
            <url>http://maven.research-infrastructures.eu/nexus/content/repositories/cloudera-central</url>
25
            <url>https://maven.research-infrastructures.eu/nexus/content/repositories/cloudera-central</url>
26 26
        </repository>
27 27
        <repository>
28 28
            <id>cloudera-snapshots</id>
29 29
            <name>cloudera-libs-snapshot</name>
30
            <url>http://maven.research-infrastructures.eu/nexus/content/repositories/cloudera-snapshots</url>
30
            <url>https://maven.research-infrastructures.eu/nexus/content/repositories/cloudera-snapshots</url>
31 31
        </repository>
32 32
        <repository>
33 33
            <id>typesafe</id>
34 34
            <name>typesafe-releases</name>
35
            <url>http://maven.research-infrastructures.eu/nexus/content/repositories/typesafe</url>
35
            <url>https://maven.research-infrastructures.eu/nexus/content/repositories/typesafe</url>
36 36
        </repository>
37
		<repository>
38
			<id>dnet45-releases</id>
39
			<name>D-Net 45 releases</name>
40
			<url>https://maven.d4science.org/nexus/content/repositories/dnet45-releases</url>
41
			<layout>default</layout>
42
			<snapshots>
43
				<enabled>false</enabled>
44
			</snapshots>
45
			<releases>
46
				<enabled>true</enabled>
47
			</releases>
48
		</repository>
49
		<repository>
50
			<id>dnet45-snapshots</id>
51
			<name>D-Net 45 snapshots</name>
52
			<url>https://maven.d4science.org/nexus/content/repositories/dnet45-snapshots</url>
53
			<layout>default</layout>
54
			<snapshots>
55
				<enabled>true</enabled>
56
			</snapshots>
57
			<releases>
58
				<enabled>false</enabled>
59
			</releases>
60
		</repository>
61
		<repository>
62
			<id>dnet45-bootstrap-snapshot</id>
63
			<name>D-Net 45 Bootstrap Snapshot</name>
64
			<url>https://maven.d4science.org/nexus/content/repositories/dnet45-bootstrap-snapshot/</url>
65
			<releases>
66
				<enabled>false</enabled>
67
			</releases>
68
			<snapshots>
69
				<enabled>true</enabled>
70
			</snapshots>
71
			<layout>default</layout>
72
		</repository>
73
		<repository>
74
			<id>dnet45-bootstrap-release</id>
75
			<name>D-Net 45 Bootstrap Release</name>
76
			<url>https://maven.d4science.org/nexus/content/repositories/dnet45-bootstrap-release/</url>
77
			<releases>
78
				<enabled>true</enabled>
79
			</releases>
80
			<snapshots>
81
				<enabled>false</enabled>
82
			</snapshots>
83
			<layout>default</layout>
84
		</repository>
37 85
    </repositories>
38 86

  
39 87
	<dependencies>
......
230 278
            <version>3.3.9</version>
231 279
        </dependency>
232 280

  
281
		<!-- CNR for entities -->
282
		<dependency>
283
			<groupId>eu.dnetlib.dhp</groupId>
284
			<artifactId>dhp-schemas</artifactId>
285
			<version>[6.1.1]</version>
286
		</dependency>
233 287

  
288
		<dependency>
289
			<groupId>eu.dnetlib.dhp</groupId>
290
			<artifactId>dhp-dump-schema</artifactId>
291
			<version>[8.0.0-SNAPSHOT]</version>
292
		</dependency>
234 293

  
294
		<dependency>
295
			<groupId>com.fasterxml.jackson.core</groupId>
296
			<artifactId>jackson-core</artifactId>
297
			<version>2.15.2</version>
298
		</dependency>
299
		<dependency>
300
			<groupId>com.fasterxml.jackson.core</groupId>
301
			<artifactId>jackson-databind</artifactId>
302
			<version>2.15.2</version>
303
		</dependency>
304
		<dependency>
305
			<groupId>com.fasterxml.jackson.core</groupId>
306
			<artifactId>jackson-annotations</artifactId>
307
			<version>2.15.2</version>
308
		</dependency>
309
		<dependency>
310
			<groupId>com.fasterxml.jackson.dataformat</groupId>
311
			<artifactId>jackson-dataformat-csv</artifactId>
312
			<version>2.15.2</version>
313
		</dependency>
314
		<dependency>
315
			<groupId>org.mapstruct</groupId>
316
			<artifactId>mapstruct</artifactId>
317
			<version>1.5.5.Final</version>
318
		</dependency>
319

  
320
		<dependency>
321
			<groupId>org.mapstruct</groupId>
322
			<artifactId>mapstruct</artifactId>
323
			<version>1.5.5.Final</version>
324
		</dependency>
325
		<dependency>
326
			<groupId>org.mapstruct</groupId>
327
			<artifactId>mapstruct-processor</artifactId>
328
			<version>1.5.5.Final</version>
329
			<scope>provided</scope>
330
		</dependency>
331

  
332
		<dependency>
333
			<groupId>com.fasterxml.jackson.core</groupId>
334
			<artifactId>jackson-core</artifactId>
335
			<version>2.15.2</version>
336
		</dependency>
337
		<dependency>
338
			<groupId>com.fasterxml.jackson.core</groupId>
339
			<artifactId>jackson-databind</artifactId>
340
			<version>2.15.2</version>
341
		</dependency>
342
		<dependency>
343
			<groupId>com.fasterxml.jackson.core</groupId>
344
			<artifactId>jackson-annotations</artifactId>
345
			<version>2.15.2</version>
346
		</dependency>
347
		<dependency>
348
			<groupId>com.fasterxml.jackson.dataformat</groupId>
349
			<artifactId>jackson-dataformat-csv</artifactId>
350
			<version>2.15.2</version>
351
		</dependency>
352

  
235 353
    </dependencies>
236 354

  
237 355
	<build>
modules/uoa-search/branches/uoa-search-json/src/main/java/eu/dnetlib/data/search/app/SearchServiceImpl.java
343 343
        return new SearchResult(query, Locale.getDefault().toString(), rs.size(), from, to, searchResults, browseResults, refinefields);
344 344
    }
345 345

  
346
    public SearchResult newJsonSearch (String text, String locale, List<String> refinefields, List<String> specialFacets, List<String> fieldQueries,
347
                                   int from, int to, String format, Transformer transformer, Transformer oldRefineTransformer,
348
                                   boolean oldPaging, boolean minRef, boolean timeout) throws SearchServiceException {
349
        long startTime = System.currentTimeMillis();
350
        Timer.Sample timer = Timer.start(registry);
351

  
352
        IndexService index = getIndexLocator().getService();
353

  
354
        EPR epr = null;
355
        ResultSet<String> rs = null;
356

  
357
        List<String> browseResults = null;
358
        List<String> searchResults = null;
359

  
360
        String query = rewrite(text);
361
        enhanceFieldQueries(fieldQueries);
362
        logger.info("Performing query '" + query + "' and fields " + fieldQueries + " and refine " + refinefields);
363

  
364
        try {
365
            //TODO see parser and maybe delete!
366
            //query = new CQLParser().parse(query).toCQL();
367
            String eprQuery = createEprQuery(query, refinefields, specialFacets, fieldQueries, minRef);
368
            //System.out.println("The eprQuery is now " + eprQuery);
369

  
370
            epr = index.getBrowsingStatistics(eprQuery, "all", mdFormat, indexLayout);
371

  
372
            if (epr == null){
373
                throw new SearchServiceException("Something really strange happened there! Index returned null result set id.");
374
            }
375

  
376
            //get the locale TODO do we need this?
377
            //String correctLocale = getCorrectLocale(locale);
378
            //StringTokenizer tokenizer = new StringTokenizer(correctLocale, "_");
379
            //Locale requestLocale = new Locale(tokenizer.nextToken(), tokenizer.nextToken());
380

  
381

  
382

  
383
            if (oldPaging) {
384
                rs = ((SolrResultSetFactory) rsFactory).createResultSetWithoutSocketTimeout(epr);
385
            } else {
386
                rs = ((SolrResultSetFactory)rsFactory).createResultSetWithSocketTimeout(epr);
387
            }
388

  
389
            if (rs == null ) {
390
                logger.info("Rs is null. Search will return an error.");
391
                logger.error("Received null result set.");
392
                throw new SearchServiceException("Error getting search results from index.");
393
            }
394

  
395
            Map<String, List<String>> list = null;
396
            if (oldPaging) { // for the public API calls
397
                list = ((SolrResultSet)rs).newJsonGet(from-1, to, format, transformer, oldRefineTransformer, false, timeoutValue);
398

  
399
            } else {
400
                list = ((SolrResultSet)rs).newJsonGet(from, to, format, transformer, oldRefineTransformer, true, timeoutValue);
401
            }
402

  
403
            searchResults = list.get("search");
404
            browseResults = list.get("refine");
405

  
406
        } catch (IndexServiceException ise) {
407
            logger.error("Error getting refine results.", ise);
408
            throw new SearchServiceException("Error getting refine results.", ise);
409

  
410
        } catch (CQLParseException e) {
411
            logger.error("CQL Parse Exception.");
412
            throw new SearchServiceException("Syntax errors. " + e.getMessage());
413

  
414
        } catch (IOException e) {
415
            throw new SearchServiceException("Error getting results. ", e);
416

  
417
        } finally {
418
            timer.stop(registry.timer("search.server.response.duration"));
419
        }
420

  
421
        long estimatedTime = System.currentTimeMillis() - startTime;
422

  
423
        logger.debug("Inner search time " + estimatedTime +  " milliseconds for query " + query +
424
                " and fields " + fieldQueries + " and refine " + refinefields + " from: "+ from + " and size " + to);
425

  
426
        rs.close();
427

  
428
        return new SearchResult(query, Locale.getDefault().toString(), rs.size(), from, to, searchResults, browseResults, refinefields);
429
    }
430

  
346 431
    public void cursorSearch(String text, List<String> refinefields, List<String> specialFacets, List<String> fieldQueries,
347
                             String format, Transformer transformer, OutputStream os, int limit) throws SearchServiceException {
432
                             String format, Transformer transformer, OutputStream os, boolean special, boolean hasTitle, boolean isHtml, int limit) throws SearchServiceException {
348 433

  
349 434
        long startTime = System.nanoTime();
350 435

  
......
375 460
                throw new SearchServiceException("Error getting search results from index.");
376 461
            }
377 462

  
378
            ((SolrResultSet)rs).cursorGet(transformer, limit, os);
463
            ((SolrResultSet)rs).cursorGet(transformer, special, hasTitle, isHtml, limit, os);
379 464

  
380 465
        } catch (IndexServiceException ise) {
381 466
            logger.error("Error getting cursor results.", ise);
......
546 631
            Map<String, List<String>> list = null;
547 632

  
548 633

  
634
            //TODO check this for Json
549 635
            if (oldPaging) {
550
                list = ((SolrResultSet)rs).newGet(from-1, to, format, transformer, oldRefineTransformer, timeout, timeoutValue);
636
                list = ((SolrResultSet)rs).newJsonGet(from-1, to, format, transformer, oldRefineTransformer, timeout, timeoutValue);
551 637

  
552 638
            } else {
553
                list = ((SolrResultSet)rs).newGet(from, to, format, transformer, oldRefineTransformer, timeout, timeoutValue);
639
                list = ((SolrResultSet)rs).newJsonGet(from, to, format, transformer, oldRefineTransformer, timeout, timeoutValue);
554 640
            }
555 641

  
556 642

  
modules/uoa-search/branches/uoa-search-json/src/main/java/eu/dnetlib/data/search/helpers/csv/CsvEntity.java
1
package eu.dnetlib.data.search.helpers.csv;
2

  
3
public interface CsvEntity {
4

  
5
}
modules/uoa-search/branches/uoa-search-json/src/main/java/eu/dnetlib/data/search/helpers/csv/DatasourceCsv.java
1
package eu.dnetlib.data.search.helpers.csv;
2

  
3
import com.fasterxml.jackson.annotation.JsonProperty;
4
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
5

  
6
import java.util.List;
7

  
8
@JsonPropertyOrder({ "name", "type", "compatibility", "oaipmh", "websiteUrl" })
9
public class DatasourceCsv implements CsvEntity {
10

  
11
    @JsonProperty("Νame")
12
    String name;
13
    @JsonProperty("Type")
14
    String type;
15
    @JsonProperty("Compatibility")
16
    String compatibility;
17
    @JsonProperty("OAI-PMH")
18
    List<String> oaipmh;
19
    @JsonProperty("Website")
20
    String websiteUrl;
21

  
22
    public String getName() {
23
        return name;
24
    }
25

  
26
    public void setName(String name) {
27
        this.name = name;
28
    }
29

  
30
    public String getType() {
31
        return type;
32
    }
33

  
34
    public void setType(String type) {
35
        this.type = type;
36
    }
37

  
38
    public String getCompatibility() {
39
        return compatibility;
40
    }
41

  
42
    public void setCompatibility(String compatibility) {
43
        this.compatibility = compatibility;
44
    }
45

  
46
    public List<String> getOaipmh() {
47
        return oaipmh;
48
    }
49

  
50
    public void setOaipmh(List<String> oaipmh) {
51
        this.oaipmh = oaipmh;
52
    }
53

  
54
    public String getWebsiteUrl() {
55
        return websiteUrl;
56
    }
57

  
58
    public void setWebsiteUrl(String websiteUrl) {
59
        this.websiteUrl = websiteUrl;
60
    }
61
}
modules/uoa-search/branches/uoa-search-json/src/main/java/eu/dnetlib/data/search/helpers/csv/OrganizationCsv.java
1
package eu.dnetlib.data.search.helpers.csv;
2

  
3
import com.fasterxml.jackson.annotation.JsonProperty;
4
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
5

  
6
@JsonPropertyOrder({ "name", "country"})
7
public class OrganizationCsv implements CsvEntity {
8

  
9
    @JsonProperty("Name")
10
    String name;
11
    @JsonProperty("Country")
12
    String country;
13

  
14
    @Override
15
    public String toString() {
16
        return "OrganizationCsv{" +
17
                "name='" + name + '\'' +
18
                ", country='" + country + '\'' +
19
                '}';
20
    }
21

  
22
    public String getName() {
23
        return name;
24
    }
25

  
26
    public void setName(String name) {
27
        this.name = name;
28
    }
29

  
30
    public String getCountry() {
31
        return country;
32
    }
33

  
34
    public void setCountry(String country) {
35
        this.country = country;
36
    }
37
}
modules/uoa-search/branches/uoa-search-json/src/main/java/eu/dnetlib/data/search/helpers/csv/ProjectCsv.java
1
package eu.dnetlib.data.search.helpers.csv;
2

  
3
import com.fasterxml.jackson.annotation.JsonProperty;
4
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
5

  
6
import java.util.List;
7

  
8
@JsonPropertyOrder({"title", "funder", "startDate", "endDate", "participants"})
9
public class ProjectCsv implements CsvEntity {
10
    //Title	Funder	Start Date	End Date	Participants
11
    @JsonProperty("Tilte")
12
    String title;
13
    @JsonProperty("Funder")
14
    String funder;
15
    @JsonProperty("Start date")
16
    String startDate;
17
    @JsonProperty("End date")
18
    String endDate;
19
    @JsonProperty("Participants")
20
    List<String> participants;
21

  
22
    public String getTitle() {
23
        return title;
24
    }
25

  
26
    public void setTitle(String title) {
27
        this.title = title;
28
    }
29

  
30
    public String getFunder() {
31
        return funder;
32
    }
33

  
34
    public void setFunder(String funder) {
35
        this.funder = funder;
36
    }
37

  
38
    public String getStartDate() {
39
        return startDate;
40
    }
41

  
42
    public void setStartDate(String startDate) {
43
        this.startDate = startDate;
44
    }
45

  
46
    public String getEndDate() {
47
        return endDate;
48
    }
49

  
50
    public void setEndDate(String endDate) {
51
        this.endDate = endDate;
52
    }
53

  
54
    public List<String> getParticipants() {
55
        return participants;
56
    }
57

  
58
    public void setParticipants(List<String> participants) {
59
        this.participants = participants;
60
    }
61

  
62
}
modules/uoa-search/branches/uoa-search-json/src/main/java/eu/dnetlib/data/search/helpers/csv/ResearchProductCsv.java
1
package eu.dnetlib.data.search.helpers.csv;
2

  
3
import com.fasterxml.jackson.annotation.JsonProperty;
4
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
5
import lombok.Data;
6

  
7
import java.util.List;
8

  
9
//Type	Title	Authors	Publication Year	DOI	Type	Peer Reviewed	Diamond Journal	Journal	Download from	Publicly Funded	Funder|Project Name (GA Number)	Access	Green	OA colour
10

  
11
@Data
12
@JsonPropertyOrder({"researchProduct", "title", "authors", "publicationYear", "doi", "type", "peerReviewed",
13
        "diamondJournal", "downloadFrom", "publiclyFunded", "funder_Project", "access", "green", "oaColour"})
14
public class ResearchProductCsv implements CsvEntity {
15

  
16
    @JsonProperty("Research Product Type")
17
    String researchProduct;
18
    @JsonProperty("Title")
19
    String title;
20
    @JsonProperty("Authors")
21
    List<String> authors;
22
    @JsonProperty("Publication Year")
23
    String publicationYear;
24
    @JsonProperty("DOI")
25
    List<String> doi;
26
    @JsonProperty("Type")
27
    String type;
28
    @JsonProperty("Peer Reviewed")
29
    String peerReviewed;
30
    @JsonProperty("Diamond Journal")
31
    boolean diamondJournal;
32
    @JsonProperty("Journal")
33
    String journal;
34
    @JsonProperty("Download From")
35
    String downloadFrom;
36
    @JsonProperty("Publicly Funded")
37
    boolean publiclyFunded;
38
    //TODO fix this
39
    @JsonProperty("Funder|Project Name (GA Number)")
40
    String funder_Project;
41
    @JsonProperty("Access")
42
    String access;
43
    @JsonProperty("Green")
44
    boolean green;
45
    @JsonProperty("OA colour")
46
    String oaColour;
47

  
48
    public String getResearchProduct() {
49
        return researchProduct;
50
    }
51

  
52
    public void setResearchProduct(String researchProduct) {
53
        this.researchProduct = researchProduct;
54
    }
55

  
56
    public String getTitle() {
57
        return title;
58
    }
59

  
60
    public void setTitle(String title) {
61
        this.title = title;
62
    }
63

  
64
    public List<String> getAuthors() {
65
        return authors;
66
    }
67

  
68
    public void setAuthors(List<String> authors) {
69
        this.authors = authors;
70
    }
71

  
72
    public String getPublicationYear() {
73
        return publicationYear;
74
    }
75

  
76
    public void setPublicationYear(String publicationYear) {
77
        this.publicationYear = publicationYear;
78
    }
79

  
80
    public List<String> getDoi() {
81
        return doi;
82
    }
83

  
84
    public void setDoi(List<String> doi) {
85
        this.doi = doi;
86
    }
87

  
88
    public String getType() {
89
        return type;
90
    }
91

  
92
    public void setType(String type) {
93
        this.type = type;
94
    }
95

  
96
    public String getPeerReviewed() {
97
        return peerReviewed;
98
    }
99

  
100
    public void setPeerReviewed(String peerReviewed) {
101
        this.peerReviewed = peerReviewed;
102
    }
103

  
104
    public boolean isDiamondJournal() {
105
        return diamondJournal;
106
    }
107

  
108
    public void setDiamondJournal(boolean diamondJournal) {
109
        this.diamondJournal = diamondJournal;
110
    }
111

  
112
    public String getJournal() {
113
        return journal;
114
    }
115

  
116
    public void setJournal(String journal) {
117
        this.journal = journal;
118
    }
119

  
120
    public String getDownloadFrom() {
121
        return downloadFrom;
122
    }
123

  
124
    public void setDownloadFrom(String downloadFrom) {
125
        this.downloadFrom = downloadFrom;
126
    }
127

  
128
    public boolean isPubliclyFunded() {
129
        return publiclyFunded;
130
    }
131

  
132
    public void setPubliclyFunded(boolean publiclyFunded) {
133
        this.publiclyFunded = publiclyFunded;
134
    }
135

  
136
    public String getFunder_Project() {
137
        return funder_Project;
138
    }
139

  
140
    public void setFunder_Project(String funder_Project) {
141
        this.funder_Project = funder_Project;
142
    }
143

  
144
    public String getAccess() {
145
        return access;
146
    }
147

  
148
    public void setAccess(String access) {
149
        this.access = access;
150
    }
151

  
152
    public boolean isGreen() {
153
        return green;
154
    }
155

  
156
    public void setGreen(boolean green) {
157
        this.green = green;
158
    }
159

  
160
    public String getOaColour() {
161
        return oaColour;
162
    }
163

  
164
    public void setOaColour(String oaColour) {
165
        this.oaColour = oaColour;
166
    }
167
}
modules/uoa-search/branches/uoa-search-json/src/main/java/eu/dnetlib/data/search/helpers/csv/ResearchProductCsvConverter.java
1
package eu.dnetlib.data.search.helpers.csv;
2

  
3
import eu.dnetlib.data.search.mappers.csv.ResearchProductCsvMapper;
4
import eu.dnetlib.dhp.schema.solr.RelatedRecord;
5
import eu.dnetlib.dhp.schema.solr.SolrRecord;
6
import org.springframework.beans.factory.annotation.Autowired;
7
import org.springframework.stereotype.Component;
8

  
9
import java.util.ArrayList;
10
import java.util.List;
11
import java.util.Optional;
12

  
13
@Component
14
public class ResearchProductCsvConverter {
15

  
16
    @Autowired
17
    ResearchProductCsvMapper researchProductCsvMapper;
18

  
19
    public List<ResearchProductCsv> flattenProjects(SolrRecord solrRecord) {
20
        List<ResearchProductCsv> flattenedList = new ArrayList<>();
21

  
22
        if (solrRecord.getLinks() != null) {
23
            boolean hasProducedRecord = false;
24

  
25
            for (RelatedRecord relatedRecord : solrRecord.getLinks()) {
26
                if (isProducedByRelation(relatedRecord)) {
27
                    ResearchProductCsv newProduct = mapToResearchProductWithFunder(solrRecord, relatedRecord);
28
                    flattenedList.add(newProduct);
29
                    hasProducedRecord = true;
30
                }
31
            }
32

  
33
            // If no "isProducedBy" records found, map the entire solrRecord
34
            if (!hasProducedRecord) {
35
                ResearchProductCsv defaultProduct = researchProductCsvMapper.toResearchProductCsv(solrRecord);
36
                flattenedList.add(defaultProduct);
37
            }
38
        }
39

  
40
        return flattenedList;
41
    }
42

  
43
    private boolean isProducedByRelation(RelatedRecord relatedRecord) {
44
        return relatedRecord.getHeader() != null
45
                && "isProducedBy".equalsIgnoreCase(relatedRecord.getHeader().getRelationClass());
46
    }
47

  
48
    private ResearchProductCsv mapToResearchProductWithFunder(SolrRecord solrRecord, RelatedRecord relatedRecord) {
49
        ResearchProductCsv newProduct = researchProductCsvMapper.toSimpleResearchProductCsv(solrRecord);
50

  
51
        String funderString = Optional.ofNullable(relatedRecord.getFunding())
52
                .map(funding -> Optional.ofNullable(funding.getFunder())
53
                        .map(funder -> Optional.ofNullable(funder.getShortname())
54
                                .orElse(funder.getName())
55
                        ).orElse("")
56
                ).orElse("");
57

  
58
        String projectString = Optional.ofNullable(relatedRecord.getAcronym())
59
                .orElseGet(() -> Optional.ofNullable(relatedRecord.getProjectTitle())
60
                        .orElse("Unknown"));
61

  
62
        String funderProject = funderString + "|" + projectString;
63

  
64
        String code = Optional.ofNullable(relatedRecord.getCode())
65
                .filter(c -> !"unidentified".equalsIgnoreCase(c))
66
                .map(c -> "(" + c + ")")
67
                .orElse("");
68

  
69
        newProduct.setFunder_Project(funderProject + code);
70

  
71
        return newProduct;
72
    }
73
}
modules/uoa-search/branches/uoa-search-json/src/main/java/eu/dnetlib/data/search/helpers/html/HtmlEntity.java
1
package eu.dnetlib.data.search.helpers.html;
2

  
3
public interface HtmlEntity {
4
}
modules/uoa-search/branches/uoa-search-json/src/main/java/eu/dnetlib/data/search/helpers/html/ResearchProductHtml.java
1
package eu.dnetlib.data.search.helpers.html;
2

  
3
import lombok.Data;
4

  
5
@Data
6
public class ResearchProductHtml implements HtmlEntity {
7
    String type;
8
    String title;
9
    String authors;
10
    String publicationYear;
11
    String doi;
12
    String permanentIdentifier;
13
    String publicationType;
14
    String journal;
15
    String projectName_gaNumber;
16
    String accessMode;
17
}
modules/uoa-search/branches/uoa-search-json/src/main/java/eu/dnetlib/data/search/mappers/csv/DatasourceCsvMapper.java
1
package eu.dnetlib.data.search.mappers.csv;
2

  
3
import eu.dnetlib.data.search.helpers.csv.DatasourceCsv;
4
import eu.dnetlib.dhp.schema.solr.SolrRecord;
5
import org.mapstruct.Mapper;
6
import org.mapstruct.Mapping;
7

  
8
@Mapper(componentModel = "spring")
9
public interface DatasourceCsvMapper {
10

  
11
    @Mapping(target="name", source = "datasource.officialname")
12
    @Mapping(target="type", source = "datasource.datasourcetype.label")
13
    @Mapping(target="compatibility", source = "datasource.openairecompatibility.label")
14
    @Mapping(target = "oaipmh", source = "datasource.accessinfopackage")
15
    @Mapping(target="websiteUrl", source="datasource.websiteurl")
16
    DatasourceCsv toDatasourceCsv(SolrRecord solrRecord);
17
}
modules/uoa-search/branches/uoa-search-json/src/main/java/eu/dnetlib/data/search/mappers/csv/OrganizationCsvMapper.java
1
package eu.dnetlib.data.search.mappers.csv;
2

  
3
import eu.dnetlib.data.search.helpers.csv.OrganizationCsv;
4
import eu.dnetlib.dhp.schema.solr.SolrRecord;
5
import org.mapstruct.Mapper;
6
import org.mapstruct.Mapping;
7

  
8
@Mapper(componentModel = "spring")
9
public interface OrganizationCsvMapper {
10

  
11
    @Mapping(target="name", source = "organization.legalname")
12
    @Mapping(target="country", source="organization.country.label")
13
    OrganizationCsv toOrganizationCsv(SolrRecord solrRecord);
14
}
modules/uoa-search/branches/uoa-search-json/src/main/java/eu/dnetlib/data/search/mappers/csv/ProjectCsvMapper.java
1
package eu.dnetlib.data.search.mappers.csv;
2

  
3
import eu.dnetlib.data.search.helpers.csv.ProjectCsv;
4
import eu.dnetlib.dhp.schema.solr.Funding;
5
import eu.dnetlib.dhp.schema.solr.Project;
6
import eu.dnetlib.dhp.schema.solr.RelatedRecord;
7
import eu.dnetlib.dhp.schema.solr.SolrRecord;
8
import org.mapstruct.Mapper;
9
import org.mapstruct.Mapping;
10

  
11
import java.util.List;
12
import java.util.Optional;
13
import java.util.stream.Collectors;
14
import java.util.stream.Stream;
15

  
16
@Mapper(componentModel = "spring")
17
public interface ProjectCsvMapper {
18

  
19
    @Mapping(target="title", source="project.title")
20
    @Mapping(target="funder", expression="java(extractFunder(solrRecord))")
21
    @Mapping(target="startDate", source="project.startdate")
22
    @Mapping(target="endDate", source="project.enddate")
23
    @Mapping(target="participants", expression="java(extractParticipants(solrRecord))")
24
    ProjectCsv toProjectCsv(SolrRecord solrRecord);
25

  
26
    default String extractFunder(SolrRecord solrRecord) {
27
        return Optional.ofNullable(solrRecord)
28
                .map(SolrRecord::getProject)
29
                .map(Project::getFunding)
30
                .map(Funding::getFunder)
31
                .map(funder ->{
32
                    String funderName = Optional.ofNullable(funder.getName()).orElse("");
33
                    String funderShortName = Optional.ofNullable(funder.getShortname()).orElse("");
34

  
35
                    return funderShortName.isEmpty()
36
                            ? funderName
37
                            : funderName + " (" + funderShortName + ")";
38
                }).orElse("");
39
    }
40

  
41
    default List<String> extractParticipants(SolrRecord solrRecord) {
42
        return Optional.ofNullable(solrRecord.getLinks())
43
                .map(List::stream)
44
                .orElseGet(Stream::empty)
45
                .filter(relatedRecord -> "hasParticipant".equals(relatedRecord.getHeader().getRelationClass()))
46
                .map(RelatedRecord::getLegalname)
47
                .filter(legalName -> legalName != null)
48
                .collect(Collectors.toList());
49
    }
50
}
modules/uoa-search/branches/uoa-search-json/src/main/java/eu/dnetlib/data/search/mappers/csv/ResearchProductCsvMapper.java
1
package eu.dnetlib.data.search.mappers.csv;
2

  
3
import eu.dnetlib.data.search.helpers.csv.ResearchProductCsv;
4
import eu.dnetlib.dhp.schema.solr.Author;
5
import eu.dnetlib.dhp.schema.solr.Pid;
6
import eu.dnetlib.dhp.schema.solr.SolrRecord;
7
import org.mapstruct.Mapper;
8
import org.mapstruct.Mapping;
9

  
10
import java.util.Collection;
11
import java.util.List;
12
import java.util.Objects;
13
import java.util.Optional;
14
import java.util.stream.Collectors;
15
import java.util.stream.Stream;
16

  
17
@Mapper(componentModel = "spring")
18
public interface ResearchProductCsvMapper {
19

  
20
    @Mapping(target="researchProduct", source = "result.resulttype")
21
    @Mapping(target="title", source="result.maintitle")
22
    @Mapping(target="authors", expression = "java(extractAuthor(solrRecord))")
23
    @Mapping(target = "publicationYear", source = "result.publicationdate")
24
    @Mapping(target = "doi", expression = "java(extractDoi(solrRecord))")
25
    @Mapping(target = "type", source = "result.resulttype")
26
    @Mapping(target = "peerReviewed", expression = "java(extractPeerReviewed(solrRecord))")
27
    @Mapping(target = "diamondJournal", source = "result.inDiamondJournal")
28
    @Mapping(target = "journal", source = "result.journal.name")
29
    @Mapping(target = "downloadFrom", expression = "java(extractDownloadFrom(solrRecord))")
30
    @Mapping(target = "publiclyFunded", source = "result.publiclyFunded")
31
    @Mapping(target = "funder_Project", expression = "java(extractFunder(solrRecord))")
32
    @Mapping(target = "access", source = "result.bestaccessright.label")
33
    @Mapping(target = "green", source = "result.green")
34
    @Mapping(target = "oaColour", source = "result.openAccessColor")
35
    ResearchProductCsv toResearchProductCsv(SolrRecord solrRecord);
36

  
37
    @Mapping(target="researchProduct", source = "result.resulttype")
38
    @Mapping(target="title", source="result.maintitle")
39
    @Mapping(target="authors", expression = "java(extractAuthor(solrRecord))")
40
    @Mapping(target = "publicationYear", source = "result.publicationdate")
41
    @Mapping(target = "doi", expression = "java(extractDoi(solrRecord))")
42
    @Mapping(target = "type", source = "result.resulttype")
43
    @Mapping(target = "peerReviewed", expression = "java(extractPeerReviewed(solrRecord))")
44
    @Mapping(target = "diamondJournal", source = "result.inDiamondJournal")
45
    @Mapping(target = "journal", source = "result.journal.name")
46
    @Mapping(target = "downloadFrom", expression = "java(extractDownloadFrom(solrRecord))")
47
    @Mapping(target = "publiclyFunded", source = "result.publiclyFunded")
48
    @Mapping(target = "access", source = "result.bestaccessright.label")
49
    @Mapping(target = "green", source = "result.green")
50
    @Mapping(target = "oaColour", source = "result.openAccessColor")
51
    ResearchProductCsv toSimpleResearchProductCsv(SolrRecord solrRecord);
52

  
53
    default List<String> extractAuthor(SolrRecord solrRecord) {
54
        return Optional.ofNullable(solrRecord.getResult().getAuthor())
55
                .map(Collection::stream)
56
                .orElseGet(Stream::empty)
57
                .map(Author::getFullname)
58
                .filter(Objects::nonNull)
59
                .collect(Collectors.toList());
60
    }
61

  
62
    default String extractFunder(SolrRecord solrRecord) {
63
        return Optional.ofNullable(solrRecord.getLinks())
64
                .map(List::stream)
65
                .orElseGet(Stream::empty)
66
                .filter(relatedRecord -> "isProducedBy".equalsIgnoreCase(relatedRecord.getHeader().getRelationClass()))
67
                .map(relatedRecord -> {
68
                    //System.out.println("Funded!!!!!!!");
69
                    String funderString = Optional.ofNullable(relatedRecord.getFunding())
70
                            .map(funding -> Optional.ofNullable(funding.getFunder())
71
                                    .map(funder -> Optional.ofNullable(funder.getShortname())
72
                                            .orElse(funder.getName())
73
                                    ).orElse("")
74
                            ).orElse("");
75

  
76
                    String projectString = Optional.ofNullable(relatedRecord.getAcronym())
77
                            .orElseGet(() -> Optional.ofNullable(relatedRecord.getProjectTitle())
78
                                    .orElse("Unknown"));
79

  
80
                    funderString += "|" + projectString;
81

  
82
                    String code = Optional.ofNullable(relatedRecord.getCode())
83
                            .map(c -> "(" + c + ")")
84
                            .orElse("");
85

  
86
                    return funderString + code;
87
                })
88
                .collect(Collectors.joining(";"));
89
    }
90

  
91
    default List<String> extractDoi(SolrRecord solrRecord) {
92
        return Optional.ofNullable(solrRecord.getPid())
93
                .map(List::stream)
94
                .orElseGet(Stream::empty)
95
                .filter(pid -> "doi".equalsIgnoreCase(pid.getType()))
96
                .map(Pid::getValue)
97
                .collect(Collectors.toList());
98
    }
99

  
100
    default String extractPeerReviewed(SolrRecord solrRecord){
101
        return Optional.ofNullable(solrRecord.getResult().getInstance())
102
                .map(List::stream)
103
                .orElseGet(Stream::empty)
104
                .filter(instance -> "peerReviewed".equalsIgnoreCase(instance.getRefereed()))
105
                .findFirst()
106
                .map(instance -> "yes")
107
                .orElse("no");
108
    }
109

  
110
    default String extractDownloadFrom(SolrRecord solrRecord) {
111
        return Optional.ofNullable(solrRecord.getResult().getInstance())
112
                .map(List::stream) // Convert the instance list to a stream if it's not null
113
                .orElseGet(Stream::empty) // Provide an empty stream if the instance is null
114
                .filter(instance -> "OPEN".equalsIgnoreCase(instance.getAccessright().getValue())) // Filter for "OPEN"
115
                .findFirst() // Find the first matching instance
116
                .map(instance ->
117
                        Optional.ofNullable(instance.getUrl()) // Get the list of URLs
118
                                .filter(urls -> !urls.isEmpty()) // Ensure the list is not empty
119
                                .map(urls -> urls.get(0)) // Get the first URL from the list
120
                                .orElse("")) // Return empty string if the list is empty
121
                .orElseGet(() -> {
122
                    // Handle case if the first part didn't find a matching instance
123
                    return Optional.ofNullable(solrRecord.getResult().getInstance())
124
                            .map(List::stream) // Convert the instance list to a stream if it's not null
125
                            .orElseGet(Stream::empty) // Provide an empty stream if the instance is null
126
                            .findFirst() // Find the first instance
127
                            .map(instance ->
128
                                    Optional.ofNullable(instance.getUrl()) // Get the list of URLs
129
                                            .filter(urls -> !urls.isEmpty()) // Ensure the list is not empty
130
                                            .map(urls -> urls.get(0)) // Get the first URL from the list
131
                                            .orElse("")) // Return empty string if the list is empty
132
                            .orElse(""); // Return empty string if no instance is found
133
                });
134
    }
135
}
modules/uoa-search/branches/uoa-search-json/src/main/java/eu/dnetlib/data/search/mappers/html/ResearchProductsHtmlMapper.java
1
package eu.dnetlib.data.search.mappers.html;
2

  
3
import eu.dnetlib.data.search.helpers.html.ResearchProductHtml;
4
import eu.dnetlib.dhp.schema.solr.Author;
5
import eu.dnetlib.dhp.schema.solr.Pid;
6
import eu.dnetlib.dhp.schema.solr.SolrRecord;
7
import org.mapstruct.Mapper;
8
import org.mapstruct.Mapping;
9

  
10
import java.util.Collection;
11
import java.util.List;
12
import java.util.Objects;
13
import java.util.Optional;
14
import java.util.stream.Collectors;
15
import java.util.stream.Stream;
16

  
17
@Mapper(componentModel = "spring")
18
public interface ResearchProductsHtmlMapper {
19
    @Mapping(target = "type", source = "result.resulttype")
20
    @Mapping(target = "title", source = "result.maintitle")
21
    @Mapping(target = "authors", expression = "java(extractAuthor(solrRecord))")
22
    @Mapping(target = "publicationYear", source = "result.publicationdate")
23
    @Mapping(target = "doi", expression = "java(extractDoi(solrRecord))")
24
    @Mapping(target = "permanentIdentifier", expression = "java(extractPermanentIdentifier(solrRecord))")
25
    @Mapping(target = "publicationType", expression = "java(exctractPublicationType(solrRecord))")
26
    @Mapping(target = "journal", source = "result.journal.name")
27
    @Mapping(target = "projectName_gaNumber", expression = "java(extractFunder(solrRecord))")
28
    @Mapping(target = "accessMode", source = "result.bestaccessright.label")
29
    ResearchProductHtml toResearchProductHtml(SolrRecord solrRecord);
30

  
31
    default String extractAuthor(SolrRecord solrRecord) {
32
        return Optional.ofNullable(solrRecord.getResult().getAuthor())
33
                .map(authors -> authors.stream()
34
                        .map(Author::getFullname)
35
                        .filter(Objects::nonNull)
36
                        .collect(Collectors.joining(";")))
37
                .orElse("");
38
    }
39

  
40
    default String extractPermanentIdentifier(SolrRecord solrRecord){
41
        return Optional.ofNullable(solrRecord.getResult().getInstance())
42
                .map(instances -> instances.stream()
43
                        .findFirst()
44
                        .map(instance -> Optional.ofNullable(instance.getUrl())
45
                        .filter(urls -> !urls.isEmpty())
46
                        .map(urls -> urls.get(0)).orElse(""))
47
                .orElse("")).toString();
48
    }
49

  
50
    default String exctractPublicationType(SolrRecord solrRecord){
51
        return Optional.ofNullable(solrRecord.getResult().getInstance())
52
                .map(instances -> instances.stream()
53
                        .findFirst()
54
                        .map(instance -> instance.getInstancetype()).orElse(""))
55
                .orElse("");
56
    }
57

  
58
    default String extractDoi(SolrRecord solrRecord) {
59
        return Optional.ofNullable(solrRecord.getPid())
60
                .map(pids -> pids.stream()
61
                        .filter(pid -> "doi".equalsIgnoreCase(pid.getType()))
62
                        .map(Pid::getValue)
63
                        .collect(Collectors.joining(";")))
64
                .orElse("");
65
    }
66

  
67
    default String extractFunder(SolrRecord solrRecord) {
68
        return Optional.ofNullable(solrRecord.getLinks())
69
                .map(List::stream)
70
                .orElseGet(Stream::empty)
71
                .filter(relatedRecord -> "isProducedBy".equalsIgnoreCase(relatedRecord.getHeader().getRelationClass()))
72
                .map(relatedRecord -> {
73
                    //System.out.println("Funded!!!!!!!");
74
                    String funderString = Optional.ofNullable(relatedRecord.getFunding())
75
                            .map(funding -> Optional.ofNullable(funding.getFunder())
76
                                    .map(funder -> Optional.ofNullable(funder.getShortname())
77
                                            .orElse(funder.getName())
78
                                    ).orElse("")
79
                            ).orElse("");
80

  
81
                    String projectString = Optional.ofNullable(relatedRecord.getAcronym())
82
                            .orElseGet(() -> Optional.ofNullable(relatedRecord.getProjectTitle())
83
                                    .orElse("Unknown"));
84

  
85
                    funderString += "|" + projectString;
86

  
87
                    String code = Optional.ofNullable(relatedRecord.getCode())
88
                            .map(c -> "(" + c + ")")
89
                            .orElse("");
90

  
91
                    return funderString + code;
92
                })
93
                .collect(Collectors.joining(";"));
94
    }
95
}
modules/uoa-search/branches/uoa-search-json/src/main/java/eu/dnetlib/data/search/solr/SolrResultSet.java
1 1
package eu.dnetlib.data.search.solr;
2 2

  
3
import com.fasterxml.jackson.core.type.TypeReference;
4
import com.fasterxml.jackson.databind.DeserializationFeature;
5
import com.fasterxml.jackson.databind.ObjectMapper;
6
import com.fasterxml.jackson.databind.ObjectWriter;
7
import com.fasterxml.jackson.dataformat.csv.CsvMapper;
8
import com.fasterxml.jackson.dataformat.csv.CsvSchema;
3 9
import com.google.gson.Gson;
4 10
import eu.dnetlib.api.data.SearchServiceException;
11
import eu.dnetlib.data.search.helpers.csv.*;
12
import eu.dnetlib.data.search.helpers.html.ResearchProductHtml;
13
import eu.dnetlib.data.search.mappers.csv.DatasourceCsvMapper;
14
import eu.dnetlib.data.search.mappers.csv.OrganizationCsvMapper;
15
import eu.dnetlib.data.search.mappers.csv.ProjectCsvMapper;
16
import eu.dnetlib.data.search.mappers.csv.ResearchProductCsvMapper;
17
import eu.dnetlib.data.search.mappers.html.ResearchProductsHtmlMapper;
5 18
import eu.dnetlib.data.search.transform.Transformer;
6 19
import eu.dnetlib.data.search.transform.TransformerException;
7 20
import eu.dnetlib.data.search.utils.solr.SolrResultSetOptionsUtil;
8 21
import eu.dnetlib.data.search.utils.solr.SolrResultsFormatter;
22
import eu.dnetlib.dhp.schema.solr.*;
9 23
import eu.dnetlib.domain.EPR;
10 24
import gr.uoa.di.driver.enabling.resultset.ResultSet;
11 25
import io.micrometer.core.instrument.Timer;
......
20 34
import org.apache.solr.common.SolrDocumentList;
21 35
import org.apache.solr.common.params.SolrParams;
22 36
import org.apache.solr.common.util.NamedList;
37
import org.springframework.beans.factory.annotation.Autowired;
23 38
import org.z3950.zing.cql.CQLParseException;
24 39

  
25 40
import javax.ws.rs.core.MediaType;
......
41 56
    private NamedList<String> queryOpts = new NamedList<String>();
42 57
    long size = -1;
43 58

  
59
    final ObjectMapper objectMapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
60

  
44 61
    private PrometheusMeterRegistry registry;
45 62

  
46
    public SolrResultSet(EPR epr, CloudSolrClient cloudSolrClient, PrometheusMeterRegistry registry)
63
    DatasourceCsvMapper datasourceCsvMapper;
64
    OrganizationCsvMapper organizationCsvMapper;
65
    ProjectCsvMapper projectCsvMapper;
66
    ResearchProductCsvMapper researchProductCsvMapper;
67
    ResearchProductCsvConverter researchProductCsvConverter;
68
    ResearchProductsHtmlMapper researchProductsHtmlMapper;
69

  
70
    CsvMapper datasourceMapper = new CsvMapper();
71
    CsvMapper organizationMapper = new CsvMapper();
72
    CsvMapper projectMapper = new CsvMapper();
73
    CsvMapper researchProductMapper = new CsvMapper();
74

  
75
    public SolrResultSet(EPR epr, CloudSolrClient cloudSolrClient, PrometheusMeterRegistry registry, DatasourceCsvMapper
76
                         datasourceCsvMapper, OrganizationCsvMapper organizationCsvMapper, ProjectCsvMapper projectCsvMapper,
77
                         ResearchProductCsvMapper researchProductCsvMapper, ResearchProductCsvConverter researchProductCsvConverter,
78
                         ResearchProductsHtmlMapper researchProductsHtmlMapper)
47 79
            throws IOException, CQLParseException, SearchServiceException {
48 80
        this.epr = epr;
49 81
        this.solrClient = cloudSolrClient;
......
54 86
        String mdformat = epr.getParameter("mdformat");
55 87
        String interpretation = epr.getParameter("interpretation");
56 88

  
89
        this.datasourceCsvMapper = datasourceCsvMapper;
90
        this.organizationCsvMapper = organizationCsvMapper;
91
        this.projectCsvMapper = projectCsvMapper;
92
        this.researchProductCsvMapper = researchProductCsvMapper;
93
        this.researchProductCsvConverter = researchProductCsvConverter;
94
        this.researchProductsHtmlMapper = researchProductsHtmlMapper;
95

  
57 96
        ((CloudSolrClient)solrClient).setDefaultCollection(mdformat + "-" + layout + "-" + interpretation);
58 97

  
59 98
        this.registry = registry;
......
170 209
    }
171 210

  
172 211
    public Map<String,List<String>> newGet(int from, int to, String format, Transformer transformer,
173
                                           Transformer oldRefineTransformer, boolean timeout, String timeoutValue) throws SearchServiceException {
212
                                            Transformer oldRefineTransformer, boolean timeout, String timeoutValue) throws SearchServiceException {
174 213
        List<String> refineSolrResults = new ArrayList<String>();
175 214
        List<String> searchSolrResults = new ArrayList<String>();
176 215

  
......
334 373
        }
335 374
    }
336 375

  
376

  
377
    public Map<String,List<String>> newJsonGet(int from, int to, String format, Transformer transformer,
378
                                           Transformer oldRefineTransformer, boolean timeout, String timeoutValue) throws SearchServiceException {
379
        List<String> refineSolrResults = new ArrayList<String>();
380
        List<String> searchSolrResults = new ArrayList<String>();
381

  
382
        QueryResponse rsp = null;
383
        HashMap<String, List<String>> map = new HashMap<String, List<String>>();
384

  
385
        if (from < 0) from = 0;
386
        if (to < 0) to = 0;
387
        queryOpts.add("start", from*to + "");
388
        queryOpts.add("rows", to +"");
389

  
390
        try {
391
            if (timeout) {
392
                if (timeoutValue != null && Integer.valueOf(timeoutValue) == -1) {
393
                    logger.warn("Timeout value is -1. Timeout will not be set for query: " + queryOpts.get("q"));
394
                    timeout = false;
395
                } else if (Integer.valueOf(timeoutValue) < 500) {
396
                    logger.warn("Timeout is less than 500ms. We fall back to the default 1000ms for query:" + queryOpts.get("q"));
397
                    queryOpts.add("timeAllowed", "500");
398
                } else if (timeout) {
399
                    queryOpts.add("timeAllowed", timeoutValue);
400
                }
401
            }
402
        } catch (NumberFormatException nfe) {
403
            logger.warn("NumberFormatException occurred. Timeout not properly set. We fall back to the default 1000ms.");
404
            queryOpts.add("timeAllowed", "500");
405
        }
406

  
407
        logger.info("timeout: " + timeout + ", timeout value: " + queryOpts.get("timeAllowed"));
408

  
409
        //queryOpts.add("f.resulthostingdatasource.facet.limit", "2");
410

  
411
        long startTime = System.nanoTime();
412

  
413
        try {
414
            io.micrometer.core.instrument.Timer.Sample timer = Timer.start(registry);
415
            rsp = solrClient.query(SolrParams.toSolrParams(queryOpts));
416
            timer.stop(registry.timer("solr.server.response.duration"));
417

  
418
            long estimatedTime = System.nanoTime() - startTime;
419
            logger.info("Solrj time " + estimatedTime/1000000 +  " milliseconds for query:" + queryOpts.get("q") +
420
                    " and facets " + queryOpts.getAll("facet.field") + " and fq " + queryOpts.getAll("fq") +
421
                    " and sorts " + queryOpts.getAll("sort") + " from: "
422
                    + from + " and size " + to + " with timeout: " + timeout);
423

  
424
            /*System.out.println("Solrj time " + estimatedTime/1000000 +  " milliseconds for query:" + queryOpts.get("q") +
425
                    " and facets " + queryOpts.getAll("facet.field") + " and fq " + queryOpts.getAll("fq") +
426
                    " and sorts " + queryOpts.getAll("sort") + " from: "
427
                    + from + " and size " + to);
428
            */
429
            facetFields = rsp.getFacetFields();
430

  
431
            SolrDocumentList docs = rsp.getResults();
432

  
433
            this.size = docs.getNumFound();
434

  
435
            if (facetFields!=null && !facetFields.isEmpty()) {
436
                System.out.println("111111");
437
                if (format != null && format.equals(MediaType.APPLICATION_JSON)) {
438
                    System.out.println("22222");
439
                    for (FacetField field : facetFields) {
440
                        System.out.println("33333  " + field.getValueCount());
441
                        map.put(field.getName(), new ArrayList<String>());
442
                        BrowseField bf = null;
443
                        for (int i = 0; i < field.getValueCount(); i++) {
444
                            System.out.println("44444");
445
                            bf = new BrowseField();
446
                            //bf.setId(org.apache.commons.lang3.StringEscapeUtils.escapeJson(field.getValues().get(i).getName()));
447
                            bf.setId(field.getValues().get(i).getName());
448
                            String[] facetedValues = field.getValues().get(i).getName().split("\\|\\|",2);
449

  
450

  
451
                            logger.debug("faceted values " + Arrays.toString(facetedValues));
452
                            System.out.println("faceted values " + Arrays.toString(facetedValues));
453

  
454
                            if (facetedValues.length > 1) {
455
                                //bf.setName(org.apache.commons.lang3.StringEscapeUtils.escapeJson(facetedValues[1]));
456
                                bf.setName(facetedValues[1]);
457
                                logger.debug("faceted values [1] " + facetedValues[1]);
458

  
459
                            } else if (field.getValues().get(i).getName().split("_\\:\\:",2).length > 1) {
460
                                //bf.setName(org.apache.commons.lang3.StringEscapeUtils.escapeJson(field.getValues().get(i).getName().split("\\:\\:",2)[1]).replaceAll("\\:\\:", "\\|"));
461
                                bf.setName(field.getValues().get(i).getName().split("\\:\\:",2)[1].replaceAll("\\:\\:", "\\|"));
462

  
463
                            } else {
464
                                //bf.setName(org.apache.commons.lang3.StringEscapeUtils.escapeJson(field.getValues().get(i).getName()));
465
                                bf.setName(field.getValues().get(i).getName());
466
                            }
467

  
468
                            bf.setCount(field.getValues().get(i).getCount() + "");
469
                            System.out.println("skatakia:>:>" + new Gson().toJson(bf));
470
                            map.get(field.getName()).add(new Gson().toJson(bf));
471
                        }
472

  
473
                    }
474

  
475
                    StringBuilder builder = null;
476

  
477
                    for (Map.Entry<String, List<String>> facetEntry : map.entrySet()) {
478
                        builder = new StringBuilder();
479
                        builder.append("\"" + facetEntry.getKey() + "\"" + " : ");
480
                        builder.append(facetEntry.getValue());
481
                        refineSolrResults.add(builder.toString());
482
                    }
483

  
484
                } else { //the old implementation & xml as default
485
                    logger.debug("Creating old browse results.");
486
                    createXmlRefineFields(refineSolrResults, oldRefineTransformer);
487
                }
488
            }
489

  
490
            startTime = System.nanoTime();
491

  
492
            for (int i = 0; i < docs.size(); i++) {
493
                String result = (String) docs.get(i).get("__json");
494

  
495
                //System.out.println("\n\n\n\n\n JSON ---------------\n"+ result);
496
                //logger.debug("["+ i +"]: " + docs.get(i).get("__result"));
497

  
498
                /*try {
499
                    if (transformer != null) {
500
                        //logger.debug("1 >>>>>>" + result);
501
                        String xml = result.replaceAll("<em>","").replaceAll("</em>","");
502
                        result = transformer.transform(xml);
503
                        //logger.debug("2 >>>>>>" + result);
504
                    }
505

  
506
                } catch (TransformerException te) {
507
                    logger.warn("Error transforming " + result, te);
508
                    continue;
509
                }
510

  
511
                if (format != null && format.equals(MediaType.APPLICATION_JSON)) {
512
                    searchSolrResults.add(SolrResultsFormatter.xml2Json(result));
513
                } else { // default xml*/
514
                searchSolrResults.add(result);
515
                /*}*/
516
            }
517

  
518
            estimatedTime = System.nanoTime() - startTime;
519
            logger.info("Internal transformation time " + estimatedTime/1000000 +  " milliseconds for query:" + queryOpts.get("q") +
520
                    " and facets " + queryOpts.getAll("facet.field") + " and fq " + queryOpts.getAll("fq") + " from: "
521
                    + from + " and size " + to);
522

  
523
            Map<String,List<String>> response = new HashMap<String, List<String>>();
524

  
525
            //logger.debug("refine results " + refineSolrResults);
526
            //logger.info("search results SIZE " + searchSolrResults.size());
527
            //logger.info("search results " + searchSolrResults);
528

  
529

  
530
            response.put("refine",refineSolrResults);
531
            response.put("search", searchSolrResults);
532

  
533
            return response;
534

  
535
        } catch (SolrServerException sse) {
536
            logger.error("Error calling Solr for  query:" + queryOpts.get("q") + " and facets "
537
                    + queryOpts.getAll("facet.field") + " and fq " + queryOpts.getAll("fq") + " from: " + from +
538
                    " and size " + to, sse);
539
            throw new SearchServiceException("Error contacting Solr.", sse);
540

  
541
        } catch (IOException ioe) {
542
            logger.error("Error calling Solr for  query:" + queryOpts.get("q") + " and facets "
543
                    + queryOpts.getAll("facet.field") + " and fq " + queryOpts.getAll("fq") + " from: " + from +
544
                    " and size " + to, ioe);
545
            throw new SearchServiceException("Error reading results from Solr.", ioe);
546

  
547
        }
548
    }
549

  
337 550
    /**
338 551
     * limit is the maximum number of results the cursor get is allowed to fetch. If limit is set to -1 all
339 552
     * results are returned.
340 553
     */
341
    public void cursorGet(Transformer transformer, int limit, OutputStream os) throws SolrServerException, SearchServiceException {
554
    public void cursorGet(Transformer transformer, boolean special, boolean hasTitle, boolean isHtml,
555
                          int limit, OutputStream os) throws SolrServerException, SearchServiceException {
342 556

  
557
        System.out.println("Datasource Mapper " + datasourceCsvMapper);
558

  
343 559
        int rows = 500;
344 560
        int limitCounter = -1;
345 561

  
......
347 563
        queryOpts.add("rows", "0");
348 564
        queryOpts.remove("rows");
349 565
        queryOpts.add("rows", rows+"");
350
        queryOpts.add("fl", "__result");
566
        //queryOpts.add("fl", "__result");
351 567
        queryOpts.add("shards.tolerant","true");
352 568
        queryOpts.add("cursorMark", "*");
353 569
        queryOpts.add("sort", "__indexrecordidentifier asc");
......
369 585
                cursorMark = nextCursorMark;
370 586
                nextCursorMark = resp.getNextCursorMark();
371 587

  
588
                StringBuilder htmlBuilder = null;
589

  
590
                if(isHtml) {
591
                    htmlBuilder = new StringBuilder();
592
                    // Start the HTML table and headers
593
                    htmlBuilder.append("<table>")
594
                            .append("<thead><tr>")
595
                            .append("<th>Type</th>" +
596
                                    "<th>Title</th>" +
597
                                    "<th>Authors</th>" +
598
                                    "<th>Publication Year</th>" +
599
                                    "<th>DOI</th>" +
600
                                    "<th>Permanent Identifier</th>" +
601
                                    "<th>Publication type</th>" +
602
                                    "<th>Journal</th>" +
603
                                    "<th>Project Name (GA Number)</th>" +
604
                                    "<th>Access Mode</th>") // Add more headers as needed
605
                            .append("</tr></thead><tbody>");
606
                    os.write(htmlBuilder.toString().getBytes());
607
                    os.flush();
608
                }
372 609
                for (int i = 0; i < resp.getResults().size(); i++) {
373
                    if (transformer != null) {
374
                        String result = null;
375
                        try {
376
                            logger.debug("PRE RESULT " + resp.getResults().get(i).get("__result"));
377
                            result = transformer.transform((String) resp.getResults().get(i).get("__result"));
378
                            logger.debug("RESULT " + result);
610
                    SolrRecord record = objectMapper.readValue((String) resp.getResults().get(i).get("__json"), new TypeReference<SolrRecord>() {});
611
                    if(!isHtml) {
612
                        if (transformer != null) {
613
                            String result = null;
379 614

  
380
                        } catch (TransformerException te) {
381
                            logger.warn("Error transforming " + result, te);
382
                            continue;
383
                        }
384 615

  
385
                        try {
386
                            os.write(result.getBytes());
387
                            os.flush();
388
                        } catch (IOException e) {
389
                            logger.error("Cursor get... ", e);
390
                            continue;
616
                            Datasource datasource = record.getDatasource();
617
                            Project project = record.getProject();
618
                            Result result1 = record.getResult();
619
                            Organization organization = record.getOrganization();
620

  
621
                            System.out.println("datasource " + datasource);
622
                            System.out.println("project " + project);
623
                            System.out.println("result " + result);
624
                            System.out.println("organization " + organization);
625

  
626
                            CsvEntity csvEntity = null;
627
                            String csvRow = "";
628
                            ObjectWriter csvWriterRow = null;
629

  
630
                            if (datasource != null) {
631
                                csvEntity = datasourceCsvMapper.toDatasourceCsv(record);
632
                                CsvSchema schema = null;
633
                                if (hasTitle)
634
                                    schema = datasourceMapper.schemaFor(DatasourceCsv.class).withHeader();
635
                                else
636
                                    schema = datasourceMapper.schemaFor(DatasourceCsv.class).withoutHeader();
637
                                //ObjectWriter csvWriterHeader = datasourceMapper.writer(schema); // Initialize for header
638
                                csvWriterRow = datasourceMapper.writer(schema.withoutHeader());
639
                            } else if (organization != null) {
640
                                csvEntity = organizationCsvMapper.toOrganizationCsv(record);
641
                                CsvSchema schema = null;
642
                                if (hasTitle)
643
                                    schema = organizationMapper.schemaFor(OrganizationCsv.class).withHeader();
644
                                else
645
                                    schema = organizationMapper.schemaFor(OrganizationCsv.class).withoutHeader();
646
                                //ObjectWriter csvWriterHeader = organizationMapper.writer(schema); // Initialize for header
647
                                csvWriterRow = organizationMapper.writer(schema.withoutHeader());
648
                            } else if (project != null) {
649
                                csvEntity = projectCsvMapper.toProjectCsv(record);
650
                                CsvSchema schema = null;
651
                                if (hasTitle)
652
                                    schema = projectMapper.schemaFor(ProjectCsv.class).withHeader();
653
                                else
654
                                    schema = projectMapper.schemaFor(ProjectCsv.class).withoutHeader();
655
                                //ObjectWriter csvWriterHeader = projectMapper.writer(schema); // Initialize for header
656
                                csvWriterRow = projectMapper.writer(schema.withoutHeader());
657
                            } else if (result1 != null) {
658
                                csvEntity = researchProductCsvMapper.toResearchProductCsv(record);
659
                                CsvSchema schema = null;
660
                                if (hasTitle)
661
                                    schema = researchProductMapper.schemaFor(ResearchProductCsv.class).withHeader();
662
                                else
663
                                    schema = researchProductMapper.schemaFor(ResearchProductCsv.class).withoutHeader();
664
                                //ObjectWriter csvWriterHeader = researchProductMapper.writer(schema); // Initialize for header
665
                                csvWriterRow = researchProductMapper.writer(schema.withoutHeader());
666
                            }
667

  
668
                            try {
669
                                if (!special) {
670
                                    csvRow = csvWriterRow.writeValueAsString(csvEntity);
671
                                    os.write(csvRow.getBytes());
672
                                    os.flush();
673
                                } else {
674
                                    List<ResearchProductCsv> flattenedProducts = researchProductCsvConverter.flattenProjects(record);
675
                                    for (ResearchProductCsv internalCsvEntity : flattenedProducts) {
676
                                        csvRow = csvWriterRow.writeValueAsString(internalCsvEntity);
677
                                        os.write(csvRow.getBytes());
678
                                        os.flush();
679
                                    }
680
                                }
681
                            } catch (IOException e) {
682
                                logger.error("Cursor get... ", e);
683
                                System.out.println("ERROR " + e.getMessage());
684
                                continue;
685
                            }
391 686
                        }
687
                    } else {
688
                        ResearchProductHtml researchProductHtml = researchProductsHtmlMapper.toResearchProductHtml(record);
689
                        htmlBuilder.append("<tr>")
690
                                .append("<td>").append(researchProductHtml.getType()).append("</td>")
691
                                .append("<td>").append(researchProductHtml.getTitle()).append("</td>")
692
                                .append("<td>").append(researchProductHtml.getAuthors()).append("</td>")
693
                                .append("<td>").append(researchProductHtml.getPublicationYear()).append("</td>")
694
                                .append("<td>").append(researchProductHtml.getDoi()).append("</td>")
695
                                .append("<td>").append(researchProductHtml.getPermanentIdentifier()).append("</td>")
696
                                .append("<td>").append(researchProductHtml.getPublicationType()).append("</td>")
697
                                .append("<td>").append(researchProductHtml.getJournal()).append("</td>")
698
                                .append("<td>").append(researchProductHtml.getProjectName_gaNumber()).append("</td>")
699
                                .append("<td>").append(researchProductHtml.getAccessMode()).append("</td>")
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff