+(defmacro def-search-expr (((self criteria-type)) (model-expr &body body))
+ `(defmethod search-expr ((,self ,criteria-type) instance)
+ (,model-expr
+ instance
+ (ucw::slot-name (ucw::presentation ,self))
+ ,@body)))
+
+(defmethod search-expr ((self ucw::negated-criteria) instance)
+ (when (ucw::criteria self)
+ (meta-model:expr-not
+ instance
+ (search-expr (ucw::criteria self) instance))))
+
+(def-search-expr ((self ucw::string-starts-with))
+ (meta-model:expr-starts-with (ucw::search-text self)))
+
+(def-search-expr ((self ucw::string-ends-with))
+ (meta-model:expr-ends-with (ucw::search-text self)))
+
+(def-search-expr ((self ucw::string-contains))
+ (meta-model:expr-contains (ucw::search-text self)))
+
+(def-search-expr ((self ucw::number-less-than))
+ (meta-model:expr-< (ucw::number-input self)))
+
+(def-search-expr ((self ucw::number-greater-than))
+ (meta-model:expr-> (ucw::number-input self)))
+
+(def-search-expr ((self ucw::number-equal-to))
+ (meta-model:expr-= (ucw::number-input self)))
+
+(defcomponent mewa-presentation-search (ucw::presentation-search)
+ ((display-results-p :accessor display-results-p :initarg :display-results-p :initform nil)))
+
+(defmethod instance ((self mewa:mewa-presentation-search))
+ (instance (ucw::search-presentation self)))
+
+(defmethod search-expr ((self mewa:mewa-presentation-search) instance)
+ (apply #'meta-model:expr-and instance
+ (mapcan (lambda (c) (let ((e (search-expr c instance)))
+ (if (listp e) e (list e))))
+ (ucw::criteria self))))
+
+
+(defmethod search-query ((self mewa:mewa-presentation-search))
+ (search-expr self (instance self)))
+
+(defmethod valid-instances ((self mewa:mewa-presentation-search))
+ (meta-model:select-instances (instance self) (search-query self)))
+
+(defmethod get-all-instances ((self mewa-presentation-search))
+ (meta-model:select-instances (instance self)))