Add File
This commit is contained in:
@@ -0,0 +1,340 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2023-2025, Agents-Flex (fuhai999@gmail.com).
|
||||||
|
* <p>
|
||||||
|
* 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
|
||||||
|
* <p>
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* <p>
|
||||||
|
* 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<String> 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<String> getOutputFields() {
|
||||||
|
return outputFields;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOutputFields(List<String> outputFields) {
|
||||||
|
this.outputFields = outputFields;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SearchWrapper outputFields(Collection<String> 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<SearchWrapper> consumer) {
|
||||||
|
SearchWrapper newWrapper = new SearchWrapper();
|
||||||
|
consumer.accept(newWrapper);
|
||||||
|
Condition condition = newWrapper.condition;
|
||||||
|
if (condition != null) {
|
||||||
|
group(condition);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SearchWrapper andCriteria(Consumer<SearchWrapper> consumer) {
|
||||||
|
return group(consumer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public SearchWrapper orCriteria(Consumer<SearchWrapper> 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user