Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
dmp
OpenAIRE-EUDAT-DMP-service-pilot
Commits
5de811a7
Commit
5de811a7
authored
Aug 04, 2021
by
George Kalampokis
Browse files
Vastly improve and optimize DMP and Dataset Queries (and with elastic)
parent
ce8b49de
Changes
13
Hide whitespace changes
Inline
Side-by-side
dmp-backend/data/src/main/java/eu/eudat/data/query/definition/helpers/ColumnOrderings.java
View file @
5de811a7
...
...
@@ -6,22 +6,22 @@ import java.util.List;
public
class
ColumnOrderings
{
private
String
[]
fields
;
private
List
<
String
>
fields
;
public
String
[]
getFields
()
{
public
List
<
String
>
getFields
()
{
return
fields
;
}
public
void
setFields
(
String
[]
fields
)
{
public
void
setFields
(
List
<
String
>
fields
)
{
this
.
fields
=
fields
;
}
public
Ordering
[]
getFieldOrderings
()
{
public
List
<
Ordering
>
getFieldOrderings
()
{
List
<
Ordering
>
orderings
=
new
LinkedList
<>();
for
(
String
field
:
fields
)
{
orderings
.
add
(
this
.
orderingFromString
(
field
));
}
return
orderings
.
toArray
(
new
Ordering
[
orderings
.
size
()])
;
return
orderings
;
}
private
Ordering
orderingFromString
(
String
field
)
{
...
...
dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/DatasetCriteria.java
View file @
5de811a7
...
...
@@ -18,6 +18,7 @@ public class DatasetCriteria extends Criteria {
private
List
<
UUID
>
collaborators
;
private
Boolean
allowAllVersions
;
private
List
<
String
>
organiztions
;
private
Boolean
hasTags
;
private
List
<
Tag
>
tags
;
private
boolean
isPublic
;
private
Short
grantStatus
;
...
...
@@ -144,4 +145,12 @@ public class DatasetCriteria extends Criteria {
public
void
setSortCriteria
(
List
<
SortCriteria
>
sortCriteria
)
{
this
.
sortCriteria
=
sortCriteria
;
}
public
Boolean
getHasTags
()
{
return
hasTags
;
}
public
void
setHasTags
(
Boolean
hasTags
)
{
this
.
hasTags
=
hasTags
;
}
}
dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Dataset.java
View file @
5de811a7
...
...
@@ -283,38 +283,46 @@ public class Dataset implements ElasticEntity<Dataset> {
@Override
public
Dataset
fromElasticEntity
(
Map
<
String
,
Object
>
fields
)
{
if
(
fields
!=
null
)
{
this
.
id
=
(
String
)
fields
.
get
(
"id"
);
if
(
fields
.
get
(
"tags"
)
!=
null
)
{
this
.
tags
=
((
List
<
HashMap
>)
fields
.
get
(
"tags"
)).
stream
().
map
(
hashMap
->
new
Tag
().
fromElasticEntity
(
hashMap
)).
collect
(
Collectors
.
toList
());
}
this
.
label
=
(
String
)
fields
.
get
(
"label"
);
this
.
description
=
(
String
)
fields
.
get
(
"description"
);
this
.
template
=
UUID
.
fromString
((
String
)
fields
.
get
(
"template"
));
this
.
status
=
Short
.
valueOf
((
String
)
fields
.
get
(
"status"
));
this
.
dmp
=
UUID
.
fromString
((
String
)
fields
.
get
(
"dmp"
));
this
.
group
=
UUID
.
fromString
((
String
)
fields
.
get
(
"group"
));
this
.
grant
=
UUID
.
fromString
((
String
)
fields
.
get
(
"grant"
));
if
(
fields
.
get
(
"created"
)
!=
null
)
this
.
created
=
Date
.
from
(
Instant
.
parse
((
String
)
fields
.
get
(
"created"
)));
if
(
fields
.
get
(
"modified"
)
!=
null
)
this
.
modified
=
Date
.
from
(
Instant
.
parse
((
String
)
fields
.
get
(
"modified"
)));
if
(
fields
.
get
(
"finalizedAt"
)
!=
null
)
this
.
finalizedAt
=
Date
.
from
(
Instant
.
parse
((
String
)
fields
.
get
(
"finalizedAt"
)));
if
(
fields
.
get
(
"collaborators"
)
!=
null
)
{
this
.
collaborators
=
((
List
<
HashMap
>)
fields
.
get
(
"collaborators"
)).
stream
().
map
(
hashMap
->
new
Collaborator
().
fromElasticEntity
(
hashMap
)).
collect
(
Collectors
.
toList
());
}
this
.
lastVersion
=
Boolean
.
parseBoolean
((
String
)
fields
.
get
(
"lastVersion"
));
this
.
lastPublicVersion
=
Boolean
.
parseBoolean
((
String
)
fields
.
get
(
"lastPublicVersion"
));
if
(
fields
.
get
(
"organizations"
)
!=
null
)
{
this
.
organizations
=
((
List
<
HashMap
>)
fields
.
get
(
"organizations"
)).
stream
().
map
(
hashMap
->
new
Organization
().
fromElasticEntity
(
hashMap
)).
collect
(
Collectors
.
toList
());
}
if
(
fields
.
get
(
"public"
)
!=
null
)
{
this
.
isPublic
=
Boolean
.
valueOf
((
String
)
fields
.
get
(
"public"
));
}
if
(
fields
.
get
(
"grantStatus"
)
!=
null
)
{
this
.
grantStatus
=
Short
.
valueOf
((
String
)
fields
.
get
(
"grantStatus"
));
if
(
fields
.
size
()
==
1
)
{
if
(
fields
.
containsKey
(
"id"
))
{
this
.
id
=
(
String
)
fields
.
get
(
"id"
);
}
else
if
(
fields
.
containsKey
(
"tags"
))
{
this
.
tags
=
((
List
<
HashMap
>)
fields
.
get
(
"tags"
)).
stream
().
map
(
hashMap
->
new
Tag
().
fromElasticEntity
(
hashMap
)).
collect
(
Collectors
.
toList
());
}
}
else
if
(
fields
.
size
()
>
1
)
{
this
.
id
=
(
String
)
fields
.
get
(
"id"
);
if
(
fields
.
get
(
"tags"
)
!=
null
)
{
this
.
tags
=
((
List
<
HashMap
>)
fields
.
get
(
"tags"
)).
stream
().
map
(
hashMap
->
new
Tag
().
fromElasticEntity
(
hashMap
)).
collect
(
Collectors
.
toList
());
}
this
.
label
=
(
String
)
fields
.
get
(
"label"
);
this
.
description
=
(
String
)
fields
.
get
(
"description"
);
this
.
template
=
UUID
.
fromString
((
String
)
fields
.
get
(
"template"
));
this
.
status
=
Short
.
valueOf
((
String
)
fields
.
get
(
"status"
));
this
.
dmp
=
UUID
.
fromString
((
String
)
fields
.
get
(
"dmp"
));
this
.
group
=
UUID
.
fromString
((
String
)
fields
.
get
(
"group"
));
this
.
grant
=
UUID
.
fromString
((
String
)
fields
.
get
(
"grant"
));
if
(
fields
.
get
(
"created"
)
!=
null
)
this
.
created
=
Date
.
from
(
Instant
.
parse
((
String
)
fields
.
get
(
"created"
)));
if
(
fields
.
get
(
"modified"
)
!=
null
)
this
.
modified
=
Date
.
from
(
Instant
.
parse
((
String
)
fields
.
get
(
"modified"
)));
if
(
fields
.
get
(
"finalizedAt"
)
!=
null
)
this
.
finalizedAt
=
Date
.
from
(
Instant
.
parse
((
String
)
fields
.
get
(
"finalizedAt"
)));
if
(
fields
.
get
(
"collaborators"
)
!=
null
)
{
this
.
collaborators
=
((
List
<
HashMap
>)
fields
.
get
(
"collaborators"
)).
stream
().
map
(
hashMap
->
new
Collaborator
().
fromElasticEntity
(
hashMap
)).
collect
(
Collectors
.
toList
());
}
this
.
lastVersion
=
Boolean
.
parseBoolean
((
String
)
fields
.
get
(
"lastVersion"
));
this
.
lastPublicVersion
=
Boolean
.
parseBoolean
((
String
)
fields
.
get
(
"lastPublicVersion"
));
if
(
fields
.
get
(
"organizations"
)
!=
null
)
{
this
.
organizations
=
((
List
<
HashMap
>)
fields
.
get
(
"organizations"
)).
stream
().
map
(
hashMap
->
new
Organization
().
fromElasticEntity
(
hashMap
)).
collect
(
Collectors
.
toList
());
}
if
(
fields
.
get
(
"public"
)
!=
null
)
{
this
.
isPublic
=
Boolean
.
valueOf
((
String
)
fields
.
get
(
"public"
));
}
if
(
fields
.
get
(
"grantStatus"
)
!=
null
)
{
this
.
grantStatus
=
Short
.
valueOf
((
String
)
fields
.
get
(
"grantStatus"
));
}
this
.
formData
=
(
String
)
fields
.
get
(
"formData"
);
}
this
.
formData
=
(
String
)
fields
.
get
(
"formData"
);
}
return
this
;
}
...
...
dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DatasetRepository.java
View file @
5de811a7
...
...
@@ -24,6 +24,7 @@ import org.elasticsearch.search.aggregations.bucket.filter.ParsedFilters;
import
org.elasticsearch.search.aggregations.bucket.nested.NestedAggregationBuilder
;
import
org.elasticsearch.search.aggregations.bucket.nested.ParsedNested
;
import
org.elasticsearch.search.builder.SearchSourceBuilder
;
import
org.elasticsearch.search.fetch.subphase.FetchSourceContext
;
import
org.elasticsearch.search.sort.SortBuilder
;
import
org.elasticsearch.search.sort.SortBuilders
;
import
org.elasticsearch.search.sort.SortOrder
;
...
...
@@ -122,68 +123,69 @@ public class DatasetRepository extends ElasticRepository<Dataset, DatasetCriteri
searchSourceBuilder
.
size
(
count
.
intValue
());
BoolQueryBuilder
boolQuery
=
QueryBuilders
.
boolQuery
().
mustNot
(
QueryBuilders
.
termsQuery
(
"datasets.status"
,
Stream
.
of
(
Dataset
.
Status
.
DELETED
.
getValue
(),
Dataset
.
Status
.
CANCELED
.
getValue
()).
collect
(
Collectors
.
toList
())));
List
<
SortBuilder
>
sortBuilders
=
new
ArrayList
<>();
if
(
criteria
.
isPublic
())
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termQuery
(
"datasets.public"
,
"true"
));
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termQuery
(
"datasets.status"
,
Dataset
.
Status
.
FINALISED
.
getValue
()));
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termQuery
(
"datasets.lastPublicVersion"
,
"true"
));
}
if
(
criteria
.
getLike
()
!=
null
&&
!
criteria
.
getLike
().
isEmpty
())
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
queryStringQuery
(
criteria
.
getLike
()).
allowLeadingWildcard
(
true
).
fields
(
Stream
.
of
(
new
Object
[][]{
{
"datasets.label"
,
1.0f
},
{
"datasets.description"
,
1.0f
},
{
"datasets.formData"
,
1.0f
}
}).
collect
(
Collectors
.
toMap
(
data
->
(
String
)
data
[
0
],
data
->
(
Float
)
data
[
1
]))));
}
BoolQueryBuilder
boolQuery
=
createBoolQuery
(
criteria
);
if
(
criteria
.
getDatasetTemplates
()
!=
null
&&
criteria
.
getDatasetTemplates
().
size
()
>
0
)
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termsQuery
(
"datasets.template"
,
criteria
.
getDatasetTemplates
().
stream
().
map
(
UUID:
:
toString
).
collect
(
Collectors
.
toList
())));
}
if
(
criteria
.
getStatus
()
!=
null
)
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termQuery
(
"datasets.status"
,
criteria
.
getStatus
().
toString
()));
}
if
(
criteria
.
getSortCriteria
()
!=
null
&&
!
criteria
.
getSortCriteria
().
isEmpty
())
{
criteria
.
getSortCriteria
().
forEach
(
sortCriteria
->
{
switch
(
sortCriteria
.
getColumnType
())
{
case
COLUMN:
sortBuilders
.
add
(
SortBuilders
.
fieldSort
(
sortCriteria
.
getFieldName
()).
order
(
SortOrder
.
fromString
(
sortCriteria
.
getOrderByType
().
name
())));
break
;
case
JOIN_COLUMN:
List
<
String
>
fields
=
Arrays
.
asList
(
sortCriteria
.
getFieldName
().
split
(
":"
));
fields
.
stream
().
filter
(
name
->
!
name
.
startsWith
(
"dmp"
)).
forEach
(
field
->
{
sortBuilders
.
add
(
SortBuilders
.
fieldSort
(
field
).
order
(
SortOrder
.
fromString
(
sortCriteria
.
getOrderByType
().
name
())));
});
break
;
}
});
if
(
criteria
.
getDmps
()
!=
null
&&
criteria
.
getDmps
().
size
()
>
0
)
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termsQuery
(
"datasets.dmp"
,
criteria
.
getDmps
().
stream
().
map
(
UUID:
:
toString
).
collect
(
Collectors
.
toList
())));
}
if
(
criteria
.
getGroupIds
()
!=
null
&&
criteria
.
getGroupIds
().
size
()
>
0
)
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termsQuery
(
"datasets.group"
,
criteria
.
getGroupIds
().
stream
().
map
(
UUID:
:
toString
).
collect
(
Collectors
.
toList
())));
NestedQueryBuilder
nestedQueryBuilder
=
QueryBuilders
.
nestedQuery
(
"datasets"
,
boolQuery
,
ScoreMode
.
Avg
).
innerHit
(
new
InnerHitBuilder
().
setFetchSourceContext
(
new
FetchSourceContext
(
true
,
new
String
[]{
"datasets.tags"
},
null
)));
searchSourceBuilder
.
query
(
nestedQueryBuilder
).
from
(
criteria
.
getOffset
()).
fetchSource
(
"datasets.tags"
,
null
);
if
(
criteria
.
getSize
()
>
0
)
{
searchSourceBuilder
.
size
(
criteria
.
getSize
());
}
sortBuilders
.
forEach
(
searchSourceBuilder:
:
sort
);
searchRequest
.
source
(
searchSourceBuilder
);
SearchResponse
response
=
this
.
getClient
().
search
(
searchRequest
,
RequestOptions
.
DEFAULT
);
return
((
Stream
<
Dataset
>)
Arrays
.
stream
(
response
.
getHits
().
getHits
())
.
map
(
hit
->
hit
.
getInnerHits
().
values
()).
flatMap
(
Collection:
:
stream
)
.
map
(
SearchHits:
:
getHits
).
flatMap
(
Arrays:
:
stream
)
.
map
(
x
->
new
Dataset
().
fromElasticEntity
(
this
.
transformFromString
(
x
.
getSourceAsString
(),
Map
.
class
)))).
collect
(
Collectors
.
toList
());
}
return
null
;
}
if
(
criteria
.
getGrants
()
!=
null
&&
criteria
.
getGrants
().
size
()
>
0
)
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termsQuery
(
"datasets.grant"
,
criteria
.
getGrants
().
stream
().
map
(
UUID:
:
toString
).
collect
(
Collectors
.
toList
())));
}
public
List
<
Dataset
>
queryIds
(
DatasetCriteria
criteria
)
throws
IOException
{
if
(
this
.
getClient
()
!=
null
)
{
SearchRequest
searchRequest
=
new
SearchRequest
(
this
.
environment
.
getProperty
(
"elasticsearch.index"
));
SearchSourceBuilder
searchSourceBuilder
=
new
SearchSourceBuilder
();
if
(
criteria
.
getGrantStatus
()
!=
null
)
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termQuery
(
"datasets.grantStatus"
,
criteria
.
getGrantStatus
().
toString
()));
}
/*CountRequest countRequest = new CountRequest("dmps").routing("datasets").routing("id");
countRequest.query(QueryBuilders.boolQuery().mustNot(QueryBuilders.termsQuery("datasets.status.keyword", Stream.of(Dataset.Status.DELETED.getValue(), Dataset.Status.CANCELED.getValue()).collect(Collectors.toList()))));
CountResponse countResponse = getClient().count(countRequest, RequestOptions.DEFAULT);
Long count = countResponse.getCount();*/
if
(
criteria
.
getCollaborators
()
!=
null
&&
criteria
.
getCollaborators
().
size
()
>
0
)
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termsQuery
(
"datasets.collaborators.id"
,
criteria
.
getCollaborators
().
stream
().
map
(
UUID:
:
toString
).
collect
(
Collectors
.
toList
())));
}
SearchRequest
countRequest
=
new
SearchRequest
(
this
.
environment
.
getProperty
(
"elasticsearch.index"
));
NestedAggregationBuilder
nestedAggregationBuilder
=
AggregationBuilders
.
nested
(
"by_dataset"
,
"datasets"
);
FiltersAggregationBuilder
filtersAggregationBuilder
=
AggregationBuilders
.
filters
(
"dataset_query"
,
QueryBuilders
.
boolQuery
().
mustNot
(
QueryBuilders
.
termsQuery
(
"datasets.status.keyword"
,
Stream
.
of
(
Dataset
.
Status
.
DELETED
.
getValue
(),
Dataset
.
Status
.
CANCELED
.
getValue
()).
collect
(
Collectors
.
toList
()))));
nestedAggregationBuilder
.
subAggregation
(
filtersAggregationBuilder
);
SearchSourceBuilder
countSourceBuilder
=
new
SearchSourceBuilder
();
countSourceBuilder
.
aggregation
(
nestedAggregationBuilder
);
countRequest
.
source
(
countSourceBuilder
);
SearchResponse
countResponse
=
getClient
().
search
(
countRequest
,
RequestOptions
.
DEFAULT
);
Long
count
=
((
ParsedFilters
)((
ParsedNested
)
countResponse
.
getAggregations
().
asMap
().
get
(
"by_dataset"
)).
getAggregations
().
get
(
"dataset_query"
)).
getBuckets
().
get
(
0
).
getDocCount
();
if
(!
criteria
.
isPublic
())
{
if
(
criteria
.
getAllowAllVersions
()
!=
null
&&
!
criteria
.
getAllowAllVersions
())
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termQuery
(
"datasets.lastVersion"
,
"true"
));
}
}
if
(
criteria
.
getOrganiztions
()
!=
null
&&
criteria
.
getOrganiztions
().
size
()
>
0
)
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termsQuery
(
"datasets.organizations.id"
,
criteria
.
getOrganiztions
()));
}
searchSourceBuilder
.
size
(
count
.
intValue
());
if
(
criteria
.
getTags
()
!=
null
&&
criteria
.
getTags
().
size
()
>
0
)
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termsQuery
(
"datasets.tags.name"
,
criteria
.
getTags
().
stream
().
map
(
Tag:
:
getName
).
collect
(
Collectors
.
toList
())));
}
List
<
SortBuilder
>
sortBuilders
=
new
ArrayList
<>();
BoolQueryBuilder
boolQuery
=
createBoolQuery
(
criteria
);
if
(
boolQuery
.
should
().
isEmpty
()
&&
boolQuery
.
mustNot
().
isEmpty
())
{
boolQuery
.
should
(
QueryBuilders
.
matchAllQuery
());
}
else
{
boolQuery
.
minimumShouldMatch
(
boolQuery
.
should
().
size
());
}
if
(
criteria
.
getSortCriteria
()
!=
null
&&
!
criteria
.
getSortCriteria
().
isEmpty
())
{
criteria
.
getSortCriteria
().
forEach
(
sortCriteria
->
{
...
...
@@ -202,19 +204,117 @@ public class DatasetRepository extends ElasticRepository<Dataset, DatasetCriteri
}
NestedQueryBuilder
nestedQueryBuilder
=
QueryBuilders
.
nestedQuery
(
"datasets"
,
boolQuery
,
ScoreMode
.
Avg
).
innerHit
(
new
InnerHitBuilder
());
searchSourceBuilder
.
query
(
nestedQueryBuilder
).
from
(
criteria
.
getOffset
()).
size
(
criteria
.
getSize
());
NestedQueryBuilder
nestedQueryBuilder
=
QueryBuilders
.
nestedQuery
(
"datasets"
,
boolQuery
,
ScoreMode
.
None
).
innerHit
(
new
InnerHitBuilder
()
.
setFetchSourceContext
(
new
FetchSourceContext
(
true
,
new
String
[]{
"datasets.id"
},
null
))
);
searchSourceBuilder
.
query
(
nestedQueryBuilder
).
from
(
criteria
.
getOffset
()).
size
(
criteria
.
getSize
())
.
fetchSource
(
"datasets.id"
,
null
)
;
sortBuilders
.
forEach
(
searchSourceBuilder:
:
sort
);
searchRequest
.
source
(
searchSourceBuilder
);
SearchResponse
response
=
this
.
getClient
().
search
(
searchRequest
,
RequestOptions
.
DEFAULT
);
return
((
Stream
<
Dataset
>)
Arrays
.
stream
(
response
.
getHits
().
getHits
())
.
map
(
hit
->
hit
.
getInnerHits
().
values
()).
flatMap
(
Collection:
:
stream
)
.
map
(
SearchHits:
:
getHits
).
flatMap
(
Arrays:
:
stream
)
.
map
(
x
->
new
Dataset
().
fromElasticEntity
(
this
.
transformFromString
(
x
.
getSourceAsString
(),
Map
.
class
)))).
collect
(
Collectors
.
toList
());
.
map
(
hit
->
hit
.
getInnerHits
().
values
()).
flatMap
(
Collection:
:
stream
)
.
map
(
SearchHits:
:
getHits
).
flatMap
(
Arrays:
:
stream
)
.
map
(
x
->
new
Dataset
().
fromElasticEntity
(
this
.
transformFromString
(
x
.
getSourceAsString
(),
Map
.
class
)))).
collect
(
Collectors
.
toList
());
}
return
null
;
}
@Override
public
Long
count
(
DatasetCriteria
criteria
)
throws
IOException
{
if
(
this
.
getClient
()
!=
null
)
{
//CountRequest countRequest = new CountRequest(this.environment.getProperty("elasticsearch.index"));
SearchRequest
countRequest
=
new
SearchRequest
(
this
.
environment
.
getProperty
(
"elasticsearch.index"
));
BoolQueryBuilder
boolQuery
=
createBoolQuery
(
criteria
);
NestedAggregationBuilder
nestedAggregationBuilder
=
AggregationBuilders
.
nested
(
"by_dataset"
,
"datasets"
);
FiltersAggregationBuilder
filtersAggregationBuilder
=
AggregationBuilders
.
filters
(
"dataset_query"
,
boolQuery
);
nestedAggregationBuilder
.
subAggregation
(
filtersAggregationBuilder
);
SearchSourceBuilder
countSourceBuilder
=
new
SearchSourceBuilder
();
countSourceBuilder
.
aggregation
(
nestedAggregationBuilder
);
countRequest
.
source
(
countSourceBuilder
);
SearchResponse
countResponse
=
getClient
().
search
(
countRequest
,
RequestOptions
.
DEFAULT
);
return
((
ParsedFilters
)((
ParsedNested
)
countResponse
.
getAggregations
().
asMap
().
get
(
"by_dataset"
)).
getAggregations
().
get
(
"dataset_query"
)).
getBuckets
().
get
(
0
).
getDocCount
();
/*NestedQueryBuilder nestedQueryBuilder = QueryBuilders.nestedQuery("datasets", boolQuery, ScoreMode.None).innerHit(new InnerHitBuilder());
countRequest.query(nestedQueryBuilder);
CountResponse response = this.getClient().count(countRequest, RequestOptions.DEFAULT);
return response.getCount();*/
}
return
null
;
}
private
BoolQueryBuilder
createBoolQuery
(
DatasetCriteria
criteria
)
{
BoolQueryBuilder
boolQuery
=
QueryBuilders
.
boolQuery
().
mustNot
(
QueryBuilders
.
termsQuery
(
"datasets.status"
,
Stream
.
of
(
Dataset
.
Status
.
DELETED
.
getValue
(),
Dataset
.
Status
.
CANCELED
.
getValue
()).
collect
(
Collectors
.
toList
())));
if
(
criteria
.
isPublic
())
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termQuery
(
"datasets.public"
,
"true"
));
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termQuery
(
"datasets.status"
,
Dataset
.
Status
.
FINALISED
.
getValue
()));
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termQuery
(
"datasets.lastPublicVersion"
,
"true"
));
}
if
(
criteria
.
getLike
()
!=
null
&&
!
criteria
.
getLike
().
isEmpty
())
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
queryStringQuery
(
criteria
.
getLike
()).
allowLeadingWildcard
(
true
).
fields
(
Stream
.
of
(
new
Object
[][]{
{
"datasets.label"
,
1.0f
},
{
"datasets.description"
,
1.0f
},
{
"datasets.formData"
,
1.0f
}
}).
collect
(
Collectors
.
toMap
(
data
->
(
String
)
data
[
0
],
data
->
(
Float
)
data
[
1
]))));
}
if
(
criteria
.
getDatasetTemplates
()
!=
null
&&
criteria
.
getDatasetTemplates
().
size
()
>
0
)
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termsQuery
(
"datasets.template"
,
criteria
.
getDatasetTemplates
().
stream
().
map
(
UUID:
:
toString
).
collect
(
Collectors
.
toList
())));
}
if
(
criteria
.
getStatus
()
!=
null
)
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termQuery
(
"datasets.status"
,
criteria
.
getStatus
().
toString
()));
}
if
(
criteria
.
getDmps
()
!=
null
&&
criteria
.
getDmps
().
size
()
>
0
)
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termsQuery
(
"datasets.dmp"
,
criteria
.
getDmps
().
stream
().
map
(
UUID:
:
toString
).
collect
(
Collectors
.
toList
())));
}
if
(
criteria
.
getGroupIds
()
!=
null
&&
criteria
.
getGroupIds
().
size
()
>
0
)
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termsQuery
(
"datasets.group"
,
criteria
.
getGroupIds
().
stream
().
map
(
UUID:
:
toString
).
collect
(
Collectors
.
toList
())));
}
if
(
criteria
.
getGrants
()
!=
null
&&
criteria
.
getGrants
().
size
()
>
0
)
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termsQuery
(
"datasets.grant"
,
criteria
.
getGrants
().
stream
().
map
(
UUID:
:
toString
).
collect
(
Collectors
.
toList
())));
}
if
(
criteria
.
getGrantStatus
()
!=
null
)
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termQuery
(
"datasets.grantStatus"
,
criteria
.
getGrantStatus
().
toString
()));
}
if
(
criteria
.
getCollaborators
()
!=
null
&&
criteria
.
getCollaborators
().
size
()
>
0
)
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termsQuery
(
"datasets.collaborators.id.keyword"
,
criteria
.
getCollaborators
().
stream
().
map
(
UUID:
:
toString
).
collect
(
Collectors
.
toList
())));
}
if
(!
criteria
.
isPublic
())
{
if
(
criteria
.
getAllowAllVersions
()
!=
null
&&
!
criteria
.
getAllowAllVersions
())
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termQuery
(
"datasets.lastVersion"
,
"true"
));
}
}
if
(
criteria
.
getOrganiztions
()
!=
null
&&
criteria
.
getOrganiztions
().
size
()
>
0
)
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termsQuery
(
"datasets.organizations.id"
,
criteria
.
getOrganiztions
()));
}
if
(
criteria
.
getTags
()
!=
null
&&
criteria
.
getTags
().
size
()
>
0
)
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termsQuery
(
"datasets.tags.name"
,
criteria
.
getTags
().
stream
().
map
(
Tag:
:
getName
).
collect
(
Collectors
.
toList
())));
}
if
(
criteria
.
getHasTags
()
!=
null
)
{
boolQuery
=
criteria
.
getHasTags
()
==
true
?
boolQuery
.
should
(
QueryBuilders
.
existsQuery
(
"datasets.tags.id"
))
:
boolQuery
.
mustNot
(
QueryBuilders
.
existsQuery
(
"datasets.tags.id"
));
}
if
(
boolQuery
.
should
().
isEmpty
()
&&
boolQuery
.
mustNot
().
isEmpty
())
{
boolQuery
.
should
(
QueryBuilders
.
matchAllQuery
());
}
else
{
boolQuery
.
minimumShouldMatch
(
boolQuery
.
should
().
size
());
}
return
boolQuery
;
}
@Override
public
boolean
exists
()
throws
IOException
{
if
(
this
.
getClient
()
!=
null
)
{
...
...
dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DmpRepository.java
View file @
5de811a7
...
...
@@ -99,60 +99,8 @@ public class DmpRepository extends ElasticRepository<Dmp, DmpCriteria> {
searchSourceBuilder
.
size
(
count
.
intValue
());
BoolQueryBuilder
boolQuery
=
QueryBuilders
.
boolQuery
().
mustNot
(
QueryBuilders
.
termsQuery
(
Dmp
.
MapKey
.
STATUS
.
getName
(),
Collections
.
singletonList
(
Dmp
.
DMPStatus
.
DELETED
.
getValue
())));
List
<
SortBuilder
>
sortBuilders
=
new
ArrayList
<>();
if
(
criteria
.
isPublic
())
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termQuery
(
Dmp
.
MapKey
.
ISPUBLIC
.
getName
(),
true
));
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termQuery
(
Dmp
.
MapKey
.
STATUS
.
getName
(),
Dmp
.
DMPStatus
.
FINALISED
.
getValue
()));
}
if
(
criteria
.
getLike
()
!=
null
&&
!
criteria
.
getLike
().
isEmpty
())
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
queryStringQuery
(
criteria
.
getLike
()).
fields
(
Stream
.
of
(
new
Object
[][]{
{
Dmp
.
MapKey
.
LABEL
.
getName
(),
1.0f
},
{
Dmp
.
MapKey
.
DESCRIPTION
.
getName
(),
1.0f
}
}).
collect
(
Collectors
.
toMap
(
data
->
(
String
)
data
[
0
],
data
->
(
Float
)
data
[
1
]))));
}
if
(
criteria
.
getTemplates
()
!=
null
&&
criteria
.
getTemplates
().
size
()
>
0
)
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termsQuery
(
Dmp
.
MapKey
.
TEMPLATES
.
getName
()
+
".id.keyword"
,
criteria
.
getTemplates
().
stream
().
map
(
UUID:
:
toString
).
collect
(
Collectors
.
toList
())));
}
if
(
criteria
.
getStatus
()
!=
null
)
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termQuery
(
Dmp
.
MapKey
.
STATUS
.
getName
(),
criteria
.
getStatus
().
intValue
()));
}
if
(
criteria
.
getGroupIds
()
!=
null
&&
criteria
.
getGroupIds
().
size
()
>
0
)
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termsQuery
(
Dmp
.
MapKey
.
GROUPID
.
getName
(),
criteria
.
getGroupIds
().
stream
().
map
(
UUID:
:
toString
).
collect
(
Collectors
.
toList
())));
}
if
(
criteria
.
getGrants
()
!=
null
&&
criteria
.
getGrants
().
size
()
>
0
)
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termsQuery
(
Dmp
.
MapKey
.
GRANT
.
getName
()
+
".keyword"
,
criteria
.
getGrants
().
stream
().
map
(
UUID:
:
toString
).
collect
(
Collectors
.
toList
())));
}
if
(
criteria
.
getCollaborators
()
!=
null
&&
criteria
.
getCollaborators
().
size
()
>
0
)
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termsQuery
(
Dmp
.
MapKey
.
COLLABORATORS
.
getName
()
+
".id.keyword"
,
criteria
.
getCollaborators
().
stream
().
map
(
UUID:
:
toString
).
collect
(
Collectors
.
toList
())));
}
if
(
criteria
.
getRoles
()
!=
null
&&
criteria
.
getRoles
().
size
()
>
0
)
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termsQuery
(
Dmp
.
MapKey
.
COLLABORATORS
.
getName
()
+
".role.keyword"
,
criteria
.
getRoles
()));
}
if
(!
criteria
.
isAllowAllVersions
())
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termQuery
(
criteria
.
isPublic
()
?
Dmp
.
MapKey
.
LASTPUBLICVERSION
.
getName
()
:
Dmp
.
MapKey
.
LASTVERSION
.
getName
(),
true
));
}
if
(
criteria
.
getOrganizations
()
!=
null
&&
criteria
.
getOrganizations
().
size
()
>
0
)
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termsQuery
(
Dmp
.
MapKey
.
ORGANIZATIONS
.
getName
()
+
".id.keyword"
,
criteria
.
getOrganizations
().
stream
().
map
(
UUID:
:
toString
).
collect
(
Collectors
.
toList
())));
}
if
(
criteria
.
getGrantStatus
()
!=
null
)
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termQuery
(
Dmp
.
MapKey
.
GRANTSTATUS
.
getName
(),
criteria
.
getGrantStatus
()));
}
if
(
boolQuery
.
should
().
isEmpty
()
&&
boolQuery
.
mustNot
().
isEmpty
())
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
matchAllQuery
());
}
else
{
boolQuery
.
minimumShouldMatch
(
boolQuery
.
should
().
size
());
}
BoolQueryBuilder
boolQuery
=
createBoolQuery
(
criteria
);
if
(
criteria
.
getSortCriteria
()
!=
null
&&
!
criteria
.
getSortCriteria
().
isEmpty
())
{
criteria
.
getSortCriteria
().
forEach
(
sortCriteria
->
{
...
...
@@ -170,8 +118,8 @@ public class DmpRepository extends ElasticRepository<Dmp, DmpCriteria> {
});
}
searchSourceBuilder
.
query
(
boolQuery
).
from
(
criteria
.
getOffset
());
if
(
criteria
.
getSize
()
!=
null
)
{
searchSourceBuilder
.
query
(
boolQuery
).
from
(
criteria
.
getOffset
())
.
fetchSource
(
"id"
,
null
)
;
if
(
criteria
.
getSize
()
>
0
)
{
searchSourceBuilder
.
size
(
criteria
.
getSize
());
}
sortBuilders
.
forEach
(
searchSourceBuilder:
:
sort
);
...
...
@@ -182,65 +130,71 @@ public class DmpRepository extends ElasticRepository<Dmp, DmpCriteria> {
return
null
;
}
@Override
public
Long
count
(
DmpCriteria
criteria
)
throws
IOException
{
if
(
this
.
getClient
()
!=
null
)
{
CountRequest
countRequest
=
new
CountRequest
(
this
.
environment
.
getProperty
(
"elasticsearch.index"
));
BoolQueryBuilder
boolQuery
=
QueryBuilders
.
boolQuery
().
mustNot
(
QueryBuilders
.
termsQuery
(
Dmp
.
MapKey
.
STATUS
.
getName
(),
Collections
.
singletonList
(
Dmp
.
DMPStatus
.
DELETED
.
getValue
())));
if
(
criteria
.
isPublic
())
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termQuery
(
Dmp
.
MapKey
.
ISPUBLIC
.
getName
(),
true
));
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termQuery
(
Dmp
.
MapKey
.
STATUS
.
getName
(),
Dmp
.
DMPStatus
.
FINALISED
.
getValue
()));
}
if
(
criteria
.
getLike
()
!=
null
&&
!
criteria
.
getLike
().
isEmpty
())
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
queryStringQuery
(
criteria
.
getLike
()).
fields
(
Stream
.
of
(
new
Object
[][]{
{
Dmp
.
MapKey
.
LABEL
.
getName
(),
1.0f
},
{
Dmp
.
MapKey
.
DESCRIPTION
.
getName
(),
1.0f
}
}).
collect
(
Collectors
.
toMap
(
data
->
(
String
)
data
[
0
],
data
->
(
Float
)
data
[
1
]))));
}
BoolQueryBuilder
boolQuery
=
createBoolQuery
(
criteria
);
if
(
criteria
.
getTemplates
()
!=
null
&&
criteria
.
getTemplates
().
size
()
>
0
)
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termsQuery
(
Dmp
.
MapKey
.
TEMPLATES
.
getName
()
+
".id.keyword"
,
criteria
.
getTemplates
().
stream
().
map
(
UUID:
:
toString
).
collect
(
Collectors
.
toList
())));
}
countRequest
.
query
(
boolQuery
);
CountResponse
response
=
this
.
getClient
().
count
(
countRequest
,
RequestOptions
.
DEFAULT
);
return
response
.
getCount
();
}
return
null
;
}
if
(
criteria
.
getStatus
()
!=
null
)
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termQuery
(
Dmp
.
MapKey
.
STATUS
.
getName
(),
criteria
.
getStatus
().
intValue
()));
}
private
BoolQueryBuilder
createBoolQuery
(
DmpCriteria
criteria
)
{
BoolQueryBuilder
boolQuery
=
QueryBuilders
.
boolQuery
().
mustNot
(
QueryBuilders
.
termsQuery
(
Dmp
.
MapKey
.
STATUS
.
getName
(),
Collections
.
singletonList
(
Dmp
.
DMPStatus
.
DELETED
.
getValue
())));
if
(
criteria
.
isPublic
())
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termQuery
(
Dmp
.
MapKey
.
ISPUBLIC
.
getName
(),
true
));
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termQuery
(
Dmp
.
MapKey
.
STATUS
.
getName
(),
Dmp
.
DMPStatus
.
FINALISED
.
getValue
()));
}
if
(
criteria
.
getLike
()
!=
null
&&
!
criteria
.
getLike
().
isEmpty
())
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
queryStringQuery
(
criteria
.
getLike
()).
fields
(
Stream
.
of
(
new
Object
[][]{
{
Dmp
.
MapKey
.
LABEL
.
getName
(),
1.0f
},
{
Dmp
.
MapKey
.
DESCRIPTION
.
getName
(),
1.0f
}
}).
collect
(
Collectors
.
toMap
(
data
->
(
String
)
data
[
0
],
data
->
(
Float
)
data
[
1
]))));
}
if
(
criteria
.
get
GroupId
s
()
!=
null
&&
criteria
.
get
GroupId
s
().
size
()
>
0
)
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termsQuery
(
Dmp
.
MapKey
.
GROUPID
.
getName
(),
criteria
.
get
GroupId
s
().
stream
().
map
(
UUID:
:
toString
).
collect
(
Collectors
.
toList
())));
}
if
(
criteria
.
get
Template
s
()
!=
null
&&
criteria
.
get
Template
s
().
size
()
>
0
)
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termsQuery
(
Dmp
.
MapKey
.
TEMPLATES
.
getName
()
+
".id.keyword"
,
criteria
.
get
Template
s
().
stream
().
map
(
UUID:
:
toString
).
collect
(
Collectors
.
toList
())));
}
if
(
criteria
.
get
Grant
s
()
!=
null
&&
criteria
.
getGrants
().
size
()
>
0
)
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
term
s
Query
(
Dmp
.
MapKey
.
GRANT
.
getName
()
+
".keyword"
,
criteria
.
get
Grants
().
stream
().
map
(
UUID:
:
toString
).
collect
(
Collectors
.
toList
()
)));
}
if
(
criteria
.
get
Statu
s
()
!=
null
)
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termQuery
(
Dmp
.
MapKey
.
STATUS
.
getName
(),
criteria
.
get
Status
().
intValue
(
)));
}
if
(
criteria
.
get
Collaborator
s
()
!=
null
&&
criteria
.
get
Collaborator
s
().
size
()
>
0
)
{
boolQuery
=
boolQuery
.
should
(
QueryBuilders
.
termsQuery
(
Dmp
.
MapKey
.
COLLABORATORS
.
getName
()
+
".id.keyword"
,
criteria
.
get
Collaborator
s
().
stream
().
map
(
UUID:
:
toString
).
collect
(
Collectors
.
toList
())));
}