Skip to content

Commit

Permalink
Merge pull request #6 from gdi-be/search
Browse files Browse the repository at this point in the history
Introduces hibernate search
  • Loading branch information
KaiVolland authored Dec 17, 2024
2 parents dd59fd7 + 2f6e2ad commit 42e78a7
Show file tree
Hide file tree
Showing 8 changed files with 106 additions and 0 deletions.
2 changes: 2 additions & 0 deletions mde-importer/src/main/resources/hibernate.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
hibernate.search.backend.type=lucene
hibernate.search.backend.directory.root=../mde-docker/mde-backend/lucene/indices
10 changes: 10 additions & 0 deletions mde-services/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,16 @@
<artifactId>hypersistence-utils-hibernate-63</artifactId>
</dependency>

<!-- Hibernate Search -->
<dependency>
<groupId>org.hibernate.search</groupId>
<artifactId>hibernate-search-mapper-orm</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate.search</groupId>
<artifactId>hibernate-search-backend-lucene</artifactId>
</dependency>

<!-- Swagger -->
<dependency>
<groupId>org.springdoc</groupId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,62 @@

import de.terrestris.mde.mde_backend.model.IsoMetadata;
import de.terrestris.mde.mde_backend.service.IsoMetadataService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import lombok.extern.log4j.Log4j2;
import org.hibernate.search.engine.search.query.SearchResult;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.server.ResponseStatusException;

import java.util.List;

@Log4j2
@RestController
@RequestMapping("/metadata/iso")
public class IsoMetadataController extends BaseMetadataController<IsoMetadataService, IsoMetadata> {

@GetMapping(
path = "/search",
produces = {
"application/json"
}
)
@ResponseStatus(HttpStatus.OK)
@Operation(security = { @SecurityRequirement(name = "bearer-key") })
@ApiResponses(value = {
@ApiResponse(
responseCode = "200",
description = "Ok: The entity was successfully updated"
),
@ApiResponse(
responseCode = "500",
description = "Internal Server Error: Something internal went wrong while updating the entity"
)
})
public List<IsoMetadata> search(@RequestParam String searchTerm, @RequestParam(required = false) Integer offset, @RequestParam(required = false) Integer limit) {

log.trace("Search request for IsoMetadata with searchTerm: {}, offset: {}, limit: {}", searchTerm, offset, limit);
try {
SearchResult<IsoMetadata> result = this.service.search(searchTerm, offset, limit);
return result.hits();
} catch (Exception e) {
log.error("Error while searching for IsoMetadata with searchTerm: {}, offset: {}, limit: {}", searchTerm, offset, limit, e);

throw new ResponseStatusException(
HttpStatus.INTERNAL_SERVER_ERROR,
messageSource.getMessage(
"BaseController.INTERNAL_SERVER_ERROR",
null,
LocaleContextHolder.getLocale()
),
e
);
}
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import jakarta.persistence.*;
import lombok.*;
import org.hibernate.Hibernate;
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField;
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed;

import java.io.Serializable;
import java.math.BigInteger;
Expand All @@ -16,6 +18,7 @@
@AllArgsConstructor
@ToString
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
@Indexed
public abstract class BaseMetadata implements Serializable {

@Column(unique = true, nullable = false)
Expand All @@ -25,6 +28,7 @@ public abstract class BaseMetadata implements Serializable {

@Column
@Setter
@FullTextField(analyzer = "standard")
private String title;

@Column
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,14 @@
import jakarta.persistence.Table;
import lombok.*;
import org.hibernate.annotations.Type;
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed;

@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@Entity
@Table(name = "iso_metadata")
@Data
@Indexed
public class IsoMetadata extends BaseMetadata {

@Column
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,32 @@

import de.terrestris.mde.mde_backend.jpa.IsoMetadataRepository;
import de.terrestris.mde.mde_backend.model.IsoMetadata;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.hibernate.search.engine.search.query.SearchResult;
import org.hibernate.search.mapper.orm.Search;
import org.hibernate.search.mapper.orm.session.SearchSession;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class IsoMetadataService extends BaseMetadataService<IsoMetadataRepository, IsoMetadata> {

@PersistenceContext
private EntityManager entityManager;

// TODO: add security check
// @PostAuthorize("hasRole('ROLE_ADMIN') or hasPermission(returnObject.orElse(null), 'READ')")
@Transactional(readOnly = true)
public SearchResult<IsoMetadata> search(String searchTerm, Integer offset, Integer limit) {
SearchSession searchSession = Search.session(entityManager);

return searchSession.search(IsoMetadata.class)
.where(f -> f.simpleQueryString()
.fields("title")
// title is tokenized with standard analyzer so a wildcard prefix is not necessary
.matching(searchTerm + "*")
)
.fetch(offset, limit);
}
}
2 changes: 2 additions & 0 deletions mde-services/src/main/resources/hibernate.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
hibernate.search.backend.type=lucene
hibernate.search.backend.directory.root=/lucene/indices
13 changes: 13 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
<flyway.version>10.21.0</flyway.version>
<spring-boot.version>3.4.0</spring-boot.version>
<log4j.version>2.24.1</log4j.version>
<hibernate-search.version>7.2.2.Final</hibernate-search.version>
</properties>

<repositories>
Expand Down Expand Up @@ -331,6 +332,18 @@
</exclusion>
</exclusions>
</dependency>
<!-- Hibernate Search -->
<dependency>
<groupId>org.hibernate.search</groupId>
<artifactId>hibernate-search-mapper-orm</artifactId>
<version>${hibernate-search.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate.search</groupId>
<artifactId>hibernate-search-backend-lucene</artifactId>
<version>${hibernate-search.version}</version>
</dependency>

<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-admin-client</artifactId>
Expand Down

0 comments on commit 42e78a7

Please sign in to comment.