mirror of
https://github.com/metabarcoding/obitools4.git
synced 2025-12-08 16:50:27 +00:00
A first version of obigrep. Normally fully functionnal, but not fully tested
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user