mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-27 01:51:59 +00:00
ClickHouse: Added function extractURLParameterNames(URL) [#CONV-8285]
This commit is contained in:
parent
fa761bd984
commit
e2e6032020
@ -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;
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user