func (q *NotQuery) Matches(pkg PackageLike) bool {
	return !q.Q.Matches(pkg)
}
Matches if not matches
package deb
import (
	"fmt"
	"path/filepath"
	"regexp"
	"strings"
)
type PackageLike interface {
	GetField(string) string
	MatchesDependency(Dependency) bool
	MatchesArchitecture(string) bool
	GetName() string
	GetVersion() string
	GetArchitecture() string
}
type PackageCatalog interface {
	Scan(q PackageQuery) (result *PackageList)
	Search(dep Dependency, allMatches bool) (searchResults []*Package)
	SearchSupported() bool
	SearchByKey(arch, name, version string) (result *PackageList)
}
type PackageQuery interface {
	Matches(pkg PackageLike) bool
	Fast(list PackageCatalog) bool
	Query(list PackageCatalog) *PackageList
	String() string
}
type OrQuery struct {
	L, R PackageQuery
}
type AndQuery struct {
	L, R PackageQuery
}
type NotQuery struct {
	Q PackageQuery
}
type FieldQuery struct {
	Field    string
	Relation int
	Value    string
	Regexp   *regexp.Regexp `codec:"-"`
}
type PkgQuery struct {
	Pkg     string
	Version string
	Arch    string
}
type DependencyQuery struct {
	Dep Dependency
}
type MatchAllQuery struct{}
func (q *OrQuery) Matches(pkg PackageLike) bool {
	return q.L.Matches(pkg) || q.R.Matches(pkg)
}
func (q *OrQuery) Fast(list PackageCatalog) bool {
	return q.L.Fast(list) && q.R.Fast(list)
}
func (q *OrQuery) Query(list PackageCatalog) (result *PackageList) {
	if q.Fast(list) {
		result = q.L.Query(list)
		result.Append(q.R.Query(list))
	} else {
		result = list.Scan(q)
	}
	return
}
func (q *OrQuery) String() string {
	return fmt.Sprintf("(%s) | (%s)", q.L, q.R)
}
func (q *AndQuery) Matches(pkg PackageLike) bool {
	return q.L.Matches(pkg) && q.R.Matches(pkg)
}
func (q *AndQuery) Fast(list PackageCatalog) bool {
	return q.L.Fast(list) || q.R.Fast(list)
}
func (q *AndQuery) Query(list PackageCatalog) (result *PackageList) {
	if !q.Fast(list) {
		result = list.Scan(q)
	} else {
		if q.L.Fast(list) {
			result = q.L.Query(list)
			result = result.Scan(q.R)
		} else {
			result = q.R.Query(list)
			result = result.Scan(q.L)
		}
	}
	return
}
func (q *AndQuery) String() string {
	return fmt.Sprintf("(%s), (%s)", q.L, q.R)
}