public static long dateToEpochSeconds(Date date) { return epochMillisToEpochSeconds(date.getTime()); } }
@CheckForNull public Date getNullableFieldAsDate(String key) { Object val = getNullableField(key); if (val != null) { if (val instanceof Date) { return (Date)val; } if (val instanceof Number) { return epochSecondsToDate((Number) val); } return EsUtils.parseDateTime((String) val); } return null; }
public Date getFieldAsDate(String key) { Object value = getField(key); if (value instanceof Date) { return (Date)value; } if (value instanceof Number) { return epochSecondsToDate((Number) value); } return EsUtils.parseDateTime((String)value); }
/** * Use this method when you are sure that the value can't be null in ES document. * <p/> * Warning with numbers - even if mapping declares long field, value can be an Integer * instead of an expected Long. The reason is that ES delegates the deserialization of JSON * to Jackson, which doesn't know the field type declared in mapping. See * https://groups.google.com/forum/#!searchin/elasticsearch/getsource$20integer$20long/elasticsearch/jxIY22TmA8U/PyqZPPyYQ0gJ * for more details. Workaround is to cast to java.lang.Number and then to call {@link Number#longValue()} */ public <K> K getField(String key) { K value = getNullableField(key); if (value == null) { throw new IllegalStateException("Value of index field is null: " + key); } return value; }
public void putDocuments(IndexType indexType, BaseDoc... docs) { try { BulkRequestBuilder bulk = SHARED_NODE.client().prepareBulk() .setRefreshPolicy(REFRESH_IMMEDIATE); for (BaseDoc doc : docs) { bulk.add(new IndexRequest(indexType.getIndex(), indexType.getType(), doc.getId()) .parent(doc.getParent()) .routing(doc.getRouting()) .source(doc.getFields())); } BulkResponse bulkResponse = bulk.get(); if (bulkResponse.hasFailures()) { throw new IllegalStateException(bulkResponse.buildFailureMessage()); } } catch (Exception e) { throw Throwables.propagate(e); } }
private void addDatesFilter(Map<String, QueryBuilder> filters, IssueQuery query) { PeriodStart createdAfter = query.createdAfter(); Date createdBefore = query.createdBefore(); validateCreationDateBounds(createdBefore, createdAfter != null ? createdAfter.date() : null); if (createdAfter != null) { filters.put("__createdAfter", QueryBuilders .rangeQuery(FIELD_ISSUE_FUNC_CREATED_AT) .from(BaseDoc.dateToEpochSeconds(createdAfter.date()), createdAfter.inclusive())); } if (createdBefore != null) { filters.put("__createdBefore", QueryBuilders .rangeQuery(FIELD_ISSUE_FUNC_CREATED_AT) .lt(BaseDoc.dateToEpochSeconds(createdBefore))); } Date createdAt = query.createdAt(); if (createdAt != null) { filters.put("__createdAt", termQuery(FIELD_ISSUE_FUNC_CREATED_AT, BaseDoc.dateToEpochSeconds(createdAt))); } }
@Test public void getFieldAsDate() { BaseDoc doc = new BaseDoc(Maps.newHashMap()) { @Override public String getId() { return null; } @Override public String getRouting() { return null; } @Override public String getParent() { return null; } }; Date now = new Date(); doc.setField("javaDate", now); assertThat(doc.getFieldAsDate("javaDate")).isEqualToIgnoringMillis(now); doc.setField("stringDate", EsUtils.formatDateTime(now)); assertThat(doc.getFieldAsDate("stringDate")).isEqualToIgnoringMillis(now); }
@Test public void getNullableFieldAsDate() { BaseDoc doc = new BaseDoc(Maps.newHashMap()) { @Override public String getId() { return null; } @Override public String getRouting() { return null; } @Override public String getParent() { return null; } }; Date now = new Date(); doc.setField("javaDate", now); assertThat(doc.getNullableFieldAsDate("javaDate")).isEqualToIgnoringMillis(now); doc.setField("stringDate", EsUtils.formatDateTime(now)); assertThat(doc.getNullableFieldAsDate("stringDate")).isEqualToIgnoringMillis(now); doc.setField("noValue", null); assertThat(doc.getNullableFieldAsDate("noValue")).isNull(); } }
@Test public void getField() { Map<String, Object> fields = Maps.newHashMap(); fields.put("a_string", "foo"); fields.put("a_int", 42); fields.put("a_null", null); BaseDoc doc = new BaseDoc(fields) { @Override public String getId() { return null; } @Override public String getRouting() { return null; } @Override public String getParent() { return null; } }; assertThat((String) doc.getNullableField("a_string")).isEqualTo("foo"); assertThat((int) doc.getNullableField("a_int")).isEqualTo(42); assertThat((String) doc.getNullableField("a_null")).isNull(); }
private static void addCreatedAfterByProjectsFilter(Map<String, QueryBuilder> filters, IssueQuery query) { Map<String, PeriodStart> createdAfterByProjectUuids = query.createdAfterByProjectUuids(); BoolQueryBuilder boolQueryBuilder = boolQuery(); createdAfterByProjectUuids.forEach((projectUuid, createdAfterDate) -> boolQueryBuilder.should(boolQuery() .filter(termQuery(FIELD_ISSUE_PROJECT_UUID, projectUuid)) .filter(rangeQuery(FIELD_ISSUE_FUNC_CREATED_AT).from(BaseDoc.dateToEpochSeconds(createdAfterDate.date()), createdAfterDate.inclusive())))); filters.put("createdAfterByProjectUuids", boolQueryBuilder); }
@CheckForNull public Date getNullableFieldAsDate(String key) { Object val = getNullableField(key); if (val != null) { if (val instanceof Date) { return (Date)val; } if (val instanceof Number) { return epochSecondsToDate((Number) val); } return EsUtils.parseDateTime((String) val); } return null; }
.filter(projectUuid, boolQuery() .filter(termQuery(FIELD_ISSUE_PROJECT_UUID, projectUuid)) .filter(rangeQuery(FIELD_ISSUE_FUNC_CREATED_AT).gte(epochMillisToEpochSeconds(from)))) .subAggregation( AggregationBuilders.terms("branchUuid").field(FIELD_ISSUE_BRANCH_UUID)
@Test public void getField_fails_if_missing_field() { Map<String, Object> fields = Collections.emptyMap(); BaseDoc doc = new BaseDoc(fields) { @Override public String getId() { return null; } @Override public String getRouting() { return null; } @Override public String getParent() { return null; } }; try { doc.getNullableField("a_string"); fail(); } catch (IllegalStateException e) { assertThat(e).hasMessage("Field a_string not specified in query options"); } }
public Date getFieldAsDate(String key) { Object value = getField(key); if (value instanceof Date) { return (Date)value; } if (value instanceof Number) { return epochSecondsToDate((Number) value); } return EsUtils.parseDateTime((String)value); }
private void addDatesFilter(Map<String, QueryBuilder> filters, IssueQuery query) { PeriodStart createdAfter = query.createdAfter(); Date createdBefore = query.createdBefore(); validateCreationDateBounds(createdBefore, createdAfter != null ? createdAfter.date() : null); if (createdAfter != null) { filters.put("__createdAfter", QueryBuilders .rangeQuery(IssueIndexDefinition.FIELD_ISSUE_FUNC_CREATED_AT) .from(BaseDoc.dateToEpochSeconds(createdAfter.date()), createdAfter.inclusive())); } if (createdBefore != null) { filters.put("__createdBefore", QueryBuilders .rangeQuery(IssueIndexDefinition.FIELD_ISSUE_FUNC_CREATED_AT) .lt(BaseDoc.dateToEpochSeconds(createdBefore))); } Date createdAt = query.createdAt(); if (createdAt != null) { filters.put("__createdAt", termQuery(IssueIndexDefinition.FIELD_ISSUE_FUNC_CREATED_AT, BaseDoc.dateToEpochSeconds(createdAt))); } }
public static long dateToEpochSeconds(Date date) { return epochMillisToEpochSeconds(date.getTime()); } }
/** * Use this method when you are sure that the value can't be null in ES document. * <p/> * Warning with numbers - even if mapping declares long field, value can be an Integer * instead of an expected Long. The reason is that ES delegates the deserialization of JSON * to Jackson, which doesn't know the field type declared in mapping. See * https://groups.google.com/forum/#!searchin/elasticsearch/getsource$20integer$20long/elasticsearch/jxIY22TmA8U/PyqZPPyYQ0gJ * for more details. Workaround is to cast to java.lang.Number and then to call {@link Number#longValue()} */ public <K> K getField(String key) { K value = getNullableField(key); if (value == null) { throw new IllegalStateException("Value of index field is null: " + key); } return value; }
private static void addCreatedAfterByProjectsFilter(Map<String, QueryBuilder> filters, IssueQuery query) { Map<String, PeriodStart> createdAfterByProjectUuids = query.createdAfterByProjectUuids(); BoolQueryBuilder boolQueryBuilder = boolQuery(); createdAfterByProjectUuids.forEach((projectUuid, createdAfterDate) -> boolQueryBuilder.should(boolQuery() .filter(termQuery(IssueIndexDefinition.FIELD_ISSUE_PROJECT_UUID, projectUuid)) .filter(rangeQuery(IssueIndexDefinition.FIELD_ISSUE_FUNC_CREATED_AT).from(BaseDoc.dateToEpochSeconds(createdAfterDate.date()), createdAfterDate.inclusive())))); filters.put("createdAfterByProjectUuids", boolQueryBuilder); }
.filter(projectUuid, boolQuery() .filter(termQuery(IssueIndexDefinition.FIELD_ISSUE_PROJECT_UUID, projectUuid)) .filter(rangeQuery(IssueIndexDefinition.FIELD_ISSUE_FUNC_CREATED_AT).gte(epochMillisToEpochSeconds(from)))) .subAggregation( AggregationBuilders.terms("branchUuid").field(IssueIndexDefinition.FIELD_ISSUE_BRANCH_UUID)