mirror of
https://github.com/nosqlbench/nosqlbench.git
synced 2024-12-22 23:23:56 -06:00
improve op types
This commit is contained in:
parent
25630e01c0
commit
55f27dfb05
@ -39,11 +39,11 @@ public class OpenSearchOpMapper implements OpMapper<Op> {
|
|||||||
TypeAndTarget<OpenSearchOpTypes, String> typeAndTarget =
|
TypeAndTarget<OpenSearchOpTypes, String> typeAndTarget =
|
||||||
op.getTypeAndTarget(OpenSearchOpTypes.class, String.class, "verb", "index");
|
op.getTypeAndTarget(OpenSearchOpTypes.class, String.class, "verb", "index");
|
||||||
return switch (typeAndTarget.enumId) {
|
return switch (typeAndTarget.enumId) {
|
||||||
case create_index -> new CreateIndexOpDispenser(adapter, op);
|
case create_index -> new CreateIndexOpDispenser(adapter, op, typeAndTarget.targetFunction);
|
||||||
case delete_index -> new DeleteIndexOpDispenser(adapter, op);
|
case delete_index -> new DeleteIndexOpDispenser(adapter, op, typeAndTarget.targetFunction);
|
||||||
case index -> new IndexOpDispenser(adapter,op);
|
case index -> new IndexOpDispenser(adapter,op, typeAndTarget.targetFunction);
|
||||||
case update -> new UpdateOpDispenser(adapter,op);
|
case update -> new UpdateOpDispenser(adapter,op, typeAndTarget.targetFunction);
|
||||||
case delete -> new DeleteOpDispenser(adapter,op);
|
case delete -> new DeleteOpDispenser(adapter,op, typeAndTarget.targetFunction);
|
||||||
default -> throw new RuntimeException("Unrecognized op type '" + typeAndTarget.enumId.name() + "' while " +
|
default -> throw new RuntimeException("Unrecognized op type '" + typeAndTarget.enumId.name() + "' while " +
|
||||||
"mapping parsed op " + op);
|
"mapping parsed op " + op);
|
||||||
};
|
};
|
||||||
|
@ -29,37 +29,19 @@ import java.util.function.LongFunction;
|
|||||||
|
|
||||||
public class CreateIndexOpDispenser extends BaseOpenSearchOpDispenser {
|
public class CreateIndexOpDispenser extends BaseOpenSearchOpDispenser {
|
||||||
|
|
||||||
public CreateIndexOpDispenser(OpenSearchAdapter adapter, ParsedOp op) {
|
private final LongFunction<String> targetF;
|
||||||
|
|
||||||
|
public CreateIndexOpDispenser(OpenSearchAdapter adapter, ParsedOp op, LongFunction<String> targetF) {
|
||||||
super(adapter, op);
|
super(adapter, op);
|
||||||
|
this.targetF = targetF;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* {@see
|
|
||||||
* <a href="https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-vector-search.html">doc
|
|
||||||
* </a>}
|
|
||||||
* <pre>{@code
|
|
||||||
* {
|
|
||||||
* "mappings": {
|
|
||||||
* "properties": {
|
|
||||||
* "value": {
|
|
||||||
* "type": "dense_vector",
|
|
||||||
* "dims": TEMPLATE(dimensions, 25),
|
|
||||||
* "index": true,
|
|
||||||
* "similarity": "TEMPLATE(similarity_function, cosine)"
|
|
||||||
* },
|
|
||||||
* "key": {
|
|
||||||
* "type": "text"
|
|
||||||
* }
|
|
||||||
* }
|
|
||||||
* }
|
|
||||||
* }}</pre>
|
|
||||||
*
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public LongFunction<CreateIndexOp> createOpFunc(LongFunction<OpenSearchClient> clientF, ParsedOp op) {
|
public LongFunction<CreateIndexOp> createOpFunc(LongFunction<OpenSearchClient> clientF, ParsedOp op) {
|
||||||
CreateIndexRequest.Builder eb = new CreateIndexRequest.Builder();
|
CreateIndexRequest.Builder eb = new CreateIndexRequest.Builder();
|
||||||
LongFunction<CreateIndexRequest.Builder> bfunc = l -> new CreateIndexRequest.Builder().index("testindex1");
|
LongFunction<CreateIndexRequest.Builder> bfunc =
|
||||||
|
l -> new CreateIndexRequest.Builder()
|
||||||
|
.index(targetF.apply(1));
|
||||||
bfunc = op.enhanceFunc(bfunc, "mappings", Map.class, this::resolveTypeMapping);
|
bfunc = op.enhanceFunc(bfunc, "mappings", Map.class, this::resolveTypeMapping);
|
||||||
|
|
||||||
LongFunction<CreateIndexRequest.Builder> finalBfunc = bfunc;
|
LongFunction<CreateIndexRequest.Builder> finalBfunc = bfunc;
|
||||||
@ -70,18 +52,23 @@ public class CreateIndexOpDispenser extends BaseOpenSearchOpDispenser {
|
|||||||
private CreateIndexRequest.Builder resolveTypeMapping(CreateIndexRequest.Builder eb, Map<?, ?> mappings) {
|
private CreateIndexRequest.Builder resolveTypeMapping(CreateIndexRequest.Builder eb, Map<?, ?> mappings) {
|
||||||
TypeMapping.Builder builder = new TypeMapping.Builder().properties(
|
TypeMapping.Builder builder = new TypeMapping.Builder().properties(
|
||||||
Map.of(
|
Map.of(
|
||||||
"p1",
|
"key",
|
||||||
new Property.Builder().knnVector(new KnnVectorProperty.Builder()
|
new Property.Builder()
|
||||||
.dimension(23)
|
.text(b -> b)
|
||||||
.method(
|
.build(),
|
||||||
new KnnVectorMethod.Builder()
|
"value",
|
||||||
.name("hnsw")
|
new Property.Builder()
|
||||||
.engine("faiss")
|
.knnVector(new KnnVectorProperty.Builder()
|
||||||
.spaceType("l2")
|
.dimension(23)
|
||||||
.parameters(Map.of("ef_construction", JsonData.of(256),"m",JsonData.of(8)))
|
.method(
|
||||||
.build()
|
new KnnVectorMethod.Builder()
|
||||||
|
.name("hnsw")
|
||||||
|
.engine("faiss")
|
||||||
|
.spaceType("l2")
|
||||||
|
.parameters(Map.of("ef_construction", JsonData.of(256), "m", JsonData.of(8)))
|
||||||
|
.build()
|
||||||
|
).build()
|
||||||
).build()
|
).build()
|
||||||
).build()
|
|
||||||
))
|
))
|
||||||
.fieldNames(new FieldNamesField.Builder()
|
.fieldNames(new FieldNamesField.Builder()
|
||||||
.enabled(true).build()
|
.enabled(true).build()
|
||||||
|
@ -17,78 +17,28 @@
|
|||||||
package io.nosqlbench.adapter.opensearch.dispensers;
|
package io.nosqlbench.adapter.opensearch.dispensers;
|
||||||
|
|
||||||
import io.nosqlbench.adapter.opensearch.OpenSearchAdapter;
|
import io.nosqlbench.adapter.opensearch.OpenSearchAdapter;
|
||||||
import io.nosqlbench.adapter.opensearch.ops.CreateIndexOp;
|
import io.nosqlbench.adapter.opensearch.ops.DeleteIndexOp;
|
||||||
import io.nosqlbench.adapters.api.templating.ParsedOp;
|
import io.nosqlbench.adapters.api.templating.ParsedOp;
|
||||||
import org.opensearch.client.json.JsonData;
|
|
||||||
import org.opensearch.client.opensearch.OpenSearchClient;
|
import org.opensearch.client.opensearch.OpenSearchClient;
|
||||||
import org.opensearch.client.opensearch._types.mapping.*;
|
import org.opensearch.client.opensearch.indices.DeleteIndexRequest;
|
||||||
import org.opensearch.client.opensearch.indices.CreateIndexRequest;
|
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.function.LongFunction;
|
import java.util.function.LongFunction;
|
||||||
|
|
||||||
public class DeleteIndexOpDispenser extends BaseOpenSearchOpDispenser {
|
public class DeleteIndexOpDispenser extends BaseOpenSearchOpDispenser {
|
||||||
|
|
||||||
public DeleteIndexOpDispenser(OpenSearchAdapter adapter, ParsedOp op) {
|
private final LongFunction<String> targetF;
|
||||||
|
|
||||||
|
public DeleteIndexOpDispenser(OpenSearchAdapter adapter, ParsedOp op, LongFunction<String> targetF) {
|
||||||
super(adapter, op);
|
super(adapter, op);
|
||||||
|
this.targetF = targetF;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* {@see
|
|
||||||
* <a href="https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-vector-search.html">doc
|
|
||||||
* </a>}
|
|
||||||
* <pre>{@code
|
|
||||||
* {
|
|
||||||
* "mappings": {
|
|
||||||
* "properties": {
|
|
||||||
* "value": {
|
|
||||||
* "type": "dense_vector",
|
|
||||||
* "dims": TEMPLATE(dimensions, 25),
|
|
||||||
* "index": true,
|
|
||||||
* "similarity": "TEMPLATE(similarity_function, cosine)"
|
|
||||||
* },
|
|
||||||
* "key": {
|
|
||||||
* "type": "text"
|
|
||||||
* }
|
|
||||||
* }
|
|
||||||
* }
|
|
||||||
* }}</pre>
|
|
||||||
*
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public LongFunction<CreateIndexOp> createOpFunc(LongFunction<OpenSearchClient> clientF, ParsedOp op) {
|
public LongFunction<DeleteIndexOp> createOpFunc(LongFunction<OpenSearchClient> clientF, ParsedOp op) {
|
||||||
CreateIndexRequest.Builder eb = new CreateIndexRequest.Builder();
|
DeleteIndexRequest.Builder eb = new DeleteIndexRequest.Builder();
|
||||||
LongFunction<CreateIndexRequest.Builder> bfunc = l -> new CreateIndexRequest.Builder().index("testindex1");
|
LongFunction<DeleteIndexRequest.Builder> f =
|
||||||
bfunc = op.enhanceFunc(bfunc, "mappings", Map.class, this::resolveTypeMapping);
|
l -> new DeleteIndexRequest.Builder().index(targetF.apply(l));
|
||||||
|
return l -> new DeleteIndexOp(clientF.apply(l),f.apply(1).build());
|
||||||
LongFunction<CreateIndexRequest.Builder> finalBfunc = bfunc;
|
|
||||||
return (long l) -> new CreateIndexOp(clientF.apply(l), finalBfunc.apply(l).build());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://opensearch.org/docs/latest/search-plugins/knn/knn-index/
|
|
||||||
private CreateIndexRequest.Builder resolveTypeMapping(CreateIndexRequest.Builder eb, Map<?, ?> mappings) {
|
|
||||||
TypeMapping.Builder builder = new TypeMapping.Builder().properties(
|
|
||||||
Map.of(
|
|
||||||
"p1",
|
|
||||||
new Property.Builder().knnVector(new KnnVectorProperty.Builder()
|
|
||||||
.dimension(23)
|
|
||||||
.method(
|
|
||||||
new KnnVectorMethod.Builder()
|
|
||||||
.name("hnsw")
|
|
||||||
.engine("faiss")
|
|
||||||
.spaceType("l2")
|
|
||||||
.parameters(Map.of("ef_construction", JsonData.of(256),"m",JsonData.of(8)))
|
|
||||||
.build()
|
|
||||||
).build()
|
|
||||||
).build()
|
|
||||||
))
|
|
||||||
.indexField(new IndexField.Builder()
|
|
||||||
.enabled(true).build())
|
|
||||||
.fieldNames(new FieldNamesField.Builder()
|
|
||||||
.enabled(true).build()
|
|
||||||
);
|
|
||||||
return eb.mappings(b -> builder);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -18,10 +18,12 @@ package io.nosqlbench.adapter.opensearch.dispensers;
|
|||||||
|
|
||||||
import io.nosqlbench.adapter.opensearch.OpenSearchAdapter;
|
import io.nosqlbench.adapter.opensearch.OpenSearchAdapter;
|
||||||
import io.nosqlbench.adapter.opensearch.ops.CreateIndexOp;
|
import io.nosqlbench.adapter.opensearch.ops.CreateIndexOp;
|
||||||
|
import io.nosqlbench.adapter.opensearch.ops.DeleteOp;
|
||||||
import io.nosqlbench.adapters.api.templating.ParsedOp;
|
import io.nosqlbench.adapters.api.templating.ParsedOp;
|
||||||
import org.opensearch.client.json.JsonData;
|
import org.opensearch.client.json.JsonData;
|
||||||
import org.opensearch.client.opensearch.OpenSearchClient;
|
import org.opensearch.client.opensearch.OpenSearchClient;
|
||||||
import org.opensearch.client.opensearch._types.mapping.*;
|
import org.opensearch.client.opensearch._types.mapping.*;
|
||||||
|
import org.opensearch.client.opensearch.core.DeleteRequest;
|
||||||
import org.opensearch.client.opensearch.indices.CreateIndexRequest;
|
import org.opensearch.client.opensearch.indices.CreateIndexRequest;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -29,66 +31,18 @@ import java.util.function.LongFunction;
|
|||||||
|
|
||||||
public class DeleteOpDispenser extends BaseOpenSearchOpDispenser {
|
public class DeleteOpDispenser extends BaseOpenSearchOpDispenser {
|
||||||
|
|
||||||
public DeleteOpDispenser(OpenSearchAdapter adapter, ParsedOp op) {
|
private final LongFunction<String> targetF;
|
||||||
|
|
||||||
|
public DeleteOpDispenser(OpenSearchAdapter adapter, ParsedOp op, LongFunction<String> targetF) {
|
||||||
super(adapter, op);
|
super(adapter, op);
|
||||||
|
this.targetF = targetF;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* {@see
|
|
||||||
* <a href="https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-vector-search.html">doc
|
|
||||||
* </a>}
|
|
||||||
* <pre>{@code
|
|
||||||
* {
|
|
||||||
* "mappings": {
|
|
||||||
* "properties": {
|
|
||||||
* "value": {
|
|
||||||
* "type": "dense_vector",
|
|
||||||
* "dims": TEMPLATE(dimensions, 25),
|
|
||||||
* "index": true,
|
|
||||||
* "similarity": "TEMPLATE(similarity_function, cosine)"
|
|
||||||
* },
|
|
||||||
* "key": {
|
|
||||||
* "type": "text"
|
|
||||||
* }
|
|
||||||
* }
|
|
||||||
* }
|
|
||||||
* }}</pre>
|
|
||||||
*
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public LongFunction<CreateIndexOp> createOpFunc(LongFunction<OpenSearchClient> clientF, ParsedOp op) {
|
public LongFunction<DeleteOp> createOpFunc(LongFunction<OpenSearchClient> clientF, ParsedOp op) {
|
||||||
CreateIndexRequest.Builder eb = new CreateIndexRequest.Builder();
|
DeleteRequest.Builder eb = new DeleteRequest.Builder();
|
||||||
LongFunction<CreateIndexRequest.Builder> bfunc = l -> new CreateIndexRequest.Builder().index("testindex1");
|
LongFunction<DeleteRequest.Builder> bfunc = l -> new DeleteRequest.Builder().index(targetF.apply(l));
|
||||||
bfunc = op.enhanceFunc(bfunc, "mappings", Map.class, this::resolveTypeMapping);
|
return (long l) -> new DeleteOp(clientF.apply(l), bfunc.apply(l).build());
|
||||||
|
|
||||||
LongFunction<CreateIndexRequest.Builder> finalBfunc = bfunc;
|
|
||||||
return (long l) -> new CreateIndexOp(clientF.apply(l), finalBfunc.apply(l).build());
|
|
||||||
}
|
|
||||||
|
|
||||||
// https://opensearch.org/docs/latest/search-plugins/knn/knn-index/
|
|
||||||
private CreateIndexRequest.Builder resolveTypeMapping(CreateIndexRequest.Builder eb, Map<?, ?> mappings) {
|
|
||||||
TypeMapping.Builder builder = new TypeMapping.Builder().properties(
|
|
||||||
Map.of(
|
|
||||||
"p1",
|
|
||||||
new Property.Builder().knnVector(new KnnVectorProperty.Builder()
|
|
||||||
.dimension(23)
|
|
||||||
.method(
|
|
||||||
new KnnVectorMethod.Builder()
|
|
||||||
.name("hnsw")
|
|
||||||
.engine("faiss")
|
|
||||||
.spaceType("l2")
|
|
||||||
.parameters(Map.of("ef_construction", JsonData.of(256),"m",JsonData.of(8)))
|
|
||||||
.build()
|
|
||||||
).build()
|
|
||||||
).build()
|
|
||||||
))
|
|
||||||
.indexField(new IndexField.Builder()
|
|
||||||
.enabled(true).build())
|
|
||||||
.fieldNames(new FieldNamesField.Builder()
|
|
||||||
.enabled(true).build()
|
|
||||||
);
|
|
||||||
return eb.mappings(b -> builder);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -29,8 +29,11 @@ import java.util.Map;
|
|||||||
import java.util.function.LongFunction;
|
import java.util.function.LongFunction;
|
||||||
|
|
||||||
public class IndexOpDispenser extends BaseOpenSearchOpDispenser {
|
public class IndexOpDispenser extends BaseOpenSearchOpDispenser {
|
||||||
public IndexOpDispenser(OpenSearchAdapter adapter, ParsedOp op) {
|
private final LongFunction<String> targetF;
|
||||||
|
|
||||||
|
public IndexOpDispenser(OpenSearchAdapter adapter, ParsedOp op, LongFunction<String> targetF) {
|
||||||
super(adapter, op);
|
super(adapter, op);
|
||||||
|
this.targetF =targetF;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -31,43 +31,18 @@ import java.util.function.LongFunction;
|
|||||||
|
|
||||||
public class UpdateOpDispenser extends BaseOpenSearchOpDispenser {
|
public class UpdateOpDispenser extends BaseOpenSearchOpDispenser {
|
||||||
|
|
||||||
public UpdateOpDispenser(OpenSearchAdapter adapter, ParsedOp op) {
|
private final LongFunction<String> targetF;
|
||||||
|
|
||||||
|
public UpdateOpDispenser(OpenSearchAdapter adapter, ParsedOp op, LongFunction<String> targetF) {
|
||||||
super(adapter, op);
|
super(adapter, op);
|
||||||
|
this.targetF = targetF;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* {@see
|
|
||||||
* <a href="https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-vector-search.html">doc
|
|
||||||
* </a>}
|
|
||||||
* <pre>{@code
|
|
||||||
* {
|
|
||||||
* "mappings": {
|
|
||||||
* "properties": {
|
|
||||||
* "value": {
|
|
||||||
* "type": "dense_vector",
|
|
||||||
* "dims": TEMPLATE(dimensions, 25),
|
|
||||||
* "index": true,
|
|
||||||
* "similarity": "TEMPLATE(similarity_function, cosine)"
|
|
||||||
* },
|
|
||||||
* "key": {
|
|
||||||
* "type": "text"
|
|
||||||
* }
|
|
||||||
* }
|
|
||||||
* }
|
|
||||||
* }}</pre>
|
|
||||||
*
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public LongFunction<UpdateOp> createOpFunc(LongFunction<OpenSearchClient> clientF, ParsedOp op) {
|
public LongFunction<UpdateOp> createOpFunc(LongFunction<OpenSearchClient> clientF, ParsedOp op) {
|
||||||
return null;
|
LongFunction<UpdateRequest.Builder> bfunc = l -> new UpdateRequest.Builder().index(targetF.apply(l));
|
||||||
// LongFunction<UpdateRequest.Builder> bfunc = l -> new UpdateRequest.Builder();
|
// TODO: add details here
|
||||||
// op.getAsRequiredFunction("type")
|
return l -> new UpdateOp(clientF.apply(l),bfunc.apply(l).build(),Object.class);
|
||||||
// return l -> new UpdateOp(clientF.apply(l),bfunc.apply(l).build());
|
|
||||||
// bfunc = op.enhanceFunc(bfunc, "mappings", Map.class, this::resolveTypeMapping);
|
|
||||||
//
|
|
||||||
// LongFunction<CreateIndexRequest.Builder> finalBfunc = bfunc;
|
|
||||||
// return (long l) -> new CreateIndexOp(clientF.apply(l), finalBfunc.apply(l).build());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -20,8 +20,6 @@ import org.opensearch.client.opensearch.OpenSearchClient;
|
|||||||
import org.opensearch.client.opensearch.indices.CreateIndexRequest;
|
import org.opensearch.client.opensearch.indices.CreateIndexRequest;
|
||||||
import org.opensearch.client.opensearch.indices.CreateIndexResponse;
|
import org.opensearch.client.opensearch.indices.CreateIndexResponse;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
public class CreateIndexOp extends BaseOpenSearchOp {
|
public class CreateIndexOp extends BaseOpenSearchOp {
|
||||||
private final CreateIndexRequest rq;
|
private final CreateIndexRequest rq;
|
||||||
|
|
||||||
|
@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2024 nosqlbench
|
||||||
|
*
|
||||||
|
* 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 io.nosqlbench.adapter.opensearch.ops;
|
||||||
|
|
||||||
|
import org.opensearch.client.opensearch.OpenSearchClient;
|
||||||
|
import org.opensearch.client.opensearch.core.DeleteRequest;
|
||||||
|
import org.opensearch.client.opensearch.core.IndexRequest;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class DeleteOp extends BaseOpenSearchOp {
|
||||||
|
private final DeleteRequest rq;
|
||||||
|
|
||||||
|
public DeleteOp(OpenSearchClient client, DeleteRequest rq) {
|
||||||
|
super(client);
|
||||||
|
this.rq = rq;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object applyOp(long value) throws IOException {
|
||||||
|
return client.delete(rq);
|
||||||
|
}
|
||||||
|
}
|
@ -2,13 +2,13 @@ package io.nosqlbench.adapters.api.templating;
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2022 nosqlbench
|
* Copyright (c) 2022 nosqlbench
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing,
|
* Unless required by applicable law or agreed to in writing,
|
||||||
* software distributed under the License is distributed on an
|
* software distributed under the License is distributed on an
|
||||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
Loading…
Reference in New Issue
Block a user