From c98d5ffc66af39b7f8e485154b295865915403da Mon Sep 17 00:00:00 2001 From: Jonathan Shook Date: Tue, 26 Jul 2022 01:14:58 -0500 Subject: [PATCH] cqlgen improvements and improved structure --- .../binders => api}/BindingsLibrary.java | 7 +- .../CGModelTransformer.java | 7 +- .../{exporter => api}/CGTextTransformer.java | 2 +- .../CGTransformerConfigurable.java | 2 +- .../nosqlbench/cqlgen/api/CqlModelInfo.java | 51 +++++++++ .../{exporter => }/binders/Binding.java | 2 +- .../binders/BindingsAccumulator.java | 3 +- .../{exporter => }/binders/NamingFolio.java | 4 +- .../{exporter => }/binders/NamingStyle.java | 2 +- .../binders/UnresolvedBindingException.java | 2 +- .../cqlgen/bindspecs/BindingBuilder.java | 22 ++++ .../cqlgen/bindspecs/BindingSpec.java | 41 +++++++ .../cqlgen/bindspecs/BindingSpecImpl.java | 49 ++++++++ .../{exporter => core}/CGColumnRebinder.java | 7 +- .../CGDefaultCqlBindings.java | 6 +- .../{exporter => core}/CGElementNamer.java | 2 +- .../CGExporterConfig.java} | 7 +- .../{exporter => core}/CGKeyspaceStats.java | 2 +- .../{exporter => core}/CGLiteralFormat.java | 2 +- .../{exporter => core}/CGSchemaStats.java | 3 +- .../{exporter => core}/CGTableStats.java | 2 +- .../CGTextTransformers.java | 7 +- .../CGWorkloadExporter.java | 99 ++++++++--------- .../transformers/CGIfNotExistsInjector.java | 52 --------- .../cqlgen/model/ComputedSchemaStats.java | 20 ++++ .../nosqlbench/cqlgen/model/CqlKeyspace.java | 2 +- .../io/nosqlbench/cqlgen/model/CqlModel.java | 105 +++++++++++------- .../io/nosqlbench/cqlgen/model/CqlTable.java | 12 +- .../transformers/CGCachingNameRemapper.java | 2 +- .../transformers/CGGenStatsInjector.java | 6 +- .../transformers/CGKeySpaceDDLRemover.java | 3 +- .../transformers/CGKeyspaceFilter.java | 4 +- .../transformers/CGModelTransformers.java | 4 +- .../transformers/CGNameObfuscator.java | 4 +- .../transformers/CGRatioCalculator.java | 32 ++++-- .../cqlgen/transformers/CGRatioSuffixer.java | 73 ++++++++++++ .../transformers/CGRegexReplacer.java | 5 +- .../CGReplicationSettingInjector.java | 4 +- .../transformers/CGUdtReplacer.java | 3 +- .../transformers/ComputedTableStats.java | 60 ++++++++++ .../transformers/CqlSchemaStatsParser.java | 8 +- .../transformers/UnusedTableRemover.java | 4 +- .../src/main/resources/cqlgen/cqlgen.conf | 32 +++--- .../cql/cql/parser/CqlParserHarnessTest.java | 17 +-- .../cql/exporters/CGElementNamerTest.java | 2 +- .../cql/exporters/CGWorkloadExporterTest.java | 2 +- .../cql/exporters/NamingFolioTest.java | 2 +- 47 files changed, 555 insertions(+), 234 deletions(-) rename adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/{exporter/binders => api}/BindingsLibrary.java (78%) rename adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/{exporter/transformers => api}/CGModelTransformer.java (73%) rename adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/{exporter => api}/CGTextTransformer.java (95%) rename adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/{exporter/transformers => api}/CGTransformerConfigurable.java (93%) create mode 100644 adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/api/CqlModelInfo.java rename adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/{exporter => }/binders/Binding.java (96%) rename adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/{exporter => }/binders/BindingsAccumulator.java (98%) rename adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/{exporter => }/binders/NamingFolio.java (97%) rename adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/{exporter => }/binders/NamingStyle.java (96%) rename adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/{exporter => }/binders/UnresolvedBindingException.java (95%) create mode 100644 adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/bindspecs/BindingBuilder.java create mode 100644 adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/bindspecs/BindingSpec.java create mode 100644 adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/bindspecs/BindingSpecImpl.java rename adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/{exporter => core}/CGColumnRebinder.java (94%) rename adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/{exporter => core}/CGDefaultCqlBindings.java (94%) rename adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/{exporter => core}/CGElementNamer.java (99%) rename adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/{traverser/CqlDDlDirectoryTraverser.java => core/CGExporterConfig.java} (77%) rename adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/{exporter => core}/CGKeyspaceStats.java (98%) rename adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/{exporter => core}/CGLiteralFormat.java (97%) rename adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/{exporter => core}/CGSchemaStats.java (96%) rename adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/{exporter => core}/CGTableStats.java (97%) rename adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/{exporter => core}/CGTextTransformers.java (94%) rename adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/{exporter => core}/CGWorkloadExporter.java (93%) delete mode 100644 adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGIfNotExistsInjector.java create mode 100644 adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/model/ComputedSchemaStats.java rename adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/{exporter => }/transformers/CGCachingNameRemapper.java (97%) rename adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/{exporter => }/transformers/CGGenStatsInjector.java (90%) rename adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/{exporter => }/transformers/CGKeySpaceDDLRemover.java (91%) rename adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/{exporter => }/transformers/CGKeyspaceFilter.java (96%) rename adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/{exporter => }/transformers/CGModelTransformers.java (95%) rename adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/{exporter => }/transformers/CGNameObfuscator.java (95%) rename adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/{exporter => }/transformers/CGRatioCalculator.java (69%) create mode 100644 adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CGRatioSuffixer.java rename adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/{exporter => }/transformers/CGRegexReplacer.java (96%) rename adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/{exporter => }/transformers/CGReplicationSettingInjector.java (90%) rename adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/{exporter => }/transformers/CGUdtReplacer.java (93%) create mode 100644 adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/ComputedTableStats.java rename adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/{exporter => }/transformers/CqlSchemaStatsParser.java (94%) rename adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/{exporter => }/transformers/UnusedTableRemover.java (94%) diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/binders/BindingsLibrary.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/api/BindingsLibrary.java similarity index 78% rename from adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/binders/BindingsLibrary.java rename to adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/api/BindingsLibrary.java index 2d6577f9d..6f2d25c10 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/binders/BindingsLibrary.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/api/BindingsLibrary.java @@ -14,12 +14,17 @@ * limitations under the License. */ -package io.nosqlbench.cqlgen.exporter.binders; +package io.nosqlbench.cqlgen.api; +import io.nosqlbench.cqlgen.binders.Binding; import io.nosqlbench.cqlgen.model.CqlColumnDef; import java.util.Optional; +/** + * A bindings library is simply a service point for a specific way + * to map a column definition to a binding function. + */ public interface BindingsLibrary { Optional resolveBindingsFor(CqlColumnDef def); } diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGModelTransformer.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/api/CGModelTransformer.java similarity index 73% rename from adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGModelTransformer.java rename to adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/api/CGModelTransformer.java index 03bd3bae0..753bc39e4 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGModelTransformer.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/api/CGModelTransformer.java @@ -14,12 +14,17 @@ * limitations under the License. */ -package io.nosqlbench.cqlgen.exporter.transformers; +package io.nosqlbench.cqlgen.api; import io.nosqlbench.cqlgen.model.CqlModel; import java.util.function.Function; +/** + * Most of the functionality of {@link CqlModel} preparation is handled with transformers. + * The type and order of transformers is important, as one transformer may be responsible + * for preparing the model for one or more downstream transformers. + */ public interface CGModelTransformer extends Function { @Override CqlModel apply(CqlModel model); diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/CGTextTransformer.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/api/CGTextTransformer.java similarity index 95% rename from adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/CGTextTransformer.java rename to adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/api/CGTextTransformer.java index f463170ea..74603c446 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/CGTextTransformer.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/api/CGTextTransformer.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.nosqlbench.cqlgen.exporter; +package io.nosqlbench.cqlgen.api; import java.util.function.Function; diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGTransformerConfigurable.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/api/CGTransformerConfigurable.java similarity index 93% rename from adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGTransformerConfigurable.java rename to adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/api/CGTransformerConfigurable.java index 96eb61fc1..1c16368cb 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGTransformerConfigurable.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/api/CGTransformerConfigurable.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.nosqlbench.cqlgen.exporter.transformers; +package io.nosqlbench.cqlgen.api; import java.util.function.Consumer; diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/api/CqlModelInfo.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/api/CqlModelInfo.java new file mode 100644 index 000000000..dbc172b6f --- /dev/null +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/api/CqlModelInfo.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2022 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.cqlgen.api; + +import io.nosqlbench.cqlgen.core.CGSchemaStats; +import io.nosqlbench.cqlgen.model.CqlKeyspace; +import io.nosqlbench.cqlgen.model.CqlTable; +import io.nosqlbench.cqlgen.model.CqlType; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +public interface CqlModelInfo { + + CGSchemaStats getStats(); + + boolean hasStats(); + + Map getKeyspacesByName(); + + List getKeyspaceDefs(); + + Map> getTableDefsByKeyspaceThenTable(); + + List getTablesForKeyspace(String ksname); + + List getTableDefs(); + + Set getAllKnownKeyspaceNames(); + + List getTypeDefs(); + + String getSummaryLine(); + + Map> getTypesByKeyspaceThenName(); +} diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/binders/Binding.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/binders/Binding.java similarity index 96% rename from adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/binders/Binding.java rename to adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/binders/Binding.java index 75e6b961a..213dad584 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/binders/Binding.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/binders/Binding.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.nosqlbench.cqlgen.exporter.binders; +package io.nosqlbench.cqlgen.binders; public class Binding { String name; diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/binders/BindingsAccumulator.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/binders/BindingsAccumulator.java similarity index 98% rename from adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/binders/BindingsAccumulator.java rename to adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/binders/BindingsAccumulator.java index e8f6a0c83..d02ae1f25 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/binders/BindingsAccumulator.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/binders/BindingsAccumulator.java @@ -14,8 +14,9 @@ * limitations under the License. */ -package io.nosqlbench.cqlgen.exporter.binders; +package io.nosqlbench.cqlgen.binders; +import io.nosqlbench.cqlgen.api.BindingsLibrary; import io.nosqlbench.cqlgen.model.CqlColumnDef; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/binders/NamingFolio.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/binders/NamingFolio.java similarity index 97% rename from adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/binders/NamingFolio.java rename to adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/binders/NamingFolio.java index f7d19e4f8..3a10615be 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/binders/NamingFolio.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/binders/NamingFolio.java @@ -14,12 +14,12 @@ * limitations under the License. */ -package io.nosqlbench.cqlgen.exporter.binders; +package io.nosqlbench.cqlgen.binders; import io.nosqlbench.cqlgen.model.CqlColumnDef; import io.nosqlbench.cqlgen.model.CqlModel; import io.nosqlbench.cqlgen.model.CqlTable; -import io.nosqlbench.cqlgen.exporter.CGElementNamer; +import io.nosqlbench.cqlgen.core.CGElementNamer; import io.nosqlbench.api.labels.Labeled; import java.util.*; diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/binders/NamingStyle.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/binders/NamingStyle.java similarity index 96% rename from adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/binders/NamingStyle.java rename to adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/binders/NamingStyle.java index 49886eda6..ae17f6271 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/binders/NamingStyle.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/binders/NamingStyle.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.nosqlbench.cqlgen.exporter.binders; +package io.nosqlbench.cqlgen.binders; public enum NamingStyle { /** diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/binders/UnresolvedBindingException.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/binders/UnresolvedBindingException.java similarity index 95% rename from adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/binders/UnresolvedBindingException.java rename to adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/binders/UnresolvedBindingException.java index 6a5dce36b..360d02035 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/binders/UnresolvedBindingException.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/binders/UnresolvedBindingException.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.nosqlbench.cqlgen.exporter.binders; +package io.nosqlbench.cqlgen.binders; import io.nosqlbench.cqlgen.model.CqlColumnDef; diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/bindspecs/BindingBuilder.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/bindspecs/BindingBuilder.java new file mode 100644 index 000000000..94ec2c3f5 --- /dev/null +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/bindspecs/BindingBuilder.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2022 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.cqlgen.bindspecs; + +public interface BindingBuilder { + BindingBuilder prependRaw(String prefunc); + BindingSpec build(); +} diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/bindspecs/BindingSpec.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/bindspecs/BindingSpec.java new file mode 100644 index 000000000..7c11bc7f7 --- /dev/null +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/bindspecs/BindingSpec.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2022 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.cqlgen.bindspecs; + +import io.nosqlbench.api.labels.Labeled; + +public interface BindingSpec { + + /** + * Is this binding intended to be for a limited population? + * If so, the value will be the maximum cardinality of values which the binding + * is allowed to produce. + * @return The effective cardinality, which could be {@link Double#POSITIVE_INFINITY} + */ + default double getCardinality() { + return Double.POSITIVE_INFINITY; + } + + /** + * The fully qualified name of the entity for which the binding values pertain. + * This is + * @return + */ + Labeled getTarget(); + + String getTypedef(); +} diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/bindspecs/BindingSpecImpl.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/bindspecs/BindingSpecImpl.java new file mode 100644 index 000000000..3b9f3a40b --- /dev/null +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/bindspecs/BindingSpecImpl.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2022 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.cqlgen.bindspecs; + +import io.nosqlbench.api.labels.Labeled; + +public class BindingSpecImpl implements BindingSpec { + private Labeled target; + private double cardinality; + private String typedef; + + public BindingSpecImpl(Labeled target) { + this.target = target; + } + + @Override + public Labeled getTarget() { + return target; + } + + @Override + public String getTypedef() { + return typedef; + } + + @Override + public double getCardinality() { + return BindingSpec.super.getCardinality(); + } + + public void setTarget(Labeled target) { + this.target = target; + } + +} diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/CGColumnRebinder.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/core/CGColumnRebinder.java similarity index 94% rename from adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/CGColumnRebinder.java rename to adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/core/CGColumnRebinder.java index 3cb2113e0..facc133e0 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/CGColumnRebinder.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/core/CGColumnRebinder.java @@ -14,11 +14,11 @@ * limitations under the License. */ -package io.nosqlbench.cqlgen.exporter; +package io.nosqlbench.cqlgen.core; import io.nosqlbench.cqlgen.model.CqlColumnDef; -import io.nosqlbench.cqlgen.exporter.binders.Binding; -import io.nosqlbench.cqlgen.exporter.binders.BindingsAccumulator; +import io.nosqlbench.cqlgen.binders.Binding; +import io.nosqlbench.cqlgen.binders.BindingsAccumulator; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -43,6 +43,7 @@ public class CGColumnRebinder { } } + private Binding dividedBinding(CqlColumnDef column) { CGTableStats stats = column.getTable().getTableAttributes(); if (stats == null) { diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/CGDefaultCqlBindings.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/core/CGDefaultCqlBindings.java similarity index 94% rename from adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/CGDefaultCqlBindings.java rename to adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/core/CGDefaultCqlBindings.java index bafda8f9a..705852c07 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/CGDefaultCqlBindings.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/core/CGDefaultCqlBindings.java @@ -14,11 +14,11 @@ * limitations under the License. */ -package io.nosqlbench.cqlgen.exporter; +package io.nosqlbench.cqlgen.core; import io.nosqlbench.cqlgen.model.CqlColumnDef; -import io.nosqlbench.cqlgen.exporter.binders.Binding; -import io.nosqlbench.cqlgen.exporter.binders.BindingsLibrary; +import io.nosqlbench.cqlgen.binders.Binding; +import io.nosqlbench.cqlgen.api.BindingsLibrary; import io.nosqlbench.engine.api.activityconfig.StatementsLoader; import io.nosqlbench.engine.api.activityconfig.yaml.StmtsDocList; import io.nosqlbench.api.content.Content; diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/CGElementNamer.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/core/CGElementNamer.java similarity index 99% rename from adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/CGElementNamer.java rename to adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/core/CGElementNamer.java index 0a411d185..43b4f356b 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/CGElementNamer.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/core/CGElementNamer.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.nosqlbench.cqlgen.exporter; +package io.nosqlbench.cqlgen.core; import io.nosqlbench.api.labels.Labeled; diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/traverser/CqlDDlDirectoryTraverser.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/core/CGExporterConfig.java similarity index 77% rename from adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/traverser/CqlDDlDirectoryTraverser.java rename to adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/core/CGExporterConfig.java index 3934a15e3..2c460270b 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/traverser/CqlDDlDirectoryTraverser.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/core/CGExporterConfig.java @@ -14,11 +14,10 @@ * limitations under the License. */ -package io.nosqlbench.cqlgen.traverser; +package io.nosqlbench.cqlgen.core; -import java.nio.file.Path; +public class CGExporterConfig { + public CGExporterConfig(String[] args) { -public class CqlDDlDirectoryTraverser { - public void buildWorkloads(Path sourcePath, Path targetPath) { } } diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/CGKeyspaceStats.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/core/CGKeyspaceStats.java similarity index 98% rename from adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/CGKeyspaceStats.java rename to adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/core/CGKeyspaceStats.java index 77606711a..d7b0a8fea 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/CGKeyspaceStats.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/core/CGKeyspaceStats.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.nosqlbench.cqlgen.exporter; +package io.nosqlbench.cqlgen.core; import java.util.HashMap; import java.util.Map; diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/CGLiteralFormat.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/core/CGLiteralFormat.java similarity index 97% rename from adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/CGLiteralFormat.java rename to adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/core/CGLiteralFormat.java index c9c253895..2cdb54d16 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/CGLiteralFormat.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/core/CGLiteralFormat.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.nosqlbench.cqlgen.exporter; +package io.nosqlbench.cqlgen.core; import io.nosqlbench.cqlgen.model.CqlColumnDef; diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/CGSchemaStats.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/core/CGSchemaStats.java similarity index 96% rename from adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/CGSchemaStats.java rename to adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/core/CGSchemaStats.java index 718287b8a..70880cca2 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/CGSchemaStats.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/core/CGSchemaStats.java @@ -14,12 +14,13 @@ * limitations under the License. */ -package io.nosqlbench.cqlgen.exporter; +package io.nosqlbench.cqlgen.core; import java.util.HashMap; import java.util.Map; public class CGSchemaStats { + Map keyspaces = new HashMap(); public Map getKeyspaces() { diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/CGTableStats.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/core/CGTableStats.java similarity index 97% rename from adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/CGTableStats.java rename to adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/core/CGTableStats.java index bc7d37790..97c64a6ca 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/CGTableStats.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/core/CGTableStats.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.nosqlbench.cqlgen.exporter; +package io.nosqlbench.cqlgen.core; import java.util.HashMap; import java.util.Map; diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/CGTextTransformers.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/core/CGTextTransformers.java similarity index 94% rename from adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/CGTextTransformers.java rename to adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/core/CGTextTransformers.java index 356e66d19..9f09ef378 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/CGTextTransformers.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/core/CGTextTransformers.java @@ -14,10 +14,11 @@ * limitations under the License. */ -package io.nosqlbench.cqlgen.exporter; +package io.nosqlbench.cqlgen.core; -import io.nosqlbench.cqlgen.exporter.transformers.CGNameObfuscator; -import io.nosqlbench.cqlgen.exporter.transformers.CGTransformerConfigurable; +import io.nosqlbench.cqlgen.api.CGTextTransformer; +import io.nosqlbench.cqlgen.transformers.CGNameObfuscator; +import io.nosqlbench.cqlgen.api.CGTransformerConfigurable; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/CGWorkloadExporter.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/core/CGWorkloadExporter.java similarity index 93% rename from adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/CGWorkloadExporter.java rename to adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/core/CGWorkloadExporter.java index 55c9a98f3..181e07fe4 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/CGWorkloadExporter.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/core/CGWorkloadExporter.java @@ -14,17 +14,19 @@ * limitations under the License. */ -package io.nosqlbench.cqlgen.exporter; +package io.nosqlbench.cqlgen.core; import com.google.gson.Gson; import com.google.gson.GsonBuilder; -import io.nosqlbench.cqlgen.exporter.binders.BindingsAccumulator; -import io.nosqlbench.cqlgen.exporter.binders.BindingsLibrary; -import io.nosqlbench.cqlgen.exporter.transformers.CGModelTransformers; -import io.nosqlbench.cqlgen.parser.CqlModelParser; -import io.nosqlbench.cqlgen.exporter.binders.Binding; -import io.nosqlbench.cqlgen.exporter.binders.NamingFolio; +import io.nosqlbench.api.spi.BundledApp; +import io.nosqlbench.cqlgen.binders.Binding; +import io.nosqlbench.cqlgen.binders.BindingsAccumulator; +import io.nosqlbench.cqlgen.api.BindingsLibrary; +import io.nosqlbench.cqlgen.binders.NamingFolio; +import io.nosqlbench.cqlgen.transformers.CGModelTransformers; import io.nosqlbench.cqlgen.model.*; +import io.nosqlbench.cqlgen.parser.CqlModelParser; +import io.nosqlbench.nb.annotations.Service; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.snakeyaml.engine.v2.api.Dump; @@ -40,7 +42,6 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardOpenOption; import java.util.*; -import java.util.function.Function; import java.util.stream.Collectors; /** @@ -51,11 +52,12 @@ import java.util.stream.Collectors; * * @see Apache Cassandra CQL Docs */ -public class CGWorkloadExporter { +@Service(value= BundledApp.class,selector = "cqlgen") +public class CGWorkloadExporter implements BundledApp { private final static Logger logger = LogManager.getLogger(CGWorkloadExporter.class); private CGColumnRebinder binder; private NamingFolio namer; - private final CqlModel model; + private CqlModel model; private final int DEFAULT_RESOLUTION = 10000; @@ -79,38 +81,16 @@ public class CGWorkloadExporter { "update", 10.0 )); - public CGWorkloadExporter(CqlModel model, CGModelTransformers transformers) { - this.model = model; - for (Function transformer : transformers.get()) { - CqlModel modified = transformer.apply(this.model); - model = modified; - } - } - - public CGWorkloadExporter(String ddl, Path srcpath, CGModelTransformers transformers) { - this(CqlModelParser.parse(ddl, srcpath), transformers); - } - - public CGWorkloadExporter(String ddl, CGModelTransformers transformers) { - this(ddl, null, transformers); - } - - public CGWorkloadExporter(Path path, CGModelTransformers transformers) { - this(CqlModelParser.parse(path), transformers); - } - - private String loadFile(Path path) { - try { - String ddl = Files.readString(path); - logger.info("read " + ddl.length() + " character DDL file"); - return ddl; - } catch (IOException e) { - throw new RuntimeException(e); - } - - } + private CGExporterConfig config; public static void main(String[] args) { + new CGWorkloadExporter().appMain(args); + } + + @Override + public int appMain(String[] args) { + this.config = new CGExporterConfig(args); + logger.info("running CQL workload exporter with args:" + Arrays.toString(args)); if (args.length == 0) { @@ -145,6 +125,7 @@ public class CGWorkloadExporter { Path cfgpath = Path.of("cqlgen.conf"); CGWorkloadExporter exporter; + if (Files.exists(cfgpath)) { try { CGModelTransformers modelTransformers = new CGModelTransformers(); @@ -172,20 +153,21 @@ public class CGWorkloadExporter { throw new RuntimeException(e); } - exporter = new CGWorkloadExporter(ddl, srcpath, modelTransformers); String defaultNamingTemplate = cfgmap.get("naming_template").toString(); - exporter.setNamingTemplate(defaultNamingTemplate); + setNamingTemplate(defaultNamingTemplate); String partition_multipler = cfgmap.get("partition_multiplier").toString(); - exporter.setPartitionMultiplier(Double.parseDouble(partition_multipler)); + setPartitionMultiplier(Double.parseDouble(partition_multipler)); - exporter.configureTimeouts(cfgmap.get("timeouts")); + configureTimeouts(cfgmap.get("timeouts")); - exporter.configureBlocks(cfgmap.get("blockplan")); - exporter.configureQuantizerDigits(cfgmap.get("quantizer_digits")); + configureBlocks(cfgmap.get("blockplan")); + configureQuantizerDigits(cfgmap.get("quantizer_digits")); - String workload = exporter.getWorkloadAsYaml(); + this.model = CqlModelParser.parse(ddl, srcpath); + + String workload = getWorkloadAsYaml(); try { Files.writeString( target, @@ -201,8 +183,21 @@ public class CGWorkloadExporter { throw new RuntimeException(e); } } + return 0; } + private String loadFile(Path path) { + try { + String ddl = Files.readString(path); + logger.info("read " + ddl.length() + " character DDL file"); + return ddl; + } catch (IOException e) { + throw new RuntimeException(e); + } + + } + + private void configureQuantizerDigits(Object quantizer_digits) { if (quantizer_digits != null) { this.quantizerDigits = Integer.parseInt(quantizer_digits.toString()); @@ -237,10 +232,10 @@ public class CGWorkloadExporter { case "drop-tables" -> genDropTablesBlock(model, blockname); case "drop-keyspaces" -> genDropKeyspacesOpTemplates(model, blockname); case "truncate-tables" -> genTruncateTablesOpTemplates(model, blockname); - case "insert" -> genInsertOpTemplates(model, blockname); - case "select" -> genSelectOpTemplates(model, blockname); - case "scan-10" -> genScanOpTemplates(model, blockname); - case "update" -> genUpdateOpTemplates(model, blockname); + case "insert-seq" -> genInsertOpTemplates(model, blockname); + case "select-seq" -> genSelectOpTemplates(model, blockname); + case "scan-10-seq" -> genScanOpTemplates(model, blockname); + case "update-seq" -> genUpdateOpTemplates(model, blockname); default -> throw new RuntimeException("Unable to create block entries for " + component + "."); }; block.putAll(additions); @@ -446,7 +441,7 @@ public class CGWorkloadExporter { .replaceAll("BINDINGS", String.join(", ", table.getColumnDefinitions().stream() - .map(binder::forColumn) + .map(c -> binder.forColumn(c)) .map(c -> "{" + c.getName() + "}").toList())); } diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGIfNotExistsInjector.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGIfNotExistsInjector.java deleted file mode 100644 index 1310b4997..000000000 --- a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGIfNotExistsInjector.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2022 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.cqlgen.exporter.transformers; - -import io.nosqlbench.cqlgen.model.CqlModel; - -/** - * @deprecated Superseded by direct rendering from AST in generator - */ -public class CGIfNotExistsInjector implements CGModelTransformer { - - @Override - public CqlModel apply(CqlModel model) { -// for (CqlKeyspace keyspace : model.getKeyspaceDefs()) { -// keyspace.setRefDdl(keyspace.getRefddl().replaceAll( -// "(?m)(?s)(?i)(\\s*CREATE (TABLE|KEYSPACE|TYPE) +)(?!IF NOT EXISTS)", -// "$1IF NOT EXISTS " -// )); -// } -// for (CqlTable table : model.getTableDefs()) { -// String refddl = table.getRefDdl(); -// String replaced = refddl.replaceAll( -// "(?m)(?s)(?i)(\\s*CREATE (TABLE|KEYSPACE|TYPE) +)(?!IF NOT EXISTS)", -// "$1IF NOT EXISTS " -// ); -// -// table.setRefDdl(replaced); -// } -// for (CqlType type : model.getTypes()) { -// type.setRefddl(type.getRefDdl().replaceAll( -// "(?m)(?s)(?i)(\\s*CREATE (TABLE|KEYSPACE|TYPE) +)(?!IF NOT EXISTS)", -// "$1IF NOT EXISTS " -// )); -// -// } - return model; - } -} diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/model/ComputedSchemaStats.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/model/ComputedSchemaStats.java new file mode 100644 index 000000000..660de966d --- /dev/null +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/model/ComputedSchemaStats.java @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2022 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.cqlgen.model; + +public class ComputedSchemaStats { +} diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/model/CqlKeyspace.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/model/CqlKeyspace.java index 6192bec3d..6a70af512 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/model/CqlKeyspace.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/model/CqlKeyspace.java @@ -18,7 +18,7 @@ package io.nosqlbench.cqlgen.model; import io.nosqlbench.api.config.NBNamedElement; import io.nosqlbench.api.labels.Labeled; -import io.nosqlbench.cqlgen.exporter.CGKeyspaceStats; +import io.nosqlbench.cqlgen.core.CGKeyspaceStats; import java.util.Map; diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/model/CqlModel.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/model/CqlModel.java index f39d5edb0..3f62f509f 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/model/CqlModel.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/model/CqlModel.java @@ -16,9 +16,10 @@ package io.nosqlbench.cqlgen.model; -import io.nosqlbench.cqlgen.exporter.CGKeyspaceStats; -import io.nosqlbench.cqlgen.exporter.CGSchemaStats; -import io.nosqlbench.cqlgen.exporter.CGTableStats; +import io.nosqlbench.cqlgen.api.CqlModelInfo; +import io.nosqlbench.cqlgen.core.CGKeyspaceStats; +import io.nosqlbench.cqlgen.core.CGSchemaStats; +import io.nosqlbench.cqlgen.core.CGTableStats; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -26,30 +27,49 @@ import java.util.*; import java.util.function.Supplier; /** + *

* This model contains definition level details for schema elements which are parsed from the * Antlr4 CQL grammar. - * Because keyspace, table, column, and type elements are handled sometimes in different ways, - * these are stored in separate data structures. - * When you see a *refddl or similar field, this is a copy of the text image from the original - * parsed syntax. These are used for populating schema blocks without doing a full parse. - * If you update either the refddl or the actual AST level elements for any of the types in this - * model, you are required to update the other version along with it, using string substitution - * if necessary. + * Key elements include: + *

    + *
  • keyspace definitions, organized by keyspace name
  • + *
  • type definitions, organized by keyspace name
  • + *
  • table definitions with included column definitions, organized by keyspace name
  • + *
+ *

+ * + *

Because keyspace, table, and type elements are handled sometimes in different ways, + * these are stored in separate data structures, mapped by the logical keyspace name. This means + * that you will see table definitions for named keyspaces even if those named keyspaces are not represented + * in the keyspace definitions. This allows for sub-selecting of rendered elements by logical + * name without requiring a fully-interconnected keyspace->table->column object graph. + *

*/ -public class CqlModel { +public class CqlModel implements CqlModelInfo { private final static Logger logger = LogManager.getLogger(CqlModel.class); private final Supplier> errors; - Map keyspaceDefs = new LinkedHashMap<>(); - Map> tableDefs = new LinkedHashMap<>(); - Map> typeDefs = new LinkedHashMap<>(); + private final Map keyspaceDefs = new LinkedHashMap<>(); + private final Map> tableDefs = new LinkedHashMap<>(); + private final Map> typeDefs = new LinkedHashMap<>(); - CGSchemaStats schemaStats = null; + private CGSchemaStats schemaStats = null; + private ComputedSchemaStats computedSchemaStats; - public CGSchemaStats getKeyspaceAttributes() { + @Override + public CGSchemaStats getStats() { return schemaStats; } + @Override + public boolean hasStats() { + return schemaStats!=null; + } + + public ComputedSchemaStats getComputedStats() { + return computedSchemaStats; + } + public void setKeyspaceAttributes(CGSchemaStats schemaStats) { this.schemaStats = schemaStats; for (String statsKeyspacename : schemaStats.getKeyspaces().keySet()) { @@ -64,13 +84,13 @@ public class CqlModel { for (String statsTableName : keyspaceStats.getKeyspaceTables().keySet()) { CGTableStats tableStats = keyspaceStats.getKeyspaceTables().get(statsTableName); Map modelTables = tableDefs.get(statsKeyspacename); - if (modelTables!=null) { + if (modelTables != null) { CqlTable modelTable = modelTables.get(statsTableName); - if (modelTable!=null) { - logger.debug("setting table stats for '" + statsKeyspacename+"."+statsTableName+"'"); + if (modelTable != null) { + logger.debug("setting table stats for '" + statsKeyspacename + "." + statsTableName + "'"); modelTable.setTableAttributes(tableStats); } else { - logger.debug(" skipping table stats for '" + statsKeyspacename + "."+statsTableName+"'"); + logger.debug(" skipping table stats for '" + statsKeyspacename + "." + statsTableName + "'"); } } else { logger.debug(" SKIPPING stats for all tables in keyspace '" + statsKeyspacename + "'"); @@ -83,9 +103,6 @@ public class CqlModel { transient CqlTable table; transient CqlType udt; - public boolean hasStats() { - return schemaStats!=null; - } public CqlModel(Supplier> errorSource) { this.errors = errorSource; @@ -99,10 +116,10 @@ public class CqlModel { keyspace = new CqlKeyspace(); } - public void saveKeyspace(String text,String refddl) { + public void saveKeyspace(String text, String refddl) { keyspace.setKeyspaceName(text); this.keyspaceDefs.put(text, keyspace); - keyspace=null; + keyspace = null; } public void newTable() { @@ -112,7 +129,7 @@ public class CqlModel { public void saveTable(String keyspace, String text) { table.setKeyspace(keyspace); table.setName(text); - this.tableDefs.computeIfAbsent(keyspace, ks->new LinkedHashMap<>()).put(text, table); + this.tableDefs.computeIfAbsent(keyspace, ks -> new LinkedHashMap<>()).put(text, table); table = null; } @@ -123,28 +140,33 @@ public class CqlModel { } } + @Override public Map getKeyspacesByName() { return keyspaceDefs; } + @Override public List getKeyspaceDefs() { return new ArrayList<>(this.keyspaceDefs.values()); } + @Override public Map> getTableDefsByKeyspaceThenTable() { return tableDefs; } + @Override public List getTablesForKeyspace(String ksname) { Map tables = this.tableDefs.get(ksname); - if (tables!=null) { + if (tables != null) { return new ArrayList<>(tables.values()); } return List.of(); } + @Override public List getTableDefs() { - return tableDefs.values().stream().flatMap(m->m.values().stream()).toList(); + return tableDefs.values().stream().flatMap(m -> m.values().stream()).toList(); } @Override @@ -155,7 +177,7 @@ public class CqlModel { sb.append("keyspace '").append(keyspace.getName()).append("':\n"); sb.append(keyspace).append("\n"); - tableDefs.getOrDefault(ks,Map.of()).values().stream() + tableDefs.getOrDefault(ks, Map.of()).values().stream() .forEach(table -> { sb.append("table '").append(table.getName()).append("':\n"); sb.append(table); @@ -167,8 +189,10 @@ public class CqlModel { /** * Get all the keyspace names which have been referenced in any way, whether or not * this was in a keyspace definition or some other DDL like table or udt names. + * * @return A list of all known keyspace names */ + @Override public Set getAllKnownKeyspaceNames() { Set ksnames = new LinkedHashSet<>(); ksnames.addAll(this.keyspaceDefs.keySet()); @@ -196,10 +220,11 @@ public class CqlModel { udt.setKeyspace(keyspace); udt.setName(name); Map ksTypes = this.typeDefs.computeIfAbsent(keyspace, ks -> new LinkedHashMap<>()); - ksTypes.put(udt.getName(),udt); - udt=null; + ksTypes.put(udt.getName(), udt); + udt = null; } + @Override public List getTypeDefs() { ArrayList list = new ArrayList<>(); for (Map cqlTypesByKeyspace : typeDefs.values()) { @@ -222,8 +247,9 @@ public class CqlModel { this.typeDefs.remove(name); } + @Override public String getSummaryLine() { - return "keyspaces: " + keyspaceDefs.size() + ", tables: " + getTableDefs().size() + + return "keyspaces: " + keyspaceDefs.size() + ", tables: " + getTableDefs().size() + ", columns: " + getTableDefs().stream().mapToInt(t -> t.getColumnDefinitions().size()).sum() + ", types: " + getTypeDefs().size(); } @@ -236,7 +262,7 @@ public class CqlModel { } if (this.tableDefs.containsKey(keyspaceName)) { Map tablesForKeyspace = this.tableDefs.remove(keyspaceName); - if (tablesForKeyspace!=null) { + if (tablesForKeyspace != null) { for (CqlTable table : tablesForKeyspace.values()) { table.setKeyspace(newKeyspaceName); } @@ -245,12 +271,12 @@ public class CqlModel { } if (this.typeDefs.containsKey(keyspaceName)) { Map typesForKeyspace = this.typeDefs.remove(keyspaceName); - if (typesForKeyspace!=null) { + if (typesForKeyspace != null) { for (CqlType cqltype : typesForKeyspace.values()) { cqltype.setKeyspace(newKeyspaceName); } } - this.typeDefs.put(newKeyspaceName,typesForKeyspace); + this.typeDefs.put(newKeyspaceName, typesForKeyspace); } } @@ -258,14 +284,14 @@ public class CqlModel { Map tablesInKs = tableDefs.get(extant.getKeySpace()); CqlTable table = tablesInKs.get(extant.getName()); table.setName(newTableName); - tablesInKs.put(table.getName(),table); + tablesInKs.put(table.getName(), table); } public void renameType(String keyspaceName, String typeName, String newTypeName) { - Map typesInKeyspace = typeDefs.get(keyspaceName); + Map typesInKeyspace = typeDefs.get(keyspaceName); CqlType cqlType = typesInKeyspace.remove(typeName); cqlType.setName(newTypeName); - typesInKeyspace.put(newTypeName,cqlType); + typesInKeyspace.put(newTypeName, cqlType); } public void setTableCompactStorage(boolean isCompactStorage) { @@ -280,6 +306,7 @@ public class CqlModel { keyspace.setReplicationData(repldata); } + @Override public Map> getTypesByKeyspaceThenName() { return typeDefs; } @@ -289,6 +316,6 @@ public class CqlModel { } public boolean isEmpty() { - return this.keyspaceDefs.size()==0 && this.tableDefs.size()==0 && this.typeDefs.size()==0; + return this.keyspaceDefs.size() == 0 && this.tableDefs.size() == 0 && this.typeDefs.size() == 0; } } diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/model/CqlTable.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/model/CqlTable.java index 27ccf1b9b..1fe4f038c 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/model/CqlTable.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/model/CqlTable.java @@ -18,7 +18,8 @@ package io.nosqlbench.cqlgen.model; import io.nosqlbench.api.config.NBNamedElement; import io.nosqlbench.api.labels.Labeled; -import io.nosqlbench.cqlgen.exporter.CGTableStats; +import io.nosqlbench.cqlgen.core.CGTableStats; +import io.nosqlbench.cqlgen.transformers.ComputedTableStats; import java.util.*; import java.util.function.Function; @@ -33,6 +34,7 @@ public class CqlTable implements NBNamedElement, Labeled { List clusteringOrders = new ArrayList<>(); List coldefs = new ArrayList<>(); private boolean compactStorage; + private ComputedTableStats computedTableStats; public CqlTable() { } @@ -191,4 +193,12 @@ public class CqlTable implements NBNamedElement, Labeled { public boolean isLastClusteringColumn(int position) { return clustering.length > 0 && position == clustering[clustering.length - 1]; } + + public ComputedTableStats getComputedStats() { + return this.computedTableStats; + } + + public void setComputedStats(ComputedTableStats stats) { + this.computedTableStats = stats; + } } diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGCachingNameRemapper.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CGCachingNameRemapper.java similarity index 97% rename from adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGCachingNameRemapper.java rename to adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CGCachingNameRemapper.java index 9f9d19642..467292a11 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGCachingNameRemapper.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CGCachingNameRemapper.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.nosqlbench.cqlgen.exporter.transformers; +package io.nosqlbench.cqlgen.transformers; import io.nosqlbench.api.config.NBNamedElement; import io.nosqlbench.api.labels.Labeled; diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGGenStatsInjector.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CGGenStatsInjector.java similarity index 90% rename from adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGGenStatsInjector.java rename to adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CGGenStatsInjector.java index bdcfb808e..e81a37503 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGGenStatsInjector.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CGGenStatsInjector.java @@ -14,9 +14,11 @@ * limitations under the License. */ -package io.nosqlbench.cqlgen.exporter.transformers; +package io.nosqlbench.cqlgen.transformers; -import io.nosqlbench.cqlgen.exporter.CGSchemaStats; +import io.nosqlbench.cqlgen.api.CGModelTransformer; +import io.nosqlbench.cqlgen.api.CGTransformerConfigurable; +import io.nosqlbench.cqlgen.core.CGSchemaStats; import io.nosqlbench.cqlgen.model.CqlModel; import java.io.IOException; diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGKeySpaceDDLRemover.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CGKeySpaceDDLRemover.java similarity index 91% rename from adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGKeySpaceDDLRemover.java rename to adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CGKeySpaceDDLRemover.java index b51d39ed6..f600f608d 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGKeySpaceDDLRemover.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CGKeySpaceDDLRemover.java @@ -14,8 +14,9 @@ * limitations under the License. */ -package io.nosqlbench.cqlgen.exporter.transformers; +package io.nosqlbench.cqlgen.transformers; +import io.nosqlbench.cqlgen.api.CGModelTransformer; import io.nosqlbench.cqlgen.model.CqlKeyspace; import io.nosqlbench.cqlgen.model.CqlModel; diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGKeyspaceFilter.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CGKeyspaceFilter.java similarity index 96% rename from adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGKeyspaceFilter.java rename to adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CGKeyspaceFilter.java index 0ef1a8c89..0f98510b8 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGKeyspaceFilter.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CGKeyspaceFilter.java @@ -14,8 +14,10 @@ * limitations under the License. */ -package io.nosqlbench.cqlgen.exporter.transformers; +package io.nosqlbench.cqlgen.transformers; +import io.nosqlbench.cqlgen.api.CGModelTransformer; +import io.nosqlbench.cqlgen.api.CGTransformerConfigurable; import io.nosqlbench.cqlgen.model.CqlModel; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGModelTransformers.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CGModelTransformers.java similarity index 95% rename from adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGModelTransformers.java rename to adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CGModelTransformers.java index ef1c3b4b7..0d897653b 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGModelTransformers.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CGModelTransformers.java @@ -14,8 +14,10 @@ * limitations under the License. */ -package io.nosqlbench.cqlgen.exporter.transformers; +package io.nosqlbench.cqlgen.transformers; +import io.nosqlbench.cqlgen.api.CGModelTransformer; +import io.nosqlbench.cqlgen.api.CGTransformerConfigurable; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGNameObfuscator.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CGNameObfuscator.java similarity index 95% rename from adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGNameObfuscator.java rename to adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CGNameObfuscator.java index 2f4f24737..cfe7e5648 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGNameObfuscator.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CGNameObfuscator.java @@ -20,8 +20,10 @@ * once an element is named, use the same name throughout * prefix each element type with a code for the type */ -package io.nosqlbench.cqlgen.exporter.transformers; +package io.nosqlbench.cqlgen.transformers; +import io.nosqlbench.cqlgen.api.CGModelTransformer; +import io.nosqlbench.cqlgen.api.CGTransformerConfigurable; import io.nosqlbench.cqlgen.model.CqlModel; import io.nosqlbench.cqlgen.model.CqlTable; import io.nosqlbench.cqlgen.model.CqlType; diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGRatioCalculator.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CGRatioCalculator.java similarity index 69% rename from adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGRatioCalculator.java rename to adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CGRatioCalculator.java index 5f62e5ed6..4d4f45916 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGRatioCalculator.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CGRatioCalculator.java @@ -14,9 +14,10 @@ * limitations under the License. */ -package io.nosqlbench.cqlgen.exporter.transformers; +package io.nosqlbench.cqlgen.transformers; -import io.nosqlbench.cqlgen.exporter.CGTableStats; +import io.nosqlbench.cqlgen.api.CGModelTransformer; +import io.nosqlbench.cqlgen.core.CGTableStats; import io.nosqlbench.cqlgen.model.CqlModel; import io.nosqlbench.cqlgen.model.CqlTable; @@ -28,29 +29,30 @@ public class CGRatioCalculator implements CGModelTransformer { // TODO: True this up return model; } + double totalReads = 0.0d; double totalWrites = 0.0d; double totalSpace = 0.0d; - double totalOps=0.0d; + double totalOps = 0.0d; for (CqlTable table : model.getTableDefs()) { CGTableStats tableAttributes = table.getTableAttributes(); - if (tableAttributes==null) { + if (tableAttributes == null) { continue; } String local_read_count = tableAttributes.getAttribute("Local read count"); double reads = Double.parseDouble(local_read_count); - totalReads+=reads; - totalOps+=reads; + totalReads += reads; + totalOps += reads; String local_write_count = table.getTableAttributes().getAttribute("Local write count"); double writes = Double.parseDouble(local_write_count); totalWrites += writes; - totalOps+=writes; + totalOps += writes; String space_used_total = table.getTableAttributes().getAttribute("Space used (total)"); double space = Double.parseDouble(space_used_total); - totalSpace+=space; + totalSpace += space; } for (CqlTable table : model.getTableDefs()) { @@ -59,11 +61,17 @@ public class CGRatioCalculator implements CGModelTransformer { double totalTableReads = reads / totalOps; double totalTableWrites = writes / totalOps; - table.getTableAttributes().setAttribute("weighted_reads", String.valueOf(totalTableReads)); - table.getTableAttributes().setAttribute("weighted_writes", String.valueOf(totalTableWrites)); - table.getTableAttributes().setAttribute("weighted_ops", String.valueOf(totalTableReads+totalTableWrites)); double tableSpaceUsed = Double.parseDouble(table.getTableAttributes().getAttribute("Space used (total)")); - table.getTableAttributes().setAttribute("weighted_space", String.valueOf(tableSpaceUsed / totalSpace)); + double weighted_space = tableSpaceUsed / totalSpace; + double op_share_of_total_ops = totalTableReads + totalTableWrites; + ComputedTableStats computedTableStats = new ComputedTableStats() + .setReadShareOfTotalOps(reads / totalOps) + .setReadShareOfTotalReads(reads / totalReads) + .setWriteShareOfTotalOps(writes / totalOps) + .setWriteShareOfTotalWrites(writes / totalWrites) + .setOpShareOfTotalOps(op_share_of_total_ops) + .setSpaceUsedOfTotalSpace(weighted_space); + table.setComputedStats(computedTableStats); } return model; diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CGRatioSuffixer.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CGRatioSuffixer.java new file mode 100644 index 000000000..7c2f1bdce --- /dev/null +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CGRatioSuffixer.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2022 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.cqlgen.transformers; + +import io.nosqlbench.api.config.standard.*; +import io.nosqlbench.cqlgen.api.CGModelTransformer; +import io.nosqlbench.cqlgen.core.CGSchemaStats; +import io.nosqlbench.cqlgen.model.CqlModel; +import io.nosqlbench.cqlgen.model.CqlTable; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class CGRatioSuffixer implements CGModelTransformer, NBConfigurable { + + private double resolution; + private String format; + + @Override + public CqlModel apply(CqlModel model) { + CGSchemaStats schemastats = model.getStats(); + if (schemastats == null) { + return model; + } + + for (CqlTable tableDef : model.getTableDefs()) { + double opshare = tableDef.getComputedStats().getOpShareOfTotalOps(); + String newname = String.format(this.format, tableDef.getName(), opshare); + model.renameTable(tableDef,newname); + } + + return model; + } + + + @Override + public void applyConfig(NBConfiguration cfg) { + this.format = cfg.get("format", String.class); + if (!format.contains("NAME")) { + throw new RuntimeException("format config param for the CGRatioSuffixer must contain 'NAME', but it is '" + format + "'"); + } + Pattern pattern = Pattern.compile("%(2\\$)?(?\\d+)d"); + Matcher matcher = pattern.matcher(format); + if (!matcher.matches()) { + throw new RuntimeException("Could not find the required decimal format specifier for the format config parameter of " + CGRatioSuffixer.class); + } + this.resolution = Double.parseDouble(matcher.group("resolution")); + + } + + @Override + public NBConfigModel getConfigModel() { + return ConfigModel.of(CGRatioSuffixer.class) + .add(Param.defaultTo("format","%1$s_%2$5d").setDescription( + "The format specifier as in Java String.format, with a required string format for the first arg, and a required decimal format for the second." + )) + .asReadOnly(); + } +} diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGRegexReplacer.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CGRegexReplacer.java similarity index 96% rename from adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGRegexReplacer.java rename to adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CGRegexReplacer.java index d992d9219..0d414bcba 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGRegexReplacer.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CGRegexReplacer.java @@ -14,9 +14,10 @@ * limitations under the License. */ -package io.nosqlbench.cqlgen.exporter.transformers; +package io.nosqlbench.cqlgen.transformers; -import io.nosqlbench.cqlgen.exporter.CGTextTransformer; +import io.nosqlbench.cqlgen.api.CGTransformerConfigurable; +import io.nosqlbench.cqlgen.api.CGTextTransformer; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGReplicationSettingInjector.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CGReplicationSettingInjector.java similarity index 90% rename from adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGReplicationSettingInjector.java rename to adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CGReplicationSettingInjector.java index d0462b1e3..cb1a8b658 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGReplicationSettingInjector.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CGReplicationSettingInjector.java @@ -14,8 +14,10 @@ * limitations under the License. */ -package io.nosqlbench.cqlgen.exporter.transformers; +package io.nosqlbench.cqlgen.transformers; +import io.nosqlbench.cqlgen.api.CGModelTransformer; +import io.nosqlbench.cqlgen.api.CGTransformerConfigurable; import io.nosqlbench.cqlgen.model.CqlKeyspace; import io.nosqlbench.cqlgen.model.CqlModel; diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGUdtReplacer.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CGUdtReplacer.java similarity index 93% rename from adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGUdtReplacer.java rename to adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CGUdtReplacer.java index 6d5d99e51..4dbbebe04 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CGUdtReplacer.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CGUdtReplacer.java @@ -14,8 +14,9 @@ * limitations under the License. */ -package io.nosqlbench.cqlgen.exporter.transformers; +package io.nosqlbench.cqlgen.transformers; +import io.nosqlbench.cqlgen.api.CGModelTransformer; import io.nosqlbench.cqlgen.model.CqlColumnDef; import io.nosqlbench.cqlgen.model.CqlModel; import io.nosqlbench.cqlgen.model.CqlTable; diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/ComputedTableStats.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/ComputedTableStats.java new file mode 100644 index 000000000..3e3d49098 --- /dev/null +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/ComputedTableStats.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2022 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.cqlgen.transformers; + +public class ComputedTableStats { + private double readShareOfTotalOps; + private double readShareOfTotalReads; + private double writeShareOfTotalOps; + private double writeShareOfTotalWrites; + private double opShareOfTotalOps; + private double spaceUsedOfTotalSpace; + + public ComputedTableStats setReadShareOfTotalOps(double v) { + this.readShareOfTotalOps = v; + return this; + } + + public ComputedTableStats setReadShareOfTotalReads(double v) { + this.readShareOfTotalReads =v; + return this; + } + + public ComputedTableStats setWriteShareOfTotalOps(double v) { + this.writeShareOfTotalOps = v; + return this; + } + + public ComputedTableStats setWriteShareOfTotalWrites(double v) { + this.writeShareOfTotalWrites = v; + return this; + } + + public ComputedTableStats setOpShareOfTotalOps(double op_share_total) { + this.opShareOfTotalOps = op_share_total; + return this; + } + + public ComputedTableStats setSpaceUsedOfTotalSpace(double weightedSpace) { + this.spaceUsedOfTotalSpace = weightedSpace; + return this; + } + + public double getOpShareOfTotalOps() { + return opShareOfTotalOps; + } +} diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CqlSchemaStatsParser.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CqlSchemaStatsParser.java similarity index 94% rename from adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CqlSchemaStatsParser.java rename to adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CqlSchemaStatsParser.java index 60a00fec8..b4c824644 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/CqlSchemaStatsParser.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/CqlSchemaStatsParser.java @@ -14,11 +14,11 @@ * limitations under the License. */ -package io.nosqlbench.cqlgen.exporter.transformers; +package io.nosqlbench.cqlgen.transformers; -import io.nosqlbench.cqlgen.exporter.CGKeyspaceStats; -import io.nosqlbench.cqlgen.exporter.CGSchemaStats; -import io.nosqlbench.cqlgen.exporter.CGTableStats; +import io.nosqlbench.cqlgen.core.CGKeyspaceStats; +import io.nosqlbench.cqlgen.core.CGSchemaStats; +import io.nosqlbench.cqlgen.core.CGTableStats; import org.apache.commons.math4.util.Pair; import java.io.BufferedReader; diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/UnusedTableRemover.java b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/UnusedTableRemover.java similarity index 94% rename from adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/UnusedTableRemover.java rename to adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/UnusedTableRemover.java index 127b20106..2ee8cc55d 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/exporter/transformers/UnusedTableRemover.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/cqlgen/transformers/UnusedTableRemover.java @@ -14,8 +14,10 @@ * limitations under the License. */ -package io.nosqlbench.cqlgen.exporter.transformers; +package io.nosqlbench.cqlgen.transformers; +import io.nosqlbench.cqlgen.api.CGModelTransformer; +import io.nosqlbench.cqlgen.api.CGTransformerConfigurable; import io.nosqlbench.cqlgen.model.CqlModel; import io.nosqlbench.cqlgen.model.CqlTable; import org.apache.logging.log4j.LogManager; diff --git a/adapter-cqld4/src/main/resources/cqlgen/cqlgen.conf b/adapter-cqld4/src/main/resources/cqlgen/cqlgen.conf index 8502bd011..b62763cdf 100644 --- a/adapter-cqld4/src/main/resources/cqlgen/cqlgen.conf +++ b/adapter-cqld4/src/main/resources/cqlgen/cqlgen.conf @@ -8,13 +8,13 @@ # outfile: _replaced.cql # replacers: # - - '^(\s*?)\b(options|role|roles|permissions|permission|date|key|timestamp|type|keys)\b(\s+[a-zA-Z][a-zA-Z<>,_ -]*?,?)$' -# - '$1PREFIX$2SUFFIX$3' +# - '$1"$2"$3' # - - '^(.*?PRIMARY KEY.*?)\b(options|role|roles|permissions|permission|date|key|timestamp|type|keys)\b(.*?)$' -# - '$1PREFIX$2SUFFIX$3' +# - '$1"$2"$3' # - - '^(.*?CLUSTERING ORDER BY.+?)\b(options|role|roles|permissions|permission|date|key|timestamp|type|keys)\b(.*?)$' -# - '$1PREFIX$2SUFFIX$3' +# - '$1"$2"$3' # - - '^(\s*?CREATE TABLE.+?)\b(options|role|roles|permissions|permission|date|key|timestamp|type|keys)\b(.*?)$' -# - '$1PREFIX$2SUFFIX$3' +# - '$1"$2"$3' # model_transformers: @@ -27,7 +27,7 @@ model_transformers: - exclude: dsefs_.* - exclude: cfs_.* - exclude: cfs - - exclude: HiveMetaStore + - exclude: Hive.* - exclude: spark_system - include: .* @@ -64,13 +64,13 @@ model_transformers: # as usual. - class: CGRatioCalculator - # if this is set, and the fractional rate of operations against a table - # counting reads and writes is less than the percent threshold, then - # the table will be excluded from all op template generation. - - class: UnusedTableRemover - config: - # this is as a fractional number, so 0.1 is the same as 10% - minimum_threshold: 0.001 +# # if this is set, and the fractional rate of operations against a table +# # counting reads and writes is less than the percent threshold, then +# # the table will be excluded from all op template generation. +# - class: UnusedTableRemover +# config: +# # this is as a fractional number, so 0.1 is the same as 10% +# minimum_threshold: 0.001 # replaces names of keyspaces, tables, and columns with generated values - class: CGNameObfuscator @@ -126,10 +126,10 @@ blockplan: # not needed when tags=block:'drop.*' # drop: drop-types, drop-tables, drop-keyspaces rampup: insert - main-insert: insert - main-select: select - main-scan: scan-10 - main-update: update + main-insert: insert-seq + main-select: select-seq + main-scan: scan-10-seq + main-update: update-seq # not needed when tags=block:'main.*' # main: insert, select, scan-10, update diff --git a/adapter-cqld4/src/test/java/io/nosqlbench/converters/cql/cql/parser/CqlParserHarnessTest.java b/adapter-cqld4/src/test/java/io/nosqlbench/converters/cql/cql/parser/CqlParserHarnessTest.java index a47b7a423..d5b9044f2 100644 --- a/adapter-cqld4/src/test/java/io/nosqlbench/converters/cql/cql/parser/CqlParserHarnessTest.java +++ b/adapter-cqld4/src/test/java/io/nosqlbench/converters/cql/cql/parser/CqlParserHarnessTest.java @@ -16,16 +16,11 @@ package io.nosqlbench.converters.cql.cql.parser; -import io.nosqlbench.cqlgen.exporter.CGWorkloadExporter; -import io.nosqlbench.cqlgen.exporter.transformers.CGModelTransformers; +import io.nosqlbench.cqlgen.core.CGWorkloadExporter; import io.nosqlbench.cqlgen.parser.CqlModelParser; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; -import java.nio.file.Path; - -import static org.assertj.core.api.Assertions.assertThatThrownBy; - public class CqlParserHarnessTest { private final static String ksddl = """ @@ -47,19 +42,13 @@ public class CqlParserHarnessTest { @Test public void testAllTypes() { - CGWorkloadExporter exporter = new CGWorkloadExporter(Path.of("src/test/resources/testschemas/cql_alltypes.cql"), new CGModelTransformers()); + CGWorkloadExporter exporter = new CGWorkloadExporter(); + exporter.appMain(new String[]{"src/test/resources/testschemas/cql_alltypes.cql"}); exporter.setNamingTemplate("[OPTYPE-][COLUMN-][TYPEDEF-][TABLE!]-[KEYSPACE]"); var data = exporter.getWorkloadAsYaml(); } - @Disabled - @Test - public void testGenBasicWorkload() { - CGWorkloadExporter exporter = new CGWorkloadExporter(ddl, new CGModelTransformers()); - assertThatThrownBy(() -> exporter.getWorkloadAsYaml()).isInstanceOf(RuntimeException.class); - } - @Test public void testCqlParserHarnessCombined() { CqlModelParser.parse(ddl, null); diff --git a/adapter-cqld4/src/test/java/io/nosqlbench/converters/cql/exporters/CGElementNamerTest.java b/adapter-cqld4/src/test/java/io/nosqlbench/converters/cql/exporters/CGElementNamerTest.java index 549da0761..01b9141e8 100644 --- a/adapter-cqld4/src/test/java/io/nosqlbench/converters/cql/exporters/CGElementNamerTest.java +++ b/adapter-cqld4/src/test/java/io/nosqlbench/converters/cql/exporters/CGElementNamerTest.java @@ -17,7 +17,7 @@ package io.nosqlbench.converters.cql.exporters; import io.nosqlbench.api.labels.Labeled; -import io.nosqlbench.cqlgen.exporter.CGElementNamer; +import io.nosqlbench.cqlgen.core.CGElementNamer; import org.junit.jupiter.api.Test; import java.util.Map; diff --git a/adapter-cqld4/src/test/java/io/nosqlbench/converters/cql/exporters/CGWorkloadExporterTest.java b/adapter-cqld4/src/test/java/io/nosqlbench/converters/cql/exporters/CGWorkloadExporterTest.java index 20bd1dd14..afacfeea0 100644 --- a/adapter-cqld4/src/test/java/io/nosqlbench/converters/cql/exporters/CGWorkloadExporterTest.java +++ b/adapter-cqld4/src/test/java/io/nosqlbench/converters/cql/exporters/CGWorkloadExporterTest.java @@ -16,7 +16,7 @@ package io.nosqlbench.converters.cql.exporters; -import io.nosqlbench.cqlgen.exporter.CGColumnRebinder; +import io.nosqlbench.cqlgen.core.CGColumnRebinder; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; diff --git a/adapter-cqld4/src/test/java/io/nosqlbench/converters/cql/exporters/NamingFolioTest.java b/adapter-cqld4/src/test/java/io/nosqlbench/converters/cql/exporters/NamingFolioTest.java index 8c37ae8d6..8bfdce609 100644 --- a/adapter-cqld4/src/test/java/io/nosqlbench/converters/cql/exporters/NamingFolioTest.java +++ b/adapter-cqld4/src/test/java/io/nosqlbench/converters/cql/exporters/NamingFolioTest.java @@ -16,7 +16,7 @@ package io.nosqlbench.converters.cql.exporters; -import io.nosqlbench.cqlgen.exporter.binders.NamingFolio; +import io.nosqlbench.cqlgen.binders.NamingFolio; import org.junit.jupiter.api.Test; import java.util.Map;