Skip to content
Merged
Show file tree
Hide file tree
Changes from 15 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
5f27053
Add punct
joshuali925 Aug 26, 2022
4b08343
Add grok
joshuali925 Aug 26, 2022
7ac9391
Refactor and fix tests
joshuali925 Aug 29, 2022
25f13a7
Add grok and punct expression tests
joshuali925 Aug 29, 2022
ac99785
Fix checkstyle
joshuali925 Aug 30, 2022
8b76ebe
Fix non-included derived fields showing up
joshuali925 Aug 30, 2022
d200791
Update punct regex
joshuali925 Aug 30, 2022
697c4b7
Add punct and grok to parse docs
joshuali925 Aug 30, 2022
858ff61
Remove unused class
joshuali925 Aug 30, 2022
6da106a
Update punct regex and tests
joshuali925 Aug 30, 2022
b65ee40
Initial refactor to split grok and patterns from parse command
joshuali925 Sep 7, 2022
e4a7128
Update tests for refactoring
joshuali925 Sep 7, 2022
1e98b4e
Add docs for patterns and grok
joshuali925 Sep 7, 2022
6dd7a7a
Minor refactors
joshuali925 Sep 8, 2022
f92a48c
Merge branch 'main' into punct
joshuali925 Sep 12, 2022
29e7e00
Address comments
joshuali925 Sep 15, 2022
93091ef
Remove unused class
joshuali925 Sep 15, 2022
9c3b952
Move grok library into common module
joshuali925 Sep 16, 2022
a52f544
Remove unused grok discovery
joshuali925 Sep 19, 2022
3a0cc6b
Improve default patterns performance
joshuali925 Sep 19, 2022
e530734
Add thekrakken/java-grok to NOTICE file
joshuali925 Sep 19, 2022
bc0b49c
Remove punct reference
joshuali925 Sep 26, 2022
f331e09
Merge branch '2.x' into punct
joshuali925 Sep 26, 2022
585ff9e
Sanitize raw string in log
joshuali925 Sep 28, 2022
da52648
Remove stringbuilder
joshuali925 Sep 28, 2022
53c6867
Ignore .pid.lock file
joshuali925 Sep 28, 2022
65bfa78
Add more details for patterns doc
joshuali925 Sep 28, 2022
9ec7825
Add apache logs data to doctest
joshuali925 Sep 28, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions core/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ dependencies {
api "com.fasterxml.jackson.core:jackson-core:${jackson_version}"
api "com.fasterxml.jackson.core:jackson-databind:${jackson_version}"
api "com.fasterxml.jackson.core:jackson-annotations:${jackson_version}"
implementation group: 'io.krakens', name: 'java-grok', version: '0.1.9'
api project(':common')

testImplementation('org.junit.jupiter:junit-jupiter:5.6.2')
Expand Down
66 changes: 58 additions & 8 deletions core/src/main/java/org/opensearch/sql/analysis/Analyzer.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,16 +36,19 @@
import org.opensearch.sql.ast.expression.Let;
import org.opensearch.sql.ast.expression.Literal;
import org.opensearch.sql.ast.expression.Map;
import org.opensearch.sql.ast.expression.PatternsMethod;
import org.opensearch.sql.ast.expression.UnresolvedExpression;
import org.opensearch.sql.ast.tree.AD;
import org.opensearch.sql.ast.tree.Aggregation;
import org.opensearch.sql.ast.tree.Dedupe;
import org.opensearch.sql.ast.tree.Eval;
import org.opensearch.sql.ast.tree.Filter;
import org.opensearch.sql.ast.tree.Grok;
import org.opensearch.sql.ast.tree.Head;
import org.opensearch.sql.ast.tree.Kmeans;
import org.opensearch.sql.ast.tree.Limit;
import org.opensearch.sql.ast.tree.Parse;
import org.opensearch.sql.ast.tree.Patterns;
import org.opensearch.sql.ast.tree.Project;
import org.opensearch.sql.ast.tree.RareTopN;
import org.opensearch.sql.ast.tree.Relation;
Expand All @@ -57,16 +60,19 @@
import org.opensearch.sql.ast.tree.Values;
import org.opensearch.sql.catalog.CatalogService;
import org.opensearch.sql.data.model.ExprMissingValue;
import org.opensearch.sql.data.model.ExprValueUtils;
import org.opensearch.sql.data.type.ExprCoreType;
import org.opensearch.sql.exception.SemanticCheckException;
import org.opensearch.sql.expression.DSL;
import org.opensearch.sql.expression.Expression;
import org.opensearch.sql.expression.LiteralExpression;
import org.opensearch.sql.expression.NamedExpression;
import org.opensearch.sql.expression.ParseExpression;
import org.opensearch.sql.expression.ReferenceExpression;
import org.opensearch.sql.expression.aggregation.Aggregator;
import org.opensearch.sql.expression.aggregation.NamedAggregator;
import org.opensearch.sql.expression.parse.GrokExpression;
import org.opensearch.sql.expression.parse.PatternsExpression;
import org.opensearch.sql.expression.parse.RegexExpression;
import org.opensearch.sql.planner.logical.LogicalAD;
import org.opensearch.sql.planner.logical.LogicalAggregation;
import org.opensearch.sql.planner.logical.LogicalDedupe;
Expand All @@ -83,7 +89,6 @@
import org.opensearch.sql.planner.logical.LogicalSort;
import org.opensearch.sql.planner.logical.LogicalValues;
import org.opensearch.sql.storage.Table;
import org.opensearch.sql.utils.ParseUtils;

/**
* Analyze the {@link UnresolvedPlan} in the {@link AnalysisContext} to construct the {@link
Expand Down Expand Up @@ -347,20 +352,65 @@ public LogicalPlan visitEval(Eval node, AnalysisContext context) {
}

/**
* Build {@link ParseExpression} to context and skip to child nodes.
* Build {@link GrokExpression} to context and skip to child nodes.
*/
@Override
public LogicalPlan visitGrok(Grok node, AnalysisContext context) {
LogicalPlan child = node.getChild().get(0).accept(this, context);
Expression sourceField = expressionAnalyzer.analyze(node.getSourceField(), context);
String pattern = (String) node.getPattern().getValue();
Expression patternExpression = DSL.literal(pattern);

TypeEnvironment curEnv = context.peek();
GrokExpression.getNamedGroupCandidates(pattern).forEach(group -> {
GrokExpression expr = new GrokExpression(sourceField, patternExpression, DSL.literal(group));
curEnv.define(new Symbol(Namespace.FIELD_NAME, group), expr.type());
context.getNamedParseExpressions().add(new NamedExpression(group, expr));
});
return child;
}

/**
* Build {@link RegexExpression} to context and skip to child nodes.
*/
@Override
public LogicalPlan visitParse(Parse node, AnalysisContext context) {
LogicalPlan child = node.getChild().get(0).accept(this, context);
Expression expression = expressionAnalyzer.analyze(node.getExpression(), context);
Expression sourceField = expressionAnalyzer.analyze(node.getSourceField(), context);
String pattern = (String) node.getPattern().getValue();
Expression patternExpression = DSL.literal(pattern);

TypeEnvironment curEnv = context.peek();
ParseUtils.getNamedGroupCandidates(pattern).forEach(group -> {
curEnv.define(new Symbol(Namespace.FIELD_NAME, group), ExprCoreType.STRING);
context.getNamedParseExpressions().add(new NamedExpression(group,
new ParseExpression(expression, patternExpression, DSL.literal(group))));
RegexExpression.getNamedGroupCandidates(pattern).forEach(group -> {
RegexExpression expr =
new RegexExpression(sourceField, patternExpression, DSL.literal(group));
curEnv.define(new Symbol(Namespace.FIELD_NAME, group), expr.type());
context.getNamedParseExpressions().add(new NamedExpression(group, expr));
});
return child;
}

/**
* Build {@link PatternsExpression} to context and skip to child nodes.
*/
@Override
public LogicalPlan visitPatterns(Patterns node, AnalysisContext context) {
LogicalPlan child = node.getChild().get(0).accept(this, context);
Expression sourceField = expressionAnalyzer.analyze(node.getSourceField(), context);
PatternsMethod patternsMethod = node.getPatternsMethod();
java.util.Map<String, Literal> arguments = node.getArguments();
Expression pattern = arguments.containsKey(PatternsExpression.PATTERN_KEY)
? DSL.literal((String) arguments.get(PatternsExpression.PATTERN_KEY).getValue())
: DSL.literal(ExprValueUtils.stringValue(""));
String identifier = arguments.containsKey(PatternsExpression.NEW_FIELD_KEY)
? (String) arguments.get(PatternsExpression.NEW_FIELD_KEY).getValue() : null;

TypeEnvironment curEnv = context.peek();
PatternsExpression.getNamedGroupCandidates(identifier).forEach(group -> {
PatternsExpression expr =
new PatternsExpression(patternsMethod, sourceField, pattern, DSL.literal(group));
curEnv.define(new Symbol(Namespace.FIELD_NAME, group), expr.type());
context.getNamedParseExpressions().add(new NamedExpression(group, expr));
});
return child;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,6 @@
import org.opensearch.sql.expression.LiteralExpression;
import org.opensearch.sql.expression.NamedArgumentExpression;
import org.opensearch.sql.expression.NamedExpression;
import org.opensearch.sql.expression.ParseExpression;
import org.opensearch.sql.expression.ReferenceExpression;
import org.opensearch.sql.expression.aggregation.AggregationState;
import org.opensearch.sql.expression.aggregation.Aggregator;
Expand All @@ -61,6 +60,7 @@
import org.opensearch.sql.expression.function.BuiltinFunctionName;
import org.opensearch.sql.expression.function.BuiltinFunctionRepository;
import org.opensearch.sql.expression.function.FunctionName;
import org.opensearch.sql.expression.parse.ParseExpression;
import org.opensearch.sql.expression.span.SpanExpression;
import org.opensearch.sql.expression.window.aggregation.AggregateWindowFunction;

Expand Down
10 changes: 10 additions & 0 deletions core/src/main/java/org/opensearch/sql/ast/AbstractNodeVisitor.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,12 @@
import org.opensearch.sql.ast.tree.Dedupe;
import org.opensearch.sql.ast.tree.Eval;
import org.opensearch.sql.ast.tree.Filter;
import org.opensearch.sql.ast.tree.Grok;
import org.opensearch.sql.ast.tree.Head;
import org.opensearch.sql.ast.tree.Kmeans;
import org.opensearch.sql.ast.tree.Limit;
import org.opensearch.sql.ast.tree.Parse;
import org.opensearch.sql.ast.tree.Patterns;
import org.opensearch.sql.ast.tree.Project;
import org.opensearch.sql.ast.tree.RareTopN;
import org.opensearch.sql.ast.tree.Relation;
Expand Down Expand Up @@ -184,10 +186,18 @@ public T visitEval(Eval node, C context) {
return visitChildren(node, context);
}

public T visitGrok(Grok node, C context) {
return visitChildren(node, context);
}

public T visitParse(Parse node, C context) {
return visitChildren(node, context);
}

public T visitPatterns(Patterns node, C context) {
return visitChildren(node, context);
}

public T visitLet(Let node, C context) {
return visitChildren(node, context);
}
Expand Down
18 changes: 16 additions & 2 deletions core/src/main/java/org/opensearch/sql/ast/dsl/AstDSL.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import org.opensearch.sql.ast.expression.Map;
import org.opensearch.sql.ast.expression.Not;
import org.opensearch.sql.ast.expression.Or;
import org.opensearch.sql.ast.expression.PatternsMethod;
import org.opensearch.sql.ast.expression.QualifiedName;
import org.opensearch.sql.ast.expression.Span;
import org.opensearch.sql.ast.expression.SpanUnit;
Expand All @@ -44,9 +45,11 @@
import org.opensearch.sql.ast.tree.Dedupe;
import org.opensearch.sql.ast.tree.Eval;
import org.opensearch.sql.ast.tree.Filter;
import org.opensearch.sql.ast.tree.Grok;
import org.opensearch.sql.ast.tree.Head;
import org.opensearch.sql.ast.tree.Limit;
import org.opensearch.sql.ast.tree.Parse;
import org.opensearch.sql.ast.tree.Patterns;
import org.opensearch.sql.ast.tree.Project;
import org.opensearch.sql.ast.tree.RareTopN;
import org.opensearch.sql.ast.tree.RareTopN.CommandType;
Expand Down Expand Up @@ -428,8 +431,19 @@ public static Limit limit(UnresolvedPlan input, Integer limit, Integer offset) {
return new Limit(limit, offset).attach(input);
}

public static Parse parse(UnresolvedPlan input, UnresolvedExpression expression,
public static Grok grok(UnresolvedPlan input, UnresolvedExpression sourceField,
Literal pattern) {
return new Parse(expression, pattern, input);
return new Grok(sourceField, pattern, input);
}

public static Parse parse(UnresolvedPlan input, UnresolvedExpression sourceField,
Literal pattern) {
return new Parse(sourceField, pattern, input);
}

public static Patterns patterns(UnresolvedPlan input, PatternsMethod patternsMethod,
UnresolvedExpression sourceField,
java.util.Map<String, Literal> arguments) {
return new Patterns(patternsMethod, sourceField, arguments, input);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/


package org.opensearch.sql.ast.expression;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public enum PatternsMethod {
REGEX("regex"),
PUNCT("punct");

@Getter
private final String name;
}
61 changes: 61 additions & 0 deletions core/src/main/java/org/opensearch/sql/ast/tree/Grok.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/


package org.opensearch.sql.ast.tree;

import com.google.common.collect.ImmutableList;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import org.opensearch.sql.ast.AbstractNodeVisitor;
import org.opensearch.sql.ast.expression.Literal;
import org.opensearch.sql.ast.expression.UnresolvedExpression;

/**
* AST node represent Grok operation.
*/
@Getter
@Setter
@ToString
@EqualsAndHashCode(callSuper = false)
@RequiredArgsConstructor
@AllArgsConstructor
public class Grok extends UnresolvedPlan {
Comment thread
joshuali925 marked this conversation as resolved.
Outdated
/**
* Field.
*/
private final UnresolvedExpression sourceField;

/**
* Pattern.
*/
private final Literal pattern;

/**
* Child Plan.
*/
private UnresolvedPlan child;

@Override
public Grok attach(UnresolvedPlan child) {
this.child = child;
return this;
}

@Override
public List<UnresolvedPlan> getChild() {
return ImmutableList.of(this.child);
}

@Override
public <T, C> T accept(AbstractNodeVisitor<T, C> nodeVisitor, C context) {
return nodeVisitor.visitGrok(this, context);
}
}
4 changes: 2 additions & 2 deletions core/src/main/java/org/opensearch/sql/ast/tree/Parse.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
import org.opensearch.sql.ast.expression.UnresolvedExpression;

/**
* AST node represent Parse operation.
* AST node represent Parse with regex operation.
*/
@Getter
@Setter
Expand All @@ -31,7 +31,7 @@ public class Parse extends UnresolvedPlan {
/**
* Field.
*/
private final UnresolvedExpression expression;
private final UnresolvedExpression sourceField;

/**
* Pattern.
Expand Down
61 changes: 61 additions & 0 deletions core/src/main/java/org/opensearch/sql/ast/tree/Patterns.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/


package org.opensearch.sql.ast.tree;

import com.google.common.collect.ImmutableList;
import java.util.List;
import java.util.Map;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import org.opensearch.sql.ast.AbstractNodeVisitor;
import org.opensearch.sql.ast.expression.Literal;
import org.opensearch.sql.ast.expression.PatternsMethod;
import org.opensearch.sql.ast.expression.UnresolvedExpression;

/**
* AST node represent extracting log patterns operation.
*/
@Getter
@Setter
@ToString
@EqualsAndHashCode(callSuper = false)
@RequiredArgsConstructor
@AllArgsConstructor
public class Patterns extends UnresolvedPlan {
private final PatternsMethod patternsMethod;
/**
* Field.
*/
private final UnresolvedExpression sourceField;

private final Map<String, Literal> arguments;

/**
* Child Plan.
*/
private UnresolvedPlan child;

@Override
public Patterns attach(UnresolvedPlan child) {
this.child = child;
return this;
}

@Override
public List<UnresolvedPlan> getChild() {
return ImmutableList.of(this.child);
}

@Override
public <T, C> T accept(AbstractNodeVisitor<T, C> nodeVisitor, C context) {
return nodeVisitor.visitPatterns(this, context);
}
}
Loading