diff --git a/README.md b/README.md index f1b6bc0..875c2c4 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # CouchbaseLiteTester -###### version 1.5 +###### version 1.6 This app provides a UI to create a local Couchbase Lite DB and Sync Data to the DB from a Couchbase Sync Gateway. It provides features to search for documents in the CBLite DB, selectively sync certain channels and supports both Pull and Push replication. ## Getting Started @@ -88,6 +88,9 @@ mvn compile package This will create a distributable JAR file in build folder. Package an appropriate defaults.xml file along with your jar file with appropriate environments setup. ## Features +###### version 1.6 +* Minor enhancements and bug fixes +* Search displays matched doc counts ###### version 1.5 * Support to search documents (Advance Search) based on multiple keywords ###### version 1.4 diff --git a/src/main/java/io/amrishraje/cblitetester/AdvanceSearchController.java b/src/main/java/io/amrishraje/cblitetester/AdvanceSearchController.java index e7b7b36..ac33d51 100644 --- a/src/main/java/io/amrishraje/cblitetester/AdvanceSearchController.java +++ b/src/main/java/io/amrishraje/cblitetester/AdvanceSearchController.java @@ -1,9 +1,13 @@ package io.amrishraje.cblitetester; +import javafx.animation.KeyFrame; +import javafx.animation.Timeline; +import javafx.application.Platform; import javafx.collections.transformation.FilteredList; import javafx.event.ActionEvent; import javafx.scene.control.*; import javafx.stage.Stage; +import javafx.util.Duration; import org.ahocorasick.trie.Emit; import org.ahocorasick.trie.Trie; import org.slf4j.Logger; @@ -12,6 +16,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; public class AdvanceSearchController { @@ -38,9 +43,26 @@ public void searchDocuments(ActionEvent event) { filteredData = mainController.getFilteredData(); String lowerCaseFilter = searchTextBox.getText(); String[] searchList = lowerCaseFilter.split(";"); + AtomicInteger docCount = new AtomicInteger(); + Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(5), x -> mainController.docCountAnchorPane.setVisible(false))); filteredData.setPredicate(tableData -> { - return containsWordsAhoCorasick(tableData.getValue(), searchList, matchWholeWords.isSelected()); + if (containsWordsAhoCorasick(tableData.getValue(), searchList, matchWholeWords.isSelected())) { + docCount.getAndIncrement(); + return true; + } else return false; }); + mainController.docCountLabel.setText(docCount.toString() + " documents matched"); + mainController.docCountLabel.setVisible(true); + mainController.docCountLabel.setStyle("-fx-background: rgba(30,30,30);\n" + + " -fx-text-fill: white;\n" + + " -fx-background-color: rgba(30,30,30,0.8);\n" + + " -fx-background-radius: 6px;\n" + + " -fx-background-insets: 0;\n" + + " -fx-padding: 0.667em 0.75em 0.667em 0.75em; /* 10px */\n" + + " -fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.5) , 10, 0.0 , 0 , 3 );\n" + + " -fx-font-size: 0.85em;"); + mainController.docCountAnchorPane.setVisible(true); + Platform.runLater(timeline::play); Stage stage = (Stage) cancelButton.getScene().getWindow(); stage.close(); } diff --git a/src/main/java/io/amrishraje/cblitetester/MainController.java b/src/main/java/io/amrishraje/cblitetester/MainController.java index dadc80a..8667b7f 100644 --- a/src/main/java/io/amrishraje/cblitetester/MainController.java +++ b/src/main/java/io/amrishraje/cblitetester/MainController.java @@ -18,6 +18,8 @@ import com.couchbase.lite.CouchbaseLiteException; import com.google.gson.Gson; import com.google.gson.JsonObject; +import javafx.animation.KeyFrame; +import javafx.animation.Timeline; import javafx.application.Platform; import javafx.beans.property.SimpleStringProperty; import javafx.beans.value.ObservableValue; @@ -40,6 +42,7 @@ import javafx.scene.layout.AnchorPane; import javafx.stage.Stage; import javafx.util.Callback; +import javafx.util.Duration; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; @@ -58,9 +61,11 @@ import java.net.URL; import java.util.List; import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; public class MainController implements Initializable { private static final Logger logger = LoggerFactory.getLogger(MainController.class); + private final String version = "v1.6"; public Button syncButton; public TextField userText; public PasswordField pwdText; @@ -86,6 +91,8 @@ public class MainController implements Initializable { public ProgressBar progressBar; public Label progressText; public AnchorPane progressAnchorPane; + public Label docCountLabel; + public AnchorPane docCountAnchorPane; Properties properties = new Properties(); Properties defaults = new Properties(); @FXML @@ -196,6 +203,8 @@ public void initialize(URL url, ResourceBundle resourceBundle) { } }); replicationMode.setItems(FXCollections.observableArrayList("Pull", "Push", "Pull and Push")); + //Setup About + about.setText("CBLite Tester " + version + " by Amrish Raje" ); } @FXML @@ -492,6 +501,8 @@ public ObservableValue call(TableColumn.CellDataFeatures(items, p -> true); tableSearchText.textProperty().addListener((observable, oldValue, newValue) -> { + AtomicInteger docCount = new AtomicInteger(); + Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(5),x -> docCountAnchorPane.setVisible(false))); filteredData.setPredicate(tableData -> { // If filter text is empty, display all persons. if (newValue == null || newValue.isEmpty()) { @@ -500,10 +511,23 @@ public ObservableValue call(TableColumn.CellDataFeatures - + + + + + +