diff --git a/src/main/java/NTNU/IDATT1002/controllers/Search.java b/src/main/java/NTNU/IDATT1002/controllers/Search.java index 6a3724066afa4a28d9ae532887745db4fc16297a..edcf4974307c7d16ca7177b0eb7e9a0528f55fe3 100644 --- a/src/main/java/NTNU/IDATT1002/controllers/Search.java +++ b/src/main/java/NTNU/IDATT1002/controllers/Search.java @@ -1,6 +1,11 @@ package NTNU.IDATT1002.controllers; import NTNU.IDATT1002.App; +import NTNU.IDATT1002.models.Image; +import NTNU.IDATT1002.models.Tag; +import NTNU.IDATT1002.service.ImageService; +import NTNU.IDATT1002.service.TagService; +import NTNU.IDATT1002.utils.ImageUtil; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.fxml.Initializable; @@ -10,7 +15,6 @@ import javafx.scene.control.Button; import javafx.scene.control.ChoiceBox; import javafx.scene.control.ScrollPane; import javafx.scene.control.TextField; -import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.input.MouseEvent; import javafx.scene.layout.HBox; @@ -19,10 +23,17 @@ import javafx.scene.layout.VBox; import javafx.scene.text.Font; import javafx.scene.text.Text; +import javax.persistence.*; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaDelete; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.CriteriaUpdate; +import javax.persistence.metamodel.Metamodel; import java.io.IOException; import java.net.URL; import java.util.Arrays; import java.util.List; +import java.util.Map; import java.util.ResourceBundle; import java.util.stream.Collectors; @@ -48,6 +59,7 @@ public class Search implements Initializable { public VBox vBox; + /** * Method that writes the word that is searched for. * Also generates HBoxes with image title, tags... @@ -55,28 +67,30 @@ public class Search implements Initializable { * @param resources */ public void initialize(URL location, ResourceBundle resources) { - if (!App.ex.getSearchField().isEmpty()){ + if (!App.ex.getSearchField().isEmpty()){ search_result.setText(App.ex.getSearchField()); } - List<String> urls = Arrays.asList("@../../Images/placeholder-1920x1080.png", "@../../Images/party.jpg", "@../../Images/placeholderLogo.png", "@../../Images/placeholder-1920x1080.png", "@../../Images/placeholder-1920x1080.png"); - for(int i = 0; i < urls.size(); i++) { - HBox h = new HBox(); - h.setPrefHeight(300); - h.setPrefWidth(1920); - h.setAlignment(Pos.CENTER); - h.setStyle("-fx-background-color: #999999;"); - - Pane p = new Pane(); - p.setPrefWidth(1400); - p.setPrefHeight(300); - - ImageView iV = new ImageView(); - iV.setImage(new Image(urls.get(i))); - iV.setFitHeight(300); - iV.setFitWidth(500); - iV.pickOnBoundsProperty().setValue(true); - iV.setPreserveRatio(true); - iV.setOnMouseClicked(new EventHandler<MouseEvent>() { + + List<NTNU.IDATT1002.models.Image> images = new ImageService(App.ex.getEntityManager()).searchResult(App.ex.getSearchField()); + + for(int i = 0; i < images.size(); i++) { + HBox hBox = new HBox(); + hBox.setPrefHeight(300); + hBox.setPrefWidth(1920); + hBox.setAlignment(Pos.CENTER); + hBox.setStyle("-fx-background-color: #999999;"); + + Pane pane = new Pane(); + pane.setPrefWidth(1400); + pane.setPrefHeight(300); + + ImageView imageView = new ImageView(); + imageView.setImage(ImageUtil.convertToFXImage(images.get(i))); + imageView.setFitHeight(300); + imageView.setFitWidth(500); + imageView.pickOnBoundsProperty().setValue(true); + imageView.setPreserveRatio(true); + imageView.setOnMouseClicked(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent e) { try{ switchToPicture(e); @@ -89,31 +103,53 @@ public class Search implements Initializable { Text title = setText("TITLE:", 550, 66, 153, "System Bold", 48); Text tag = setText("TAG:", 550, 97, 70, "System Bold", 24); Text desc = setText("DESCRIPTION:", 550, 126, 129, "System Bold", 18); - Text title_Field = setText(urls.get(i), 700, 66, "System Bold", 48); - Text tag_Field = setText("####", 700, 97, "System Bold", 24); - Text desc_Field = setText("####", 700, 126, "System Bold", 18); - - p.getChildren().addAll(iV, title, tag, desc, title_Field, tag_Field, desc_Field); - h.getChildren().add(p); - vBox.getChildren().add(h); + Text title_Field = setText("SKAL BILDENE HA TITTEL?", 700, 66, "System Bold", 48); + String tagsString = TagService.getTagsAsString(images.get(i).getTags()); + Text tag_Field = setText(tagsString, 700, 97, "System Bold", 24); + Text metadata_Field = setText(images.get(i).getMetadata().toString(), 700, 126, "System Bold", 18); + + pane.getChildren().addAll(imageView, title, tag, desc, title_Field, tag_Field, metadata_Field); + hBox.getChildren().add(pane); + vBox.getChildren().add(hBox); } } - public Text setText(String text, int layoutX, int layoutY, double wrappingWidth, String fontName, double fontSize){ - Text t = new Text(text); - t.setLayoutX(layoutX); - t.setLayoutY(layoutY); - t.setWrappingWidth(wrappingWidth); - t.setFont(Font.font(fontName, fontSize)); - return t; + /** + * Method that takes in a string of text and returns a text object + * @param textIn + * @param layoutX + * @param layoutY + * @param wrappingWidth + * @param fontName + * @param fontSize + * @return + */ + + public Text setText(String textIn, int layoutX, int layoutY, double wrappingWidth, String fontName, double fontSize){ + Text text = new Text(textIn); + text.setLayoutX(layoutX); + text.setLayoutY(layoutY); + text.setWrappingWidth(wrappingWidth); + text.setFont(Font.font(fontName, fontSize)); + return text; } - public Text setText(String text, int layoutX, int layoutY, String fontName, double fontSize){ - Text t = new Text(text); - t.setLayoutX(layoutX); - t.setLayoutY(layoutY); - t.setFont(Font.font(fontName, fontSize)); - return t; + /** + * Alternative setText method without wrappingWidth + * @param textIn + * @param layoutX + * @param layoutY + * @param fontName + * @param fontSize + * @return + */ + + public Text setText(String textIn, int layoutX, int layoutY, String fontName, double fontSize){ + Text text = new Text(textIn); + text.setLayoutX(layoutX); + text.setLayoutY(layoutY); + text.setFont(Font.font(fontName, fontSize)); + return text; } /** diff --git a/src/main/java/NTNU/IDATT1002/models/Album.java b/src/main/java/NTNU/IDATT1002/models/Album.java index 5e4ef33ec67685057e1be160ad37e3863aeea0d6..c4bedb9edb4a3d221e9752b9015cd617e321abe5 100644 --- a/src/main/java/NTNU/IDATT1002/models/Album.java +++ b/src/main/java/NTNU/IDATT1002/models/Album.java @@ -22,7 +22,13 @@ import java.util.stream.Collectors; @Table(name = "album") @NamedQueries({ @NamedQuery(name="Album.findAllByUsername", - query = "SELECT ia from Album ia WHERE ia.user.username = :username") + query = "SELECT ia from Album ia WHERE ia.user.username = :username"), + @NamedQuery(name="Album.findByTags", + query = "SELECT ia from Album ia " + + "join ia.tags tg " + + "where tg.name = :name"), + @NamedQuery(name="Image.findByTitle", + query = "SELECT ia from Album ia WHERE ia.title = :title") }) public class Album { diff --git a/src/main/java/NTNU/IDATT1002/models/Image.java b/src/main/java/NTNU/IDATT1002/models/Image.java index c038a21f67ed5f0a3105b57a70b1351e82b1ba8d..bdad3e7d89b8a23da6bf4f82ca76f69149b3d3b2 100644 --- a/src/main/java/NTNU/IDATT1002/models/Image.java +++ b/src/main/java/NTNU/IDATT1002/models/Image.java @@ -17,7 +17,11 @@ import java.util.stream.Collectors; @Table(name = "image") @NamedQueries({ @NamedQuery(name="Image.findAllByUsername", - query = "SELECT ia from Image ia WHERE ia.user.username = :username") + query = "SELECT ia from Image ia WHERE ia.user.username = :username"), + @NamedQuery(name="Image.findByTags", + query = "SELECT im from Image im " + + "join im.tags tg " + + "where tg.name = :name") }) public class Image { diff --git a/src/main/java/NTNU/IDATT1002/repository/ImageRepository.java b/src/main/java/NTNU/IDATT1002/repository/ImageRepository.java index e432488be4c9b032935e159c77b4f611d8f2c202..857ab938b69df531317aa45c85e663e1abd10cad 100644 --- a/src/main/java/NTNU/IDATT1002/repository/ImageRepository.java +++ b/src/main/java/NTNU/IDATT1002/repository/ImageRepository.java @@ -1,9 +1,11 @@ package NTNU.IDATT1002.repository; +import NTNU.IDATT1002.App; import NTNU.IDATT1002.models.Image; import javax.persistence.EntityManager; +import javax.persistence.TypedQuery; import java.util.List; @@ -23,6 +25,7 @@ public class ImageRepository extends AbstractRepository<Image, Long> { * Mapping to @NamedQuery 'find all albums by users username' defined in {@link Image} */ public static final String IMAGE_FIND_BY_USERNAME = "Image.findAllByUsername"; + public static final String IMAGE_FIND_BY_TAG = "Image.findByTags"; /** * Constructor to inject {@link EntityManager} dependency. @@ -45,6 +48,13 @@ public class ImageRepository extends AbstractRepository<Image, Long> { .setParameter("username", username) .getResultList(); } + + public List<Image> findAllByTags(String tag){ + return entityManager.createNamedQuery(IMAGE_FIND_BY_TAG, Image.class) + .setParameter("name",tag) + .getResultList(); + } + } diff --git a/src/main/java/NTNU/IDATT1002/service/ImageService.java b/src/main/java/NTNU/IDATT1002/service/ImageService.java index ca328babb21ab4ba13fff3e9c6da2bcb15f47cb8..54f2db5731cc7bbaa5a395800e7076c2203f107e 100644 --- a/src/main/java/NTNU/IDATT1002/service/ImageService.java +++ b/src/main/java/NTNU/IDATT1002/service/ImageService.java @@ -98,4 +98,30 @@ public class ImageService { .collect(Collectors.toList()); } + /** + * Searches images by tags and username, and merges the two list into one with all images + * uses removeDuplicates list to return a list with no duplicate images + * @param query + * @return a list with no duplicate images + */ + + public List<Image> searchResult(String query){ + List<Image> allFound = new ArrayList<>(); + List<Image> byTags = imageRepository.findAllByTags(query); + List<Image> byUsername = imageRepository.findAllByUsername(query); + allFound.addAll(byTags); + allFound.addAll(byUsername); + return removeDuplicates(allFound); + } + + + /** + * takes a list and removes all duplicate elements + * @param images + * @return list without duplicates + */ + + public List<Image> removeDuplicates(List<Image> images){ + return images.stream().distinct().collect(Collectors.toList()); + } }