diff --git a/scraping.go b/scraping.go
index 67a2cd8..e5aa1cc 100644
--- a/scraping.go
+++ b/scraping.go
@@ -807,6 +807,21 @@ func getFilterResultConditionHigherThan(filter *Filter) {
}
}
+func getFilterResultUnique(filter *Filter) {
+ var valueMap map[string]bool
+ valueMap = make(map[string]bool)
+
+ for _, parent := range filter.Parents {
+ for _, result := range parent.Results {
+ valueMap[result] = true
+ }
+ }
+
+ for value, _ := range valueMap {
+ filter.Results = append(filter.Results, value)
+ }
+}
+
func notifyFilter(filters []Filter, filter *Filter, watch *Watch, web *Web, debug bool) {
haveResults := false
for _, parent := range filter.Parents {
diff --git a/scraping_test.go b/scraping_test.go
index f52f853..75f1462 100644
--- a/scraping_test.go
+++ b/scraping_test.go
@@ -1126,6 +1126,48 @@ func TestFilterHigherThan(t *testing.T) {
}
}
+func TestFilterUnique(t *testing.T) {
+ var tests = []struct {
+ Input []string
+ Want []string
+ }{
+ {[]string{"1"}, []string{"1"}},
+ {[]string{"1", "2"}, []string{"1", "2"}},
+ {[]string{"1", "2", "3", "4", "5", "6", "7", "8", "9", "1"}, []string{"1", "2", "3", "4", "5", "6", "7", "8", "9"}},
+ {[]string{"1", "1"}, []string{"1"}},
+ {[]string{}, []string{}},
+ }
+
+ for _, test := range tests {
+ testname := fmt.Sprintf("%s", test.Input)
+ t.Run(testname, func(t *testing.T) {
+ filter := Filter{
+ Parents: []*Filter{
+ {
+ Results: test.Input,
+ },
+ },
+ }
+ getFilterResultUnique(
+ &filter,
+ )
+ var wantMap map[string]bool
+ wantMap = make(map[string]bool)
+ for _, want := range test.Want {
+ wantMap[want] = true
+ }
+ var resultMap map[string]bool
+ resultMap = make(map[string]bool)
+ for _, result := range filter.Results {
+ resultMap[result] = true
+ }
+ if !reflect.DeepEqual(wantMap, resultMap) {
+ t.Errorf("Got %s, want %s", filter.Results, test.Want)
+ }
+ })
+ }
+}
+
func TestFilterLua(t *testing.T) {
passAll := `
for i,input in pairs(inputs) do
diff --git a/static/edit.js b/static/edit.js
index 4b311a2..b40d45c 100644
--- a/static/edit.js
+++ b/static/edit.js
@@ -409,6 +409,35 @@ function onTypeChange(node) {
var3Div.appendChild(var3Input);
break;
}
+ case "unique": {
+ console.log("TEST");
+ var var1Input = document.createElement("input");
+ var1Input.name = "var1";
+ var1Input.id = "var1Input";
+ var1Input.value = var1Value;
+ var1Input.classList.add("form-control");
+ var1Input.disabled = true;
+ var1Label.innerHTML = "-";
+ var1Input.placeholder = "";
+ var1Div.appendChild(var1Input);
+ var var2Input = document.createElement("input");
+ var2Input.name = "var2";
+ var2Input.id = "var2Input";
+ var2Input.value = var2Value;
+ var2Input.classList.add("form-control");
+ var2Input.disabled = true;
+ var2Label.innerHTML = "-";
+ var2Div.appendChild(var2Input);
+ var var3Input = document.createElement("input");
+ var3Input.name = "var3";
+ var3Input.id = "var3Input";
+ var3Input.value = var3Value;
+ var3Input.classList.add("form-control");
+ var3Input.disabled = true;
+ var3Label.innerHTML = "-";
+ var3Div.appendChild(var3Input);
+ break;
+ }
case "condition": {
var conditionSelect = document.createElement("select");
conditionSelect.name = "var1";
diff --git a/static/edit.ts b/static/edit.ts
index d8a54df..49f885b 100644
--- a/static/edit.ts
+++ b/static/edit.ts
@@ -400,6 +400,37 @@ function onTypeChange(node: DiagramNode | null = null){
var3Div.appendChild(var3Input);
break;
}
+ case "unique": {
+ console.log("TEST");
+ let var1Input = document.createElement("input");
+ var1Input.name = "var1";
+ var1Input.id = "var1Input";
+ var1Input.value = var1Value;
+ var1Input.classList.add("form-control")
+ var1Input.disabled = true;
+ var1Label.innerHTML = "-";
+ var1Input.placeholder = "";
+ var1Div.appendChild(var1Input);
+
+ let var2Input = document.createElement("input");
+ var2Input.name = "var2";
+ var2Input.id = "var2Input";
+ var2Input.value = var2Value;
+ var2Input.classList.add("form-control")
+ var2Input.disabled = true;
+ var2Label.innerHTML = "-";
+ var2Div.appendChild(var2Input);
+
+ let var3Input = document.createElement("input");
+ var3Input.name = "var3";
+ var3Input.id = "var3Input";
+ var3Input.value = var3Value;
+ var3Input.classList.add("form-control");
+ var3Input.disabled = true;
+ var3Label.innerHTML = "-";
+ var3Div.appendChild(var3Input);
+ break;
+ }
case "condition":{
let conditionSelect = document.createElement("select");
conditionSelect.name = "var1";
diff --git a/templates/watch/edit.html b/templates/watch/edit.html
index f22048e..a131fbf 100644
--- a/templates/watch/edit.html
+++ b/templates/watch/edit.html
@@ -79,6 +79,7 @@ GoWatch Edit {{ .Watch.Name }}
+
diff --git a/todo.md b/todo.md
index 4834f0c..7cf87c7 100644
--- a/todo.md
+++ b/todo.md
@@ -10,7 +10,6 @@
- trusted proxies in conf?
- log things to db for cron runs
- comments
-- add unique filter
- provide template/example watches?
- Amazon
- NewEgg