Skip to content

Commit

Permalink
add missing javadocs
Browse files Browse the repository at this point in the history
Signed-off-by: Kaushal Kumar <[email protected]>
  • Loading branch information
kaushalmahi12 committed Jan 7, 2025
1 parent 24420b4 commit 89f62cc
Show file tree
Hide file tree
Showing 3 changed files with 96 additions and 142 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,12 @@

import java.util.List;

/**
* Per attribute in memory storage structure for Rules
*/
public class RuleAttributeTrie implements FastPrefixMatchingStructure {
private static final String ALLOWED_ATTRIBUTE_VALUES = "^[a-zA-Z0-9-_]+\\*?$";
private static final int ATTRIBUTE_MAX_LENGTH = 100;
private TrieNode root;

/**
Expand All @@ -38,7 +42,7 @@ public void insert(String key, String value) {
}

private boolean isValidValue(String value) {
return value.matches(ALLOWED_ATTRIBUTE_VALUES);
return value.length() <= ATTRIBUTE_MAX_LENGTH && value.matches(ALLOWED_ATTRIBUTE_VALUES);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ public TrieInserter(TrieNode root, String key, String value) {

/**
* Performs the insertion operation.
* <ol>Method should handle 3 cases
* Method should handle 3 cases
* <ol>
* <li>Simple addition of new child </li>
* <li>insert splits a node</li>
* <li>inserted key is a prefix to existing key|s, this could either mark a node as endOfWord or it could also split the node</li>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,160 +9,109 @@
package org.opensearch.plugin.wlm.rule.structure;

import org.opensearch.test.OpenSearchTestCase;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

@RunWith(Suite.class)
@Suite.SuiteClasses({
FastPrefixMatchingStructureTests.InsertionTests.class,
FastPrefixMatchingStructureTests.SearchTests.class,
FastPrefixMatchingStructureTests.DeletionTests.class,
FastPrefixMatchingStructureTests.EdgeCaseTests.class })
public class FastPrefixMatchingStructureTests {

public static class BaseTest extends OpenSearchTestCase {
protected FastPrefixMatchingStructure trie;

public void setUp() throws Exception {
super.setUp();
trie = new RuleAttributeTrie();
}
public class FastPrefixMatchingStructureTests extends OpenSearchTestCase {
FastPrefixMatchingStructure trie;

public void setUp() throws Exception {
super.setUp();
trie = new RuleAttributeTrie();
trie.insert("apple", "fruit");
trie.insert("app", "application");
trie.insert("application", "software");
trie.insert("appreciate", "value");
trie.insert("book", "reading");
trie.insert("bookstore", "shop");
}

public void testInsertSinglePair() {
trie.insert("apple", "fruit");
assertEquals(Collections.singletonList("fruit"), trie.search("apple"));
}

public void testInsertMultiplePairs() {
trie.insert("apple", "fruit");
trie.insert("app", "application");
trie.insert("application", "software");

assertEquals(Collections.singletonList("fruit"), trie.search("apple"));
assertEquals(Collections.singletonList("application"), trie.search("app"));
assertEquals(Collections.singletonList("software"), trie.search("application"));
}

public static class InsertionTests extends BaseTest {
@Test
public void testInsertSinglePair() {
trie.insert("apple", "fruit");
assertEquals(Collections.singletonList("fruit"), trie.search("apple"));
}

@Test
public void testInsertMultiplePairs() {
trie.insert("apple", "fruit");
trie.insert("app", "application");
trie.insert("application", "software");

assertEquals(Collections.singletonList("fruit"), trie.search("apple"));
assertEquals(Collections.singletonList("application"), trie.search("app"));
assertEquals(Collections.singletonList("software"), trie.search("application"));
}

@Test
public void testOverwriteExistingKey() {
trie.insert("apple", "fruit");
trie.insert("apple", "company");
assertEquals(Collections.singletonList("company"), trie.search("apple"));
}

@Test
public void testInsertKeysWithCommonPrefixes() {
trie.insert("car", "vehicle");
trie.insert("cart", "shopping");
trie.insert("cartoon", "animation");

assertEquals(Collections.singletonList("vehicle"), trie.search("car"));
assertEquals(Collections.singletonList("shopping"), trie.search("cart"));
assertEquals(Collections.singletonList("animation"), trie.search("cartoon"));
}
public void testOverwriteExistingKey() {
trie.insert("apple", "fruit");
trie.insert("apple", "company");
assertEquals(Collections.singletonList("company"), trie.search("apple"));
}

public static class SearchTests extends BaseTest {

public void setUp() throws Exception {
super.setUp();
trie.insert("apple", "fruit");
trie.insert("app", "application");
trie.insert("application", "software");
trie.insert("appreciate", "value");
trie.insert("book", "reading");
trie.insert("bookstore", "shop");
}

@Test
public void testSearchExistingKeys() {
assertEquals(Collections.singletonList("fruit"), trie.search("apple"));
assertEquals(Collections.singletonList("application"), trie.search("app"));
assertEquals(Collections.singletonList("reading"), trie.search("book"));
}

@Test
public void testSearchNonExistingKeys() {
assertTrue(trie.search("cocktail").isEmpty());
assertTrue(trie.search("mock").isEmpty());
}

@Test
public void testSearchPartialKeys() {
List<String> result = trie.search("ap");
assertEquals(4, result.size());
assertTrue(result.containsAll(Arrays.asList("fruit", "application", "software", "value")));
}
public void testInsertKeysWithCommonPrefixes() {
trie.insert("car", "vehicle");
trie.insert("cart", "shopping");
trie.insert("cartoon", "animation");

assertEquals(Collections.singletonList("vehicle"), trie.search("car"));
assertEquals(Collections.singletonList("shopping"), trie.search("cart"));
assertEquals(Collections.singletonList("animation"), trie.search("cartoon"));
}

public static class DeletionTests extends BaseTest {

public void setUp() throws Exception {
super.setUp();
trie.insert("apple", "fruit");
trie.insert("app", "application");
trie.insert("application", "software");
trie.insert("appreciate", "value");
trie.insert("book", "reading");
trie.insert("bookstore", "shop");
}

@Test
public void testDeleteExistingKey() {
assertTrue(trie.delete("apple"));
assertTrue(trie.search("apple").isEmpty());
assertFalse(trie.search("app").isEmpty());
}

@Test
public void testDeleteNonExistingKey() {
assertFalse(trie.delete("appl"));
assertFalse(trie.search("apple").isEmpty());
}

@Test
public void testDeleteKeyAndVerifyPartialSearch() {
assertTrue(trie.delete("app"));
List<String> result = trie.search("ap");
assertEquals(3, result.size());
assertTrue(result.containsAll(Arrays.asList("fruit", "software", "value")));
}

@Test
public void testDeleteAllKeysWithCommonPrefix() {
assertTrue(trie.delete("apple"));
assertTrue(trie.delete("app"));
assertTrue(trie.delete("application"));
assertTrue(trie.delete("appreciate"));

assertTrue(trie.search("ap").isEmpty());
assertFalse(trie.search("book").isEmpty());
}
public void testSearchExistingKeys() {
assertEquals(Collections.singletonList("fruit"), trie.search("apple"));
assertEquals(Collections.singletonList("application"), trie.search("app"));
assertEquals(Collections.singletonList("reading"), trie.search("book"));
}

public static class EdgeCaseTests extends BaseTest {
public void testSearchNonExistingKeys() {
assertTrue(trie.search("cocktail").isEmpty());
assertTrue(trie.search("mock").isEmpty());
}

@Test
public void testInsertAndSearchEmptyString() {
trie.insert("", "empty");
assertEquals(Collections.singletonList("empty"), trie.search(""));
}
public void testSearchPartialKeys() {
List<String> result = trie.search("ap");
assertEquals(4, result.size());
assertTrue(result.containsAll(Arrays.asList("fruit", "application", "software", "value")));
}

public void testDeleteExistingKey() {
assertTrue(trie.delete("apple"));
assertTrue(trie.search("apple").isEmpty());
assertFalse(trie.search("app").isEmpty());
}

public void testDeleteNonExistingKey() {
assertFalse(trie.delete("appl"));
assertFalse(trie.search("apple").isEmpty());
}

public void testDeleteKeyAndVerifyPartialSearch() {
assertTrue(trie.delete("app"));
List<String> result = trie.search("ap");
assertEquals(3, result.size());
assertTrue(result.containsAll(Arrays.asList("fruit", "software", "value")));
}

public void testDeleteAllKeysWithCommonPrefix() {
assertTrue(trie.delete("apple"));
assertTrue(trie.delete("app"));
assertTrue(trie.delete("application"));
assertTrue(trie.delete("appreciate"));

assertTrue(trie.search("ap").isEmpty());
assertFalse(trie.search("book").isEmpty());
}

public void testInsertAndSearchEmptyString() {
trie.insert("", "empty");
assertEquals(Collections.singletonList("empty"), trie.search(""));
}

@Test
public void testDeleteEmptyString() {
trie.insert("", "empty");
assertTrue(trie.delete(""));
assertTrue(trie.search("").isEmpty());
}
public void testDeleteEmptyString() {
trie = new RuleAttributeTrie();
trie.insert("", "empty");
assertTrue(trie.delete(""));
assertTrue(trie.search("").isEmpty());
}
}

0 comments on commit 89f62cc

Please sign in to comment.