added condition filter type

This commit is contained in:
BroodjeAap 2022-09-30 14:22:37 +00:00
parent 5a0e6c0e43
commit aab64cc59b
4 changed files with 467 additions and 3 deletions

View file

@ -107,6 +107,39 @@ func getFilterResult(filter *Filter, db *gorm.DB) {
{ {
storeFilterResult(filter, db) storeFilterResult(filter, db)
} }
case filter.Type == "condition":
{
switch filter.Var1 {
case "diff":
{
getFilterResultConditionDiff(filter, db)
}
case "lowerl":
{
getFilterResultConditionLowerLast(filter, db)
}
case "lowest":
{
getFilterResultConditionLowest(filter, db)
}
case "lowert":
{
getFilterResultConditionLowerThan(filter, db)
}
case "higherl":
{
getFilterResultConditionHigherLast(filter, db)
}
case "highest":
{
getFilterResultConditionHighest(filter, db)
}
case "highert":
{
getFilterResultConditionHigherThan(filter, db)
}
}
}
default: default:
log.Println("getFilterResult called with filter.Type == ", filter.Type) log.Println("getFilterResult called with filter.Type == ", filter.Type)
} }
@ -394,9 +427,10 @@ func getFilterResultRound(filter *Filter) {
func storeFilterResult(filter *Filter, db *gorm.DB) { func storeFilterResult(filter *Filter, db *gorm.DB) {
var previousOutput FilterOutput var previousOutput FilterOutput
db.Model(&FilterOutput{}).Order("time desc").Limit(1).Find(&previousOutput, "watch_id = ? AND name = ?", filter.WatchID, filter.Name) db.Model(&FilterOutput{}).Order("time desc").Where("watch_id = ? AND name = ?", filter.WatchID, filter.Name).Limit(1).Find(&previousOutput)
for _, parent := range filter.Parents { for _, parent := range filter.Parents {
for _, result := range parent.Results { for _, result := range parent.Results {
log.Println(previousOutput)
if previousOutput.WatchID == 0 { if previousOutput.WatchID == 0 {
previousOutput.Name = filter.Name previousOutput.Name = filter.Name
previousOutput.Time = time.Now() previousOutput.Time = time.Now()
@ -412,3 +446,185 @@ func storeFilterResult(filter *Filter, db *gorm.DB) {
} }
} }
} }
func getFilterResultConditionDiff(filter *Filter, db *gorm.DB) {
var previousOutput FilterOutput
db.Model(&FilterOutput{}).Order("time desc").Where("watch_id = ? AND name = ?", filter.WatchID, filter.Name).Limit(1).Find(&previousOutput)
for _, parent := range filter.Parents {
for _, result := range parent.Results {
if previousOutput.WatchID == 0 {
filter.Results = append(filter.Results, result)
} else if previousOutput.Value != result {
filter.Results = append(filter.Results, result)
}
}
}
}
func getFilterResultConditionLowerLast(filter *Filter, db *gorm.DB) {
var previousOutput FilterOutput
db.Model(&FilterOutput{}).Order("time desc").Where("watch_id = ? AND name = ?", filter.WatchID, filter.Name).Limit(1).Find(&previousOutput)
for _, parent := range filter.Parents {
for _, result := range parent.Results {
if previousOutput.WatchID == 0 {
filter.Results = append(filter.Results, result)
} else {
lastValue, err := strconv.ParseFloat(previousOutput.Value, 64)
if err != nil {
log.Println("Could not convert previous value to number:", previousOutput.Value)
continue
}
number, err := strconv.ParseFloat(result, 64)
if err != nil {
log.Println("Could not convert new value to number:", result)
continue
}
if number < lastValue {
filter.Results = append(filter.Results, result)
}
}
}
}
}
func getFilterResultConditionLowest(filter *Filter, db *gorm.DB) {
var previousOutputs []FilterOutput
db.Model(&FilterOutput{}).Where("watch_id = ? AND name = ?", filter.WatchID, filter.Name).Find(&previousOutputs)
lowest := math.MaxFloat64
if previousOutputs != nil {
for _, previousOutput := range previousOutputs {
number, err := strconv.ParseFloat(previousOutput.Value, 64)
if err != nil {
log.Println("Could not convert result to number:", previousOutput.Value)
continue
}
if number < lowest {
lowest = number
}
}
return
}
for _, parent := range filter.Parents {
for _, result := range parent.Results {
number, err := strconv.ParseFloat(result, 64)
if err != nil {
log.Println("Could not convert result to number:", result)
continue
}
if number < lowest {
filter.Results = append(filter.Results, result)
}
}
}
}
func getFilterResultConditionLowerThan(filter *Filter, db *gorm.DB) {
if filter.Var2 == nil {
log.Println("No threshold given for Lower Than Filter")
return
}
threshold, err := strconv.ParseFloat(*filter.Var2, 64)
if err != nil {
log.Println("Could not convert convert threshold to number:", *filter.Var2)
return
}
for _, parent := range filter.Parents {
for _, result := range parent.Results {
number, err := strconv.ParseFloat(result, 64)
if err != nil {
log.Println("Could not convert new value to number:", result)
continue
}
if number < threshold {
filter.Results = append(filter.Results, result)
}
}
}
}
func getFilterResultConditionHigherLast(filter *Filter, db *gorm.DB) {
var previousOutput FilterOutput
db.Model(&FilterOutput{}).Order("time desc").Where("watch_id = ? AND name = ?", filter.WatchID, filter.Name).Limit(1).Find(&previousOutput)
for _, parent := range filter.Parents {
for _, result := range parent.Results {
if previousOutput.WatchID == 0 {
filter.Results = append(filter.Results, result)
} else {
lastValue, err := strconv.ParseFloat(previousOutput.Value, 64)
if err != nil {
log.Println("Could not convert previous value to number:", previousOutput.Value)
continue
}
number, err := strconv.ParseFloat(result, 64)
if err != nil {
log.Println("Could not convert new value to number:", result)
continue
}
if number > lastValue {
filter.Results = append(filter.Results, result)
}
}
}
}
}
func getFilterResultConditionHighest(filter *Filter, db *gorm.DB) {
var previousOutputs []FilterOutput
db.Model(&FilterOutput{}).Where("watch_id = ? AND name = ?", filter.WatchID, filter.Name).Find(&previousOutputs)
highest := math.MaxFloat64
if previousOutputs != nil {
for _, previousOutput := range previousOutputs {
number, err := strconv.ParseFloat(previousOutput.Value, 64)
if err != nil {
log.Println("Could not convert result to number:", previousOutput.Value)
continue
}
if number > highest {
highest = number
}
}
return
}
for _, parent := range filter.Parents {
for _, result := range parent.Results {
number, err := strconv.ParseFloat(result, 64)
if err != nil {
log.Println("Could not convert result to number:", result)
continue
}
if number > highest {
filter.Results = append(filter.Results, result)
}
}
}
}
func getFilterResultConditionHigherThan(filter *Filter, db *gorm.DB) {
if filter.Var2 == nil {
log.Println("No threshold given for Higher Than Filter")
return
}
threshold, err := strconv.ParseFloat(*filter.Var2, 64)
if err != nil {
log.Println("Could not convert convert threshold to number:", *filter.Var2)
return
}
for _, parent := range filter.Parents {
for _, result := range parent.Results {
number, err := strconv.ParseFloat(result, 64)
if err != nil {
log.Println("Could not convert new value to number:", result)
continue
}
if number > threshold {
filter.Results = append(filter.Results, result)
}
}
}
}
func notifyFilter(filter *Filter, db *gorm.DB) {
}

View file

@ -367,6 +367,87 @@ function onTypeChange(node) {
var3Input.disabled = true; var3Input.disabled = true;
var3Label.innerHTML = "-"; var3Label.innerHTML = "-";
var3Div.appendChild(var3Input); var3Div.appendChild(var3Input);
break;
}
case "condition": {
var conditionSelect = document.createElement("select");
conditionSelect.name = "var1";
conditionSelect.id = "var1Input";
conditionSelect.classList.add("form-control");
var differentThenLast = document.createElement("option");
differentThenLast.value = "diff";
differentThenLast.innerHTML = "Different Then Last";
conditionSelect.appendChild(differentThenLast);
var lowerThenLast = document.createElement("option");
lowerThenLast.value = "lowerl";
lowerThenLast.innerHTML = "Lower Then Last";
conditionSelect.appendChild(lowerThenLast);
var lowestEver = document.createElement("option");
lowestEver.value = "lowest";
lowestEver.innerHTML = "Lowest Ever";
conditionSelect.appendChild(lowestEver);
var lowerThan = document.createElement("option");
lowerThan.value = "lowert";
lowerThan.innerHTML = "Lower Than";
conditionSelect.appendChild(lowerThan);
var higherThenLast = document.createElement("option");
higherThenLast.value = "higherl";
higherThenLast.innerHTML = "Higher Then Last";
conditionSelect.appendChild(higherThenLast);
var highestEver = document.createElement("option");
highestEver.value = "highest";
highestEver.innerHTML = "Highest Ever";
conditionSelect.appendChild(highestEver);
var higherThan = document.createElement("option");
higherThan.value = "highert";
higherThan.innerHTML = "Higher Than";
conditionSelect.appendChild(higherThan);
conditionSelect.onchange = function () { onConditionChange(node); };
var1Div.appendChild(conditionSelect);
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 "notify": {
var var1Input = document.createElement("textarea");
var1Input.name = "var1";
var1Input.id = "var1Input";
var1Input.value = var1Value;
var1Input.classList.add("form-control");
var1Label.innerHTML = "Template";
var1Input.placeholder = "{{ .Watch.Name }} new lowest price: {{ Price }}!";
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;
} }
} }
} }
@ -399,8 +480,47 @@ function onMathChange(node) {
var2Label.innerHTML = "-"; var2Label.innerHTML = "-";
} }
} }
function onConditionChange(node) {
if (node === void 0) { node = null; }
var var1Input = document.getElementById("var1Input");
var var1Label = document.getElementById("var1Label");
var var2Input = document.getElementById("var2Input");
var var2Label = document.getElementById("var2Label");
var var3Input = document.getElementById("var3Input");
var var3Label = document.getElementById("var3Label");
var var2Value = "";
var var3Value = "";
if (node != null) {
// @ts-ignore
var2Value = node.meta.var2;
// @ts-ignore
var3Value = node.meta.var3;
}
switch (var1Input.value) {
case "lowert": {
var2Input.disabled = false;
var2Input.type = "number";
var2Input.value = var2Value;
var2Label.innerHTML = "Threshold";
break;
}
case "highert": {
var2Input.disabled = false;
var2Input.type = "number";
var2Input.value = var2Value;
var2Label.innerHTML = "Threshold";
break;
}
default: {
var2Input.disabled = true;
var2Input.type = "text";
var2Input.value = var2Value;
var2Label.innerHTML = "-";
break;
}
}
}
function onSubmitNewFilter() { function onSubmitNewFilter() {
console.log("TEST");
var nameInput = document.getElementById("nameInput"); var nameInput = document.getElementById("nameInput");
var name = nameInput.value; var name = nameInput.value;
var selectType = document.getElementById("typeInput"); var selectType = document.getElementById("typeInput");

View file

@ -358,6 +358,91 @@ function onTypeChange(node: DiagramNode | null = null){
var3Input.disabled = true; var3Input.disabled = true;
var3Label.innerHTML = "-"; var3Label.innerHTML = "-";
var3Div.appendChild(var3Input); var3Div.appendChild(var3Input);
break;
}
case "condition":{
let conditionSelect = document.createElement("select");
conditionSelect.name = "var1";
conditionSelect.id = "var1Input";
conditionSelect.classList.add("form-control");
let differentThenLast = document.createElement("option");
differentThenLast.value = "diff"
differentThenLast.innerHTML = "Different Then Last";
conditionSelect.appendChild(differentThenLast);
let lowerThenLast = document.createElement("option");
lowerThenLast.value = "lowerl"
lowerThenLast.innerHTML = "Lower Then Last";
conditionSelect.appendChild(lowerThenLast);
let lowestEver = document.createElement("option");
lowestEver.value = "lowest"
lowestEver.innerHTML = "Lowest Ever";
conditionSelect.appendChild(lowestEver);
let lowerThan = document.createElement("option");
lowerThan.value = "lowert"
lowerThan.innerHTML = "Lower Than";
conditionSelect.appendChild(lowerThan);
let higherThenLast = document.createElement("option");
higherThenLast.value = "higherl"
higherThenLast.innerHTML = "Higher Then Last";
conditionSelect.appendChild(higherThenLast);
let highestEver = document.createElement("option");
highestEver.value = "highest"
highestEver.innerHTML = "Highest Ever";
conditionSelect.appendChild(highestEver);
let higherThan = document.createElement("option");
higherThan.value = "highert"
higherThan.innerHTML = "Higher Than";
conditionSelect.appendChild(higherThan);
conditionSelect.onchange = function() {onConditionChange(node)}
var1Div.appendChild(conditionSelect);
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 "notify":{
let var1Input = document.createElement("textarea");
var1Input.name = "var1";
var1Input.id = "var1Input";
var1Input.value = var1Value;
var1Input.classList.add("form-control")
var1Label.innerHTML = "Template";
var1Input.placeholder = "{{ .Watch.Name }} new lowest price: {{ Price }}!";
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;
} }
} }
} }
@ -393,8 +478,49 @@ function onMathChange(node: DiagramNode | null = null){
} }
} }
function onConditionChange(node: DiagramNode | null = null){
let var1Input = document.getElementById("var1Input") as HTMLSelectElement;
let var1Label = document.getElementById("var1Label") as HTMLLabelElement;
let var2Input = document.getElementById("var2Input") as HTMLInputElement;
let var2Label = document.getElementById("var2Label") as HTMLLabelElement;
let var3Input = document.getElementById("var3Input") as HTMLInputElement;
let var3Label = document.getElementById("var3Label") as HTMLLabelElement;
let var2Value = "";
let var3Value = "";
if (node != null){
// @ts-ignore
var2Value = node.meta.var2;
// @ts-ignore
var3Value = node.meta.var3;
}
switch(var1Input.value) {
case "lowert": {
var2Input.disabled = false;
var2Input.type = "number";
var2Input.value = var2Value;
var2Label.innerHTML = "Threshold";
break;
}
case "highert": {
var2Input.disabled = false;
var2Input.type = "number";
var2Input.value = var2Value;
var2Label.innerHTML = "Threshold";
break;
}
default: {
var2Input.disabled = true;
var2Input.type = "text";
var2Input.value = var2Value;
var2Label.innerHTML = "-";
break;
}
}
}
function onSubmitNewFilter(){ function onSubmitNewFilter(){
console.log("TEST")
let nameInput = document.getElementById("nameInput") as HTMLInputElement; let nameInput = document.getElementById("nameInput") as HTMLInputElement;
let name = nameInput.value; let name = nameInput.value;
let selectType = document.getElementById("typeInput") as HTMLSelectElement; let selectType = document.getElementById("typeInput") as HTMLSelectElement;

View file

@ -46,6 +46,8 @@
<option value="substring">Substring</option> <option value="substring">Substring</option>
<option value="math">Math</option> <option value="math">Math</option>
<option value="store">Store</option> <option value="store">Store</option>
<option value="condition">Condition</option>
<option value="notify">Notify</option>
</select> </select>
</div> </div>