package org.apache.drill.exec.expr.fn.impl; //* import io.netty.buffer.DrillBuf; import org.apache.drill.exec.expr.DrillSimpleFunc; import org.apache.drill.exec.expr.annotations.FunctionTemplate; import org.apache.drill.exec.expr.annotations.Output; import org.apache.drill.exec.expr.annotations.Param; import org.apache.drill.exec.expr.holders.NullableVarCharHolder; import org.apache.drill.exec.vector.complex.writer.BaseWriter; import javax.inject.Inject; /* Copyright 2001-2004 The Apache Software Foundation. * * 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. */ @FunctionTemplate( name="parse_query", scope= FunctionTemplate.FunctionScope.SIMPLE, nulls = FunctionTemplate.NullHandling.NULL_IF_NULL ) public class ParseQueryFunction implements DrillSimpleFunc { @Param NullableVarCharHolder input; @Output BaseWriter.ComplexWriter outWriter; @Inject DrillBuf outBuffer; public void setup() { } public void eval() { org.apache.drill.exec.vector.complex.writer.BaseWriter.MapWriter queryMapWriter = outWriter.rootAsMap(); String queryString = org.apache.drill.exec.expr.fn.impl.StringFunctionHelpers.toStringFromUTF8(input.start, input.end, input.buffer); if( queryString.isEmpty() || queryString.equals("null")){ queryString = ""; } String firstLetter = queryString.substring(0, 1); //If the first character is a &, it doesn't split properly. This checks to see if the first character is an & and if so, removes it. if(firstLetter.equals("&")){ queryString = queryString.substring(1); } String[] arguments = queryString.split("&"); for (int i = 0; i < arguments.length; i++) { String[] queryParts = arguments[i].split("="); org.apache.drill.exec.expr.holders.VarCharHolder rowHolder = new org.apache.drill.exec.expr.holders.VarCharHolder(); byte[] rowStringBytes = queryParts[1].getBytes(); outBuffer.reallocIfNeeded(rowStringBytes.length); outBuffer.setBytes(0, rowStringBytes); rowHolder.start = 0; rowHolder.end = rowStringBytes.length; rowHolder.buffer = outBuffer; queryMapWriter.varChar(queryParts[0]).write(rowHolder); } } }