Add String() method for queries.

This commit is contained in:
Andrey Smirnov
2014-07-15 21:49:30 +04:00
parent 56d777af0a
commit 238bdfad96

View File

@@ -1,8 +1,10 @@
package deb
import (
"fmt"
"path/filepath"
"regexp"
"strings"
)
// PackageQuery is interface of predicate on Package
@@ -13,6 +15,8 @@ type PackageQuery interface {
Fast() bool
// Query performs search on package list
Query(list *PackageList) *PackageList
// String interface
String() string
}
// OrQuery is L | R
@@ -35,7 +39,7 @@ type FieldQuery struct {
Field string
Relation int
Value string
Regexp *regexp.Regexp
Regexp *regexp.Regexp `codec:"-"`
}
// PkgQuery is search request against specific package
@@ -71,6 +75,11 @@ func (q *OrQuery) Query(list *PackageList) (result *PackageList) {
return
}
// String interface
func (q *OrQuery) String() string {
return fmt.Sprintf("(%s) | (%s)", q.L, q.R)
}
// Matches if both of L, R matches
func (q *AndQuery) Matches(pkg *Package) bool {
return q.L.Matches(pkg) && q.R.Matches(pkg)
@@ -97,6 +106,11 @@ func (q *AndQuery) Query(list *PackageList) (result *PackageList) {
return
}
// String interface
func (q *AndQuery) String() string {
return fmt.Sprintf("(%s), (%s)", q.L, q.R)
}
// Matches if not matches
func (q *NotQuery) Matches(pkg *Package) bool {
return !q.Q.Matches(pkg)
@@ -113,6 +127,11 @@ func (q *NotQuery) Query(list *PackageList) (result *PackageList) {
return
}
// String interface
func (q *NotQuery) String() string {
return fmt.Sprintf("!(%s)", q.Q)
}
// Matches on generic field
func (q *FieldQuery) Matches(pkg *Package) bool {
if q.Field == "$Version" {
@@ -141,6 +160,9 @@ func (q *FieldQuery) Matches(pkg *Package) bool {
matched, err := filepath.Match(q.Value, field)
return err == nil && matched
case VersionRegexp:
if q.Regexp == nil {
q.Regexp = regexp.MustCompile(q.Value)
}
return q.Regexp.FindStringIndex(field) != nil
}
@@ -158,6 +180,35 @@ func (q *FieldQuery) Fast() bool {
return false
}
// String interface
func (q *FieldQuery) String() string {
escape := func(val string) string {
if strings.IndexAny(val, "()|,!{} \t\n") != -1 {
return "'" + strings.Replace(strings.Replace(val, "\\", "\\\\", -1), "'", "\\'", -1) + "'"
}
return val
}
var op string
switch q.Relation {
case VersionEqual:
op = "="
case VersionGreater:
op = ">>"
case VersionLess:
op = "<<"
case VersionRegexp:
op = "~"
case VersionPatternMatch:
op = "%"
case VersionGreaterOrEqual:
op = ">="
case VersionLessOrEqual:
op = "<="
}
return fmt.Sprintf("%s (%s %s)", escape(q.Field), op, escape(q.Value))
}
// Matches on dependency condition
func (q *DependencyQuery) Matches(pkg *Package) bool {
return pkg.MatchesDependency(q.Dep)
@@ -178,6 +229,11 @@ func (q *DependencyQuery) Query(list *PackageList) (result *PackageList) {
return
}
// String interface
func (q *DependencyQuery) String() string {
return q.Dep.String()
}
// Matches on specific properties
func (q *PkgQuery) Matches(pkg *Package) bool {
return pkg.Name == q.Pkg && pkg.Version == q.Version && pkg.Architecture == q.Arch
@@ -199,3 +255,8 @@ func (q *PkgQuery) Query(list *PackageList) (result *PackageList) {
return
}
// String interface
func (q *PkgQuery) String() string {
return fmt.Sprintf("%s_%s_%s", q.Pkg, q.Version, q.Arch)
}