A first version of obigrep. Normally fully functionnal, but not fully tested

This commit is contained in:
2022-02-25 07:29:52 +01:00
parent 0a36447e2a
commit 011898bd9d
11 changed files with 709 additions and 772 deletions

View File

@@ -2,6 +2,9 @@ package obiseq
import (
"context"
"fmt"
"regexp"
log "github.com/sirupsen/logrus"
"github.com/PaesslerAG/gval"
@@ -10,37 +13,55 @@ import (
type SequencePredicate func(*BioSequence) bool
func (predicate1 SequencePredicate) And(predicate2 SequencePredicate) SequencePredicate {
f := func(sequence *BioSequence) bool {
return predicate1(sequence) && predicate2(sequence)
switch {
case predicate1 == nil:
return predicate2
case predicate2 == nil:
return predicate1
default:
return func(sequence *BioSequence) bool {
return predicate1(sequence) && predicate2(sequence)
}
}
return f
}
func (predicate1 SequencePredicate) Or(predicate2 SequencePredicate) SequencePredicate {
f := func(sequence *BioSequence) bool {
return predicate1(sequence) || predicate2(sequence)
switch {
case predicate1 == nil:
return predicate2
case predicate2 == nil:
return predicate1
default:
return func(sequence *BioSequence) bool {
return predicate1(sequence) || predicate2(sequence)
}
}
return f
}
func (predicate1 SequencePredicate) Xor(predicate2 SequencePredicate) SequencePredicate {
f := func(sequence *BioSequence) bool {
p1 := predicate1(sequence)
p2 := predicate2(sequence)
return (p1 && !p2) || (p2 && !p1)
switch {
case predicate1 == nil:
return predicate2
case predicate2 == nil:
return predicate1
default:
return func(sequence *BioSequence) bool {
p1 := predicate1(sequence)
p2 := predicate2(sequence)
return (p1 && !p2) || (p2 && !p1)
}
}
return f
}
func (predicate1 SequencePredicate) Not() SequencePredicate {
f := func(sequence *BioSequence) bool {
return !predicate1(sequence)
switch {
case predicate1 == nil:
return nil
default:
return func(sequence *BioSequence) bool {
return !predicate1(sequence)
}
}
return f
}
func HasAttribute(name string) SequencePredicate {
@@ -57,9 +78,43 @@ func HasAttribute(name string) SequencePredicate {
return f
}
func MoreAbundantThan(count int) SequencePredicate {
func IsAttributeMatch(name string, pattern string) SequencePredicate {
pat, err := regexp.Compile(pattern)
if err != nil {
log.Fatalf("error in atribute %s regular pattern syntax : %v", name, err)
}
f := func(sequence *BioSequence) bool {
return sequence.Count() > count
if sequence.HasAnnotation() {
val, ok := (sequence.Annotations())[name]
if ok {
switch val := val.(type) {
case string:
return pat.MatchString(val)
default:
return pat.MatchString(fmt.Sprint(val))
}
}
}
return false
}
return f
}
func IsMoreAbundantOrEqualTo(count int) SequencePredicate {
f := func(sequence *BioSequence) bool {
return sequence.Count() >= count
}
return f
}
func IsLessAbundantOrEqualTo(count int) SequencePredicate {
f := func(sequence *BioSequence) bool {
return sequence.Count() <= count
}
return f
@@ -81,7 +136,64 @@ func IsShorterOrEqualTo(length int) SequencePredicate {
return f
}
func ExrpessionPredicat(expression string) SequencePredicate {
func IsSequenceMatch(pattern string) SequencePredicate {
pat, err := regexp.Compile("(?i)" + pattern)
if err != nil {
log.Fatalf("error in sequence regular pattern syntax : %v", err)
}
f := func(sequence *BioSequence) bool {
return pat.Match(sequence.Sequence())
}
return f
}
func IsDefinitionMatch(pattern string) SequencePredicate {
pat, err := regexp.Compile(pattern)
if err != nil {
log.Fatalf("error in definition regular pattern syntax : %v", err)
}
f := func(sequence *BioSequence) bool {
return pat.MatchString(sequence.Definition())
}
return f
}
func IsIdMatch(pattern string) SequencePredicate {
pat, err := regexp.Compile(pattern)
if err != nil {
log.Fatalf("error in identifier regular pattern syntax : %v", err)
}
f := func(sequence *BioSequence) bool {
return pat.MatchString(sequence.Id())
}
return f
}
func IsIdIn(ids ...string) SequencePredicate {
idset := make(map[string]bool)
for _, v := range ids {
idset[v] = true
}
f := func(sequence *BioSequence) bool {
_, ok := idset[sequence.Id()]
return ok
}
return f
}
func ExpressionPredicat(expression string) SequencePredicate {
exp, err := gval.Full().NewEvaluable(expression)