[
https://issues.apache.org/jira/browse/DRILL-5547?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16083213#comment-16083213
]
ASF GitHub Bot commented on DRILL-5547:
---------------------------------------
Github user paul-rogers commented on a diff in the pull request:
https://github.com/apache/drill/pull/868#discussion_r126835350
--- Diff:
exec/java-exec/src/main/java/org/apache/drill/exec/store/sys/ExtendedOptionIterator.java
---
@@ -0,0 +1,152 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.apache.drill.exec.store.sys;
+
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Arrays;
+
+import com.google.common.collect.Iterators;
+import com.google.common.collect.Lists;
+import org.apache.drill.exec.ops.FragmentContext;
+import org.apache.drill.exec.server.options.OptionManager;
+import org.apache.drill.exec.server.options.OptionValue;
+import org.apache.drill.exec.server.options.OptionValue.Kind;
+import org.apache.drill.exec.server.options.OptionValue.OptionType;
+import org.apache.drill.exec.server.options.SystemOptionManager;
+/*
+ * To extend the original Option iterator to hide the implementation
details and to return the row
+ * which takes precedence over others for an option.This is done by
examining the type as the precendence
+ * order is session - system - default.All the values are represented as
String instead of having multiple
+ * columns and the datatype is provided for type details.
+ */
+public class ExtendedOptionIterator implements Iterator<Object> {
+// private static final org.slf4j.Logger logger =
org.slf4j.LoggerFactory.getLogger(OptionIterator.class);
+
+ private final OptionManager fragmentOptions;
+ private final Iterator<OptionValue> mergedOptions;
+
+ public ExtendedOptionIterator(FragmentContext context) {
+ fragmentOptions = context.getOptions();
+ final Iterator<OptionValue> optionList;
+ mergedOptions = sortOptions(fragmentOptions.iterator());
+ }
+ /*
+ Sort options according to name and the type to remove the redundant
rows
+ for the same option based on the type
+ */
+ public Iterator<OptionValue> sortOptions(Iterator<OptionValue> options)
+ {
+ List<OptionValue> values = Lists.newArrayList(options);
+ List<OptionValue> optionValues = Lists.newArrayList();
+ List<OptionValue> optionValueList = Lists.newArrayList();
+ OptionValue value;
+ OptionType type;
+ OptionValue[] temp = new OptionValue[3];
+
+ for (int i = 0; i < values.size(); i++){
+ value = values.get(i);
+ final OptionValue def =
SystemOptionManager.getValidator(value.name).getDefault();
+ if (value.equalsIgnoreType(def)) {
+ type = OptionType.DEFAULT;
+
optionValueList.add(OptionValue.createOption(value.kind,type,value.name,value.getValue().toString()));
+ } else {
+ type = value.type;
+
optionValueList.add(OptionValue.createOption(value.kind,type,value.name,value.getValue().toString()));
+ }
+ }
+ Collections.sort(optionValueList, new Comparator<OptionValue>() {
+ @Override
+ public int compare(OptionValue v1, OptionValue v2) {
+ int nameCmp = v1.name.compareTo(v2.name);
+ if (nameCmp != 0) {
+ return nameCmp;
+ }
+ return v1.type.compareTo( v2.type);
+ }
+ });
+
+ for (int i = 0; i < optionValueList.size() ;i++ )
+ {
+ value = optionValueList.get(i);
+ type = value.type ;
+ switch (type) {
+ case DEFAULT:
+ temp[2] = value;
+ break;
+ case SYSTEM:
+ temp[1] = value;
+ case SESSION:
+ temp[0] = value;
+ break;
+ }
+ if(i == optionValueList.size() - 1 || (i < optionValueList.size()
&& !value.getName().equals(optionValueList.get(i+1).getName()))) {
+ int j = 0;
+ while (temp[j] == null) {
+ j++;
+ }
+ optionValues.add(temp[j]);
+ Arrays.fill(temp,null);
+ }
+ }
+ return optionValues.iterator();
+ }
+
+ @Override
+ public boolean hasNext() {
+ return mergedOptions.hasNext();
+ }
+
+ @Override
+ public ExtendedOptionValueWrapper next() {
+ final OptionValue value = mergedOptions.next();
+ return new ExtendedOptionValueWrapper(value.name, value.kind,
value.type,value.getValue().toString());
+ }
+
+ public enum Status {
+ BOOT, DEFAULT, CHANGED
+ }
+
+ /**
+ * Wrapper class for Extended Option Value
+ */
+ public static class ExtendedOptionValueWrapper {
+
+ public final String name;
+ public final Kind kind;
+ public final OptionType type;
+ public final String string_value;
--- End diff --
string_value --> value
Since this is a column name, might as well make it simple.
Also, can we include the data type? Each validator can return its type. For
example, LongValidator can return either `Long.class` (kind of messy), or
`OptionDataType.LONG` (which is a bit less messy). Then, convert the internal
type to a nice display name, perhaps mapping to the DrillType. So, a long
becomes `Bigint` or `BIGINT`.
> Drill config options and session options do not work as intended
> ----------------------------------------------------------------
>
> Key: DRILL-5547
> URL: https://issues.apache.org/jira/browse/DRILL-5547
> Project: Apache Drill
> Issue Type: Bug
> Components: Server
> Affects Versions: 1.10.0
> Reporter: Karthikeyan Manivannan
> Assignee: Venkata Jyothsna Donapati
> Fix For: Future
>
>
> In Drill, session options should take precedence over config options. But
> several of these session options are assigned hard-coded default values when
> the option validators are initialized. Because of this config options will
> never be read and honored even if the user did not specify the session
> option.
> ClassCompilerSelector.JAVA_COMPILER_VALIDATOR uses CompilerPolicy.DEFAULT as
> the default value. This default value gets into the session options map via
> the initialization of validators in SystemOptionManager.
> Now any piece of code that tries to check if a session option is set will
> never see a null, so it will always use that value and never try to look into
> the config options. For example, in the following piece of code from
> ClassCompilerSelector (), the policy will never be read from the config file.
> policy = CompilerPolicy.valueOf((value != null) ?
> value.string_val.toUpperCase() :
> config.getString(JAVA_COMPILER_CONFIG).toUpperCase());
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)