ClickHouse: Added function extractURLParameterNames(URL) [#CONV-8285]

This commit is contained in:
Pavel Kartavyy 2013-08-02 13:55:43 +00:00
parent fa761bd984
commit e2e6032020
2 changed files with 66 additions and 0 deletions

View File

@ -41,6 +41,9 @@ namespace DB
*
* Извлечь все параметры из URL в виде массива строк вида name=value.
* extractURLParameters(URL)
*
* Извлечь все имена параметров из URL в виде массива строк
* extractURLParametersNames(URL)
*
* Убрать указанный параметр из URL.
* cutURLParameter(URL, name)
@ -466,6 +469,67 @@ public:
}
};
class ExtractURLParameterNamesImpl
{
private:
Pos pos;
Pos end;
bool first;
public:
static String getName() { return "extractURLParameterNames"; }
static void checkArguments(const DataTypes & arguments)
{
if (arguments.size() != 1)
throw Exception("Number of arguments for function " + getName() + " doesn't match: passed "
+ toString(arguments.size()) + ", should be 1.",
ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
if (!dynamic_cast<const DataTypeString *>(&*arguments[0]))
throw Exception("Illegal type " + arguments[0]->getName() + " of first argument of function " + getName() + ". Must be String.",
ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
}
void init(Block & block, const ColumnNumbers & arguments) {}
/// Вызывается для каждой следующей строки.
void set(Pos pos_, Pos end_)
{
pos = pos_;
end = end_;
first = true;
}
/// Получить следующий токен, если есть, или вернуть false.
bool get(Pos & token_begin, Pos & token_end)
{
if (pos == NULL)
return false;
if (first)
{
first = false;
pos = strchr(pos, '?');
}else{
pos = strchr(pos, '&');
}
if (pos == NULL)
return false;
++pos;
token_begin = pos;
pos = strpbrk(pos, "=&;#");
if (pos == NULL)
token_end = end;
else
token_end = pos++;
return true;
}
};
class URLHierarchyImpl
{
@ -696,5 +760,6 @@ typedef FunctionsStringSearchToString<CutURLParameterImpl, NameCutURLParameter>
typedef FunctionTokens<ExtractURLParametersImpl> FunctionExtractURLParameters;
typedef FunctionTokens<ExtractURLParametersImpl> FunctionExtractURLParameters;
typedef FunctionTokens<URLHierarchyImpl> FunctionURLHierarchy;
typedef FunctionTokens<ExtractURLParameterNamesImpl> FunctionExtractURLParameterNames;
}

View File

@ -159,6 +159,7 @@ FunctionPtr FunctionFactory::get(
else if (name == "cutQueryStringAndFragment") return new FunctionCutQueryStringAndFragment;
else if (name == "extractURLParameter") return new FunctionExtractURLParameter;
else if (name == "extractURLParameters") return new FunctionExtractURLParameters;
else if (name == "extractURLParameterNames") return new FunctionExtractURLParameterNames;
else if (name == "cutURLParameter") return new FunctionCutURLParameter;
else if (name == "URLHierarchy") return new FunctionURLHierarchy;