package com.airbnb.airpal.api.queries;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.collect.ImmutableList;
import lombok.*;
import org.joda.time.DateTime;
import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@EqualsAndHashCode(callSuper = false)
@AllArgsConstructor
@NoArgsConstructor
public class FeaturedQuery extends UserSavedQuery
{
@NotNull
@JsonProperty
private boolean featured = true;
public FeaturedQuery(QueryWithPlaceholders queryWithPlaceholders,
String user,
String name,
String description,
DateTime createdAt,
UUID uuid,
boolean featured)
{
super(queryWithPlaceholders, user, name, description, createdAt, uuid, featured);
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class Position
{
@JsonProperty
private int row;
@JsonProperty
private int column;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class QueryPlaceholder
{
@JsonProperty
private int length;
@JsonProperty
private Position position;
@JsonProperty
private String name;
@JsonProperty
private String typeRestriction;
}
public static Pattern PLACEHOLDER_PATTERN = Pattern.compile("(\\[\\[placeholder:([\\w-]+)\\]\\])",
Pattern.CASE_INSENSITIVE);
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class QueryWithPlaceholders
{
@JsonProperty
private String query;
@JsonProperty
private List<QueryPlaceholder> placeholders;
public static QueryWithPlaceholders fromQuery(String query)
{
ImmutableList.Builder<QueryPlaceholder> builder = ImmutableList.builder();
Matcher matcher = PLACEHOLDER_PATTERN.matcher(query);
String[] queryLines = query.split("\\r?\\n");
while (matcher.find()) {
int start = matcher.start();
int end = matcher.end();
int line = 0;
for (int i = 0; i < queryLines.length; i++) {
if (queryLines[i].contains(matcher.group(1))) {
line = i;
break;
}
}
builder.add(new QueryPlaceholder((end - start),
new Position(line, start),
matcher.group(2),
null));
}
return new QueryWithPlaceholders(query, builder.build());
}
}
}