From e0c28d594d4efdd9e9cb9281f40007237d5faf46 Mon Sep 17 00:00:00 2001 From: 0007 <0007@qq.com> Date: Wed, 27 Aug 2025 19:58:19 +0800 Subject: [PATCH] Add File --- .../agentsflex/core/store/SearchWrapper.java | 340 ++++++++++++++++++ 1 file changed, 340 insertions(+) create mode 100644 agents-flex-core/src/main/java/com/agentsflex/core/store/SearchWrapper.java diff --git a/agents-flex-core/src/main/java/com/agentsflex/core/store/SearchWrapper.java b/agents-flex-core/src/main/java/com/agentsflex/core/store/SearchWrapper.java new file mode 100644 index 0000000..ea2fb53 --- /dev/null +++ b/agents-flex-core/src/main/java/com/agentsflex/core/store/SearchWrapper.java @@ -0,0 +1,340 @@ +/* + * Copyright (c) 2023-2025, Agents-Flex (fuhai999@gmail.com). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.agentsflex.core.store; + +import com.agentsflex.core.store.condition.*; + +import java.util.*; +import java.util.function.Consumer; + +public class SearchWrapper extends VectorData { + + /** + * the default value of search data count + */ + public static final int DEFAULT_MAX_RESULTS = 4; + + /** + * search text, Vector store will convert the text to vector data + */ + private String text; + + /** + * search max result, like the sql "limit" in mysql + */ + private Integer maxResults = DEFAULT_MAX_RESULTS; + + /** + * The lowest correlation score, ranging from 0 to 1 (including 0 and 1). Only embeddings with a score of this value or higher will be returned. + * 0.0 indicates accepting any similarity or disabling similarity threshold filtering. A threshold of 1.0 indicates the need for a perfect match. + */ + private Double minScore; + + /** + * The flag of include vector data queries. If the current value is true and the vector content is null, + * the query text will be automatically converted into vector data through the vector store. + */ + private boolean withVector = true; + + /** + * query condition + */ + private Condition condition; + + /** + * query fields + */ + private List outputFields; + + /** + * whether to output vector data + */ + private boolean outputVector = false; + + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public SearchWrapper text(String text) { + setText(text); + return this; + } + + public Integer getMaxResults() { + return maxResults; + } + + public void setMaxResults(Integer maxResults) { + this.maxResults = maxResults; + } + + public SearchWrapper maxResults(Integer maxResults) { + setMaxResults(maxResults); + return this; + } + + public Double getMinScore() { + return minScore; + } + + public void setMinScore(Double minScore) { + this.minScore = minScore; + } + + public SearchWrapper minScore(Double minScore) { + setMinScore(minScore); + return this; + } + + public boolean isWithVector() { + return withVector; + } + + public void setWithVector(boolean withVector) { + this.withVector = withVector; + } + + public SearchWrapper withVector(Boolean withVector) { + setWithVector(withVector); + return this; + } + + public Condition getCondition() { + return condition; + } + + public void setCondition(Condition condition) { + this.condition = condition; + } + + public List getOutputFields() { + return outputFields; + } + + public void setOutputFields(List outputFields) { + this.outputFields = outputFields; + } + + public SearchWrapper outputFields(Collection outputFields) { + setOutputFields(new ArrayList<>(outputFields)); + return this; + } + + public SearchWrapper outputFields(String... outputFields) { + setOutputFields(Arrays.asList(outputFields)); + return this; + } + + public boolean isOutputVector() { + return outputVector; + } + + public void setOutputVector(boolean outputVector) { + this.outputVector = outputVector; + } + + public SearchWrapper outputVector(boolean outputVector) { + setOutputVector(outputVector); + return this; + } + + + public SearchWrapper eq(String key, Object value) { + return eq(Connector.AND, key, value); + } + + public SearchWrapper eq(Connector connector, String key, Object value) { + if (this.condition == null) { + this.condition = new Condition(ConditionType.EQ, new Key(key), new Value(value)); + } else { + this.condition.connect(new Condition(ConditionType.EQ, new Key(key), new Value(value)), connector); + } + return this; + } + + public SearchWrapper ne(String key, Object value) { + return ne(Connector.AND, key, value); + } + + public SearchWrapper ne(Connector connector, String key, Object value) { + if (this.condition == null) { + this.condition = new Condition(ConditionType.NE, new Key(key), new Value(value)); + } else { + this.condition.connect(new Condition(ConditionType.NE, new Key(key), new Value(value)), connector); + } + return this; + } + + public SearchWrapper gt(String key, Object value) { + return gt(Connector.AND, key, value); + } + + public SearchWrapper gt(Connector connector, String key, Object value) { + if (this.condition == null) { + this.condition = new Condition(ConditionType.GT, new Key(key), new Value(value)); + } else { + this.condition.connect(new Condition(ConditionType.GT, new Key(key), new Value(value)), connector); + } + return this; + } + + + public SearchWrapper ge(String key, Object value) { + return ge(Connector.AND, key, value); + } + + public SearchWrapper ge(Connector connector, String key, Object value) { + if (this.condition == null) { + this.condition = new Condition(ConditionType.GE, new Key(key), new Value(value)); + } else { + this.condition.connect(new Condition(ConditionType.GE, new Key(key), new Value(value)), connector); + } + return this; + } + + + public SearchWrapper lt(String key, Object value) { + return lt(Connector.AND, key, value); + } + + public SearchWrapper lt(Connector connector, String key, Object value) { + if (this.condition == null) { + this.condition = new Condition(ConditionType.LT, new Key(key), new Value(value)); + } else { + this.condition.connect(new Condition(ConditionType.LT, new Key(key), new Value(value)), connector); + } + return this; + } + + + public SearchWrapper le(String key, Object value) { + return le(Connector.AND, key, value); + } + + public SearchWrapper le(Connector connector, String key, Object value) { + if (this.condition == null) { + this.condition = new Condition(ConditionType.LE, new Key(key), new Value(value)); + } else { + this.condition.connect(new Condition(ConditionType.LE, new Key(key), new Value(value)), connector); + } + return this; + } + + + public SearchWrapper in(String key, Collection values) { + return in(Connector.AND, key, values); + } + + public SearchWrapper in(Connector connector, String key, Collection values) { + if (this.condition == null) { + this.condition = new Condition(ConditionType.IN, new Key(key), new Value(values.toArray())); + } else { + this.condition.connect(new Condition(ConditionType.IN, new Key(key), new Value(values.toArray())), connector); + } + return this; + } + + public SearchWrapper min(String key, Object value) { + return min(Connector.AND, key, value); + } + + public SearchWrapper min(Connector connector, String key, Object value) { + if (this.condition == null) { + this.condition = new Condition(ConditionType.NIN, new Key(key), new Value(value)); + } else { + this.condition.connect(new Condition(ConditionType.NIN, new Key(key), new Value(value)), connector); + } + return this; + } + + public SearchWrapper between(String key, Object start, Object end) { + return between(Connector.AND, key, start, end); + } + + public SearchWrapper between(Connector connector, String key, Object start, Object end) { + if (this.condition == null) { + this.condition = new Condition(ConditionType.BETWEEN, new Key(key), new Value(start, end)); + } else { + this.condition.connect(new Condition(ConditionType.BETWEEN, new Key(key), new Value(start, end)), connector); + } + return this; + } + + + public SearchWrapper group(SearchWrapper wrapper) { + return group(wrapper.condition); + } + + public SearchWrapper group(Condition condition) { + if (this.condition == null) { + this.condition = new Group(condition); + } else { + this.condition.connect(new Group(condition), Connector.AND); + } + return this; + } + + public SearchWrapper group(Consumer consumer) { + SearchWrapper newWrapper = new SearchWrapper(); + consumer.accept(newWrapper); + Condition condition = newWrapper.condition; + if (condition != null) { + group(condition); + } + return this; + } + + public SearchWrapper andCriteria(Consumer consumer) { + return group(consumer); + } + + public SearchWrapper orCriteria(Consumer consumer) { + SearchWrapper newWrapper = new SearchWrapper(); + consumer.accept(newWrapper); + Condition condition = newWrapper.condition; + if (condition != null) { + if (this.condition == null) { + this.condition = new Group(condition); + } else { + this.condition.connect(new Group(condition), Connector.OR); + } + } + return this; + } + + /** + * Convert to expressions for filtering conditions, with different expression requirements for each vendor. + * Customized adaptor can be achieved through ExpressionAdaptor + */ + public String toFilterExpression() { + return toFilterExpression(ExpressionAdaptor.DEFAULT); + } + + public String toFilterExpression(ExpressionAdaptor adaptor) { + if (this.condition == null) { + return null; + } else { + Objects.requireNonNull(adaptor, "adaptor must not be null"); + return this.condition.toExpression(adaptor); + } + } + +}