From 0d8ce83934b9644b22a6dd1a151b208705ad53e3 Mon Sep 17 00:00:00 2001 From: eldenmoon <15605149486@163.com> Date: Mon, 5 Sep 2022 14:27:08 +0800 Subject: [PATCH 01/30] [feature-dynamic-table](variant) add variant type --- be/src/olap/olap_common.h | 1 + be/src/olap/tablet_schema.h | 1 + be/src/olap/types.cpp | 1 + be/src/runtime/define_primitive_type.h | 1 + be/src/runtime/primitive_type.cpp | 2 + be/src/runtime/raw_value.cpp | 651 ++++++++++++++++++ be/src/runtime/types.cpp | 17 + be/src/runtime/types.h | 8 +- be/src/udf/udf.h | 1 + be/src/vec/CMakeLists.txt | 5 + be/src/vec/core/types.h | 3 + be/src/vec/data_types/data_type.cpp | 2 + be/src/vec/data_types/data_type.h | 1 + be/src/vec/data_types/data_type_factory.cpp | 3 + .../apache/doris/catalog/PrimitiveType.java | 8 + .../org/apache/doris/catalog/ScalarType.java | 1 + .../java/org/apache/doris/catalog/Type.java | 9 +- .../org/apache/doris/catalog/VariantType.java | 79 +++ .../org/apache/doris/common/util/Util.java | 3 +- gensrc/proto/types.proto | 1 + gensrc/thrift/Types.thrift | 5 +- 21 files changed, 799 insertions(+), 4 deletions(-) create mode 100644 be/src/runtime/raw_value.cpp create mode 100644 fe/fe-core/src/main/java/org/apache/doris/catalog/VariantType.java diff --git a/be/src/olap/olap_common.h b/be/src/olap/olap_common.h index dfc01b85087d13..06356d954207b5 100644 --- a/be/src/olap/olap_common.h +++ b/be/src/olap/olap_common.h @@ -141,6 +141,7 @@ enum FieldType { OLAP_FIELD_TYPE_DECIMAL64 = 32, OLAP_FIELD_TYPE_DECIMAL128I = 33, OLAP_FIELD_TYPE_JSONB = 34, + OLAP_FIELD_TYPE_VARIANT = 35 }; // Define all aggregation methods supported by Field diff --git a/be/src/olap/tablet_schema.h b/be/src/olap/tablet_schema.h index 0c154464534946..b208eb384afe29 100644 --- a/be/src/olap/tablet_schema.h +++ b/be/src/olap/tablet_schema.h @@ -54,6 +54,7 @@ class TabletColumn { void set_type(FieldType type) { _type = type; } bool is_key() const { return _is_key; } bool is_nullable() const { return _is_nullable; } + bool is_variant_type() const { return _type == OLAP_FIELD_TYPE_VARIANT; } bool is_bf_column() const { return _is_bf_column; } bool has_bitmap_index() const { return _has_bitmap_index; } bool is_array_type() const { return _type == OLAP_FIELD_TYPE_ARRAY; } diff --git a/be/src/olap/types.cpp b/be/src/olap/types.cpp index 0ccf4b98b168e9..f92c0c0da1acfa 100644 --- a/be/src/olap/types.cpp +++ b/be/src/olap/types.cpp @@ -33,6 +33,7 @@ bool is_scalar_type(FieldType field_type) { case OLAP_FIELD_TYPE_STRUCT: case OLAP_FIELD_TYPE_ARRAY: case OLAP_FIELD_TYPE_MAP: + case OLAP_FIELD_TYPE_VARIANT: return false; default: return true; diff --git a/be/src/runtime/define_primitive_type.h b/be/src/runtime/define_primitive_type.h index 5a87112398543d..8ce3da99f55f28 100644 --- a/be/src/runtime/define_primitive_type.h +++ b/be/src/runtime/define_primitive_type.h @@ -54,6 +54,7 @@ enum PrimitiveType { TYPE_DECIMAL64, /* 29 */ TYPE_DECIMAL128I, /* 30 */ TYPE_JSONB, /* 31 */ + TYPE_VARIANT /* 32 */ }; } diff --git a/be/src/runtime/primitive_type.cpp b/be/src/runtime/primitive_type.cpp index f150e0165a72fd..56eab8131c01fd 100644 --- a/be/src/runtime/primitive_type.cpp +++ b/be/src/runtime/primitive_type.cpp @@ -561,6 +561,8 @@ int get_slot_size(PrimitiveType type) { return sizeof(StringRef); case TYPE_JSONB: return sizeof(JsonBinaryValue); + case TYPE_VARIANT: + return sizeof(StringRef); case TYPE_ARRAY: return sizeof(CollectionValue); case TYPE_MAP: diff --git a/be/src/runtime/raw_value.cpp b/be/src/runtime/raw_value.cpp new file mode 100644 index 00000000000000..8eb6bf59892a56 --- /dev/null +++ b/be/src/runtime/raw_value.cpp @@ -0,0 +1,651 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// This file is copied from +// https://github.com/apache/impala/blob/branch-2.9.0/be/src/runtime/raw-value.cpp +// and modified by Doris + +#include "runtime/raw_value.h" + +#include + +#include "common/consts.h" +#include "runtime/collection_value.h" +#include "runtime/large_int_value.h" +#include "runtime/tuple.h" +#include "util/types.h" +#include "vec/io/io_helper.h" + +namespace doris { + +const int RawValue::ASCII_PRECISION = 16; // print 16 digits for double/float + +void RawValue::print_value_as_bytes(const void* value, const TypeDescriptor& type, + std::stringstream* stream) { + if (value == nullptr) { + return; + } + + const char* chars = reinterpret_cast(value); + const StringValue* string_val = nullptr; + + switch (type.type) { + case TYPE_NULL: + break; + case TYPE_BOOLEAN: + stream->write(chars, sizeof(bool)); + return; + + case TYPE_TINYINT: + stream->write(chars, sizeof(int8_t)); + break; + + case TYPE_SMALLINT: + stream->write(chars, sizeof(int16_t)); + break; + + case TYPE_INT: + stream->write(chars, sizeof(int32_t)); + break; + + case TYPE_BIGINT: + stream->write(chars, sizeof(int64_t)); + break; + + case TYPE_FLOAT: + stream->write(chars, sizeof(float)); + break; + + case TYPE_DOUBLE: + stream->write(chars, sizeof(double)); + break; + + case TYPE_VARCHAR: + case TYPE_HLL: + case TYPE_CHAR: + case TYPE_VARIANT: + case TYPE_STRING: + string_val = reinterpret_cast(value); + stream->write(static_cast(string_val->ptr), string_val->len); + return; + + case TYPE_DATE: + case TYPE_DATETIME: + stream->write(chars, sizeof(DateTimeValue)); + break; + + case TYPE_DATEV2: + stream->write(chars, + sizeof(doris::vectorized::DateV2Value)); + break; + + case TYPE_DATETIMEV2: + stream->write( + chars, + sizeof(doris::vectorized::DateV2Value)); + break; + + case TYPE_DECIMALV2: + stream->write(chars, sizeof(DecimalV2Value)); + break; + + case TYPE_DECIMAL32: + stream->write(chars, 4); + break; + + case TYPE_DECIMAL64: + stream->write(chars, 8); + break; + + case TYPE_DECIMAL128: + stream->write(chars, 16); + break; + + case TYPE_LARGEINT: + stream->write(chars, sizeof(__int128)); + break; + + default: + DCHECK(false) << "bad RawValue::print_value() type: " << type; + } +} + +void RawValue::print_value(const void* value, const TypeDescriptor& type, int scale, + std::stringstream* stream) { + if (value == nullptr) { + *stream << "NULL"; + return; + } + + int old_precision = stream->precision(); + std::ios_base::fmtflags old_flags = stream->flags(); + + if (scale > -1) { + stream->precision(scale); + // Setting 'fixed' causes precision to set the number of digits printed after the + // decimal (by default it sets the maximum number of digits total). + *stream << std::fixed; + } + + std::string tmp; + const StringValue* string_val = nullptr; + + switch (type.type) { + case TYPE_BOOLEAN: { + bool val = *reinterpret_cast(value); + *stream << (val ? "true" : "false"); + return; + } + + case TYPE_TINYINT: + // Extra casting for chars since they should not be interpreted as ASCII. + *stream << static_cast(*reinterpret_cast(value)); + break; + + case TYPE_SMALLINT: + *stream << *reinterpret_cast(value); + break; + + case TYPE_INT: + *stream << *reinterpret_cast(value); + break; + + case TYPE_BIGINT: + *stream << *reinterpret_cast(value); + break; + + case TYPE_FLOAT: + *stream << *reinterpret_cast(value); + break; + + case TYPE_DOUBLE: + *stream << *reinterpret_cast(value); + break; + case TYPE_HLL: + case TYPE_CHAR: + case TYPE_VARCHAR: + case TYPE_STRING: + case TYPE_VARIANT: + string_val = reinterpret_cast(value); + tmp.assign(static_cast(string_val->ptr), string_val->len); + *stream << tmp; + return; + + case TYPE_DATE: + case TYPE_DATETIME: + *stream << *reinterpret_cast(value); + break; + + case TYPE_DATEV2: + *stream << *reinterpret_cast< + const doris::vectorized::DateV2Value*>(value); + break; + + case TYPE_DATETIMEV2: + *stream << *reinterpret_cast< + const doris::vectorized::DateV2Value*>( + value); + break; + + case TYPE_DECIMALV2: + *stream << DecimalV2Value(reinterpret_cast(value)->value).to_string(); + break; + + case TYPE_DECIMAL32: { + auto decimal_val = reinterpret_cast(value); + write_text(*decimal_val, type.scale, *stream); + break; + } + + case TYPE_DECIMAL64: { + auto decimal_val = reinterpret_cast(value); + write_text(*decimal_val, type.scale, *stream); + break; + } + + case TYPE_DECIMAL128: { + auto decimal_val = reinterpret_cast(value); + write_text(*decimal_val, type.scale, *stream); + break; + } + + case TYPE_LARGEINT: + *stream << reinterpret_cast(value)->value; + break; + + case TYPE_ARRAY: { + const CollectionValue* src = reinterpret_cast(value); + auto children_type = type.children.at(0); + auto iter = src->iterator(children_type.type); + *stream << "["; + print_value(iter.get(), children_type, scale, stream); + iter.next(); + for (; iter.has_next(); iter.next()) { + *stream << ", "; + print_value(iter.get(), children_type, scale, stream); + } + *stream << "]"; + break; + } + + default: + DCHECK(false) << "bad RawValue::print_value() type: " << type; + } + + stream->precision(old_precision); + // Undo setting stream to fixed + stream->flags(old_flags); +} + +void RawValue::print_value(const void* value, const TypeDescriptor& type, int scale, + std::string* str) { + if (value == nullptr) { + *str = "NULL"; + return; + } + + std::stringstream out; + out.precision(ASCII_PRECISION); + const StringValue* string_val = nullptr; + std::string tmp; + bool val = false; + + // Special case types that we can print more efficiently without using a std::stringstream + switch (type.type) { + case TYPE_BOOLEAN: + val = *reinterpret_cast(value); + *str = (val ? "true" : "false"); + return; + + case TYPE_CHAR: + case TYPE_VARCHAR: + case TYPE_OBJECT: + case TYPE_HLL: + case TYPE_QUANTILE_STATE: + case TYPE_STRING: { + string_val = reinterpret_cast(value); + std::stringstream ss; + ss << "ptr:" << (void*)string_val->ptr << " len:" << string_val->len; + tmp = ss.str(); + if (string_val->len <= 1000) { + tmp.assign(static_cast(string_val->ptr), string_val->len); + } + str->swap(tmp); + return; + } + case TYPE_NULL: { + *str = "NULL"; + return; + } + default: + print_value(value, type, scale, &out); + } + + *str = out.str(); +} + +void RawValue::write(const void* value, void* dst, const TypeDescriptor& type, MemPool* pool) { + DCHECK(value != nullptr); + + switch (type.type) { + case TYPE_NULL: + break; + case TYPE_BOOLEAN: { + *reinterpret_cast(dst) = *reinterpret_cast(value); + break; + } + + case TYPE_TINYINT: { + *reinterpret_cast(dst) = *reinterpret_cast(value); + break; + } + + case TYPE_SMALLINT: { + *reinterpret_cast(dst) = *reinterpret_cast(value); + break; + } + + case TYPE_INT: { + *reinterpret_cast(dst) = *reinterpret_cast(value); + break; + } + + case TYPE_BIGINT: { + *reinterpret_cast(dst) = *reinterpret_cast(value); + break; + } + + case TYPE_LARGEINT: { + *reinterpret_cast(dst) = *reinterpret_cast(value); + break; + } + + case TYPE_FLOAT: { + *reinterpret_cast(dst) = *reinterpret_cast(value); + break; + } + + case TYPE_TIME: + case TYPE_DOUBLE: { + *reinterpret_cast(dst) = *reinterpret_cast(value); + break; + } + + case TYPE_DATE: + case TYPE_DATETIME: + *reinterpret_cast(dst) = *reinterpret_cast(value); + break; + + case TYPE_DATEV2: + *reinterpret_cast*>( + dst) = + *reinterpret_cast< + const doris::vectorized::DateV2Value*>( + value); + break; + + case TYPE_DATETIMEV2: + *reinterpret_cast*>( + dst) = + *reinterpret_cast*>(value); + break; + + case TYPE_DECIMALV2: + *reinterpret_cast(dst) = *reinterpret_cast(value); + break; + + case TYPE_DECIMAL32: + *reinterpret_cast(dst) = + *reinterpret_cast(value); + break; + case TYPE_DECIMAL64: + *reinterpret_cast(dst) = + *reinterpret_cast(value); + break; + case TYPE_DECIMAL128: + *reinterpret_cast(dst) = + *reinterpret_cast(value); + break; + + case TYPE_OBJECT: + case TYPE_HLL: + case TYPE_QUANTILE_STATE: + case TYPE_VARCHAR: + case TYPE_CHAR: + case TYPE_VARIANT: + case TYPE_STRING: { + const StringValue* src = reinterpret_cast(value); + StringValue* dest = reinterpret_cast(dst); + dest->len = src->len; + + if (pool != nullptr) { + dest->ptr = reinterpret_cast(pool->allocate(dest->len)); + memcpy(dest->ptr, src->ptr, dest->len); + } else { + dest->ptr = src->ptr; + } + + break; + } + case TYPE_ARRAY: { + DCHECK_EQ(type.children.size(), 1); + + const CollectionValue* src = reinterpret_cast(value); + CollectionValue* val = reinterpret_cast(dst); + + if (pool != nullptr) { + const auto& item_type = type.children[0]; + CollectionValue::init_collection(pool, src->size(), item_type.type, val); + ArrayIterator src_iter = src->iterator(item_type.type); + ArrayIterator val_iter = val->iterator(item_type.type); + + val->set_has_null(src->has_null()); + val->copy_null_signs(src); + + while (src_iter.has_next() && val_iter.has_next()) { + val_iter.raw_value_write(src_iter.get(), item_type, pool); + src_iter.next(); + val_iter.next(); + } + } else { + val->shallow_copy(src); + } + break; + } + default: + DCHECK(false) << "RawValue::write(): bad type: " << type; + } +} + +// TODO: can we remove some of this code duplication? Templated allocator? +void RawValue::write(const void* value, const TypeDescriptor& type, void* dst, uint8_t** buf) { + DCHECK(value != nullptr); + switch (type.type) { + case TYPE_BOOLEAN: + *reinterpret_cast(dst) = *reinterpret_cast(value); + break; + case TYPE_TINYINT: + *reinterpret_cast(dst) = *reinterpret_cast(value); + break; + case TYPE_SMALLINT: + *reinterpret_cast(dst) = *reinterpret_cast(value); + break; + case TYPE_INT: + *reinterpret_cast(dst) = *reinterpret_cast(value); + break; + case TYPE_BIGINT: + *reinterpret_cast(dst) = *reinterpret_cast(value); + break; + case TYPE_LARGEINT: + *reinterpret_cast(dst) = *reinterpret_cast(value); + break; + case TYPE_FLOAT: + *reinterpret_cast(dst) = *reinterpret_cast(value); + break; + case TYPE_DOUBLE: + *reinterpret_cast(dst) = *reinterpret_cast(value); + break; + case TYPE_DATE: + case TYPE_DATETIME: + *reinterpret_cast(dst) = *reinterpret_cast(value); + break; + case TYPE_DATEV2: + *reinterpret_cast*>( + dst) = + *reinterpret_cast< + const doris::vectorized::DateV2Value*>( + value); + break; + case TYPE_DATETIMEV2: + *reinterpret_cast*>( + dst) = + *reinterpret_cast*>(value); + break; + case TYPE_VARCHAR: + case TYPE_CHAR: + case TYPE_VARIANT: + case TYPE_STRING: { + DCHECK(buf != nullptr); + const StringValue* src = reinterpret_cast(value); + StringValue* dest = reinterpret_cast(dst); + dest->len = src->len; + dest->ptr = reinterpret_cast(*buf); + memcpy(dest->ptr, src->ptr, dest->len); + *buf += dest->len; + break; + } + + case TYPE_DECIMALV2: + *reinterpret_cast(dst) = *reinterpret_cast(value); + break; + + case TYPE_DECIMAL32: + *reinterpret_cast(dst) = + *reinterpret_cast(value); + break; + case TYPE_DECIMAL64: + *reinterpret_cast(dst) = + *reinterpret_cast(value); + break; + case TYPE_DECIMAL128: + *reinterpret_cast(dst) = + *reinterpret_cast(value); + break; + + default: + DCHECK(false) << "RawValue::write(): bad type: " << type.debug_string(); + } +} + +void RawValue::write(const void* value, Tuple* tuple, const SlotDescriptor* slot_desc, + MemPool* pool) { + if (value == nullptr) { + tuple->set_null(slot_desc->null_indicator_offset()); + } else { + void* slot = tuple->get_slot(slot_desc->tuple_offset()); + RawValue::write(value, slot, slot_desc->type(), pool); + } +} + +int RawValue::compare(const void* v1, const void* v2, const TypeDescriptor& type) { + const StringValue* string_value1; + const StringValue* string_value2; + const DateTimeValue* ts_value1; + const DateTimeValue* ts_value2; + float f1 = 0; + float f2 = 0; + double d1 = 0; + double d2 = 0; + int32_t i1; + int32_t i2; + int64_t b1; + int64_t b2; + + if (nullptr == v1 && nullptr == v2) { + return 0; + } else if (nullptr == v1 && nullptr != v2) { + return -1; + } else if (nullptr != v1 && nullptr == v2) { + return 1; + } + + switch (type.type) { + case TYPE_NULL: + return 0; + + case TYPE_BOOLEAN: + return *reinterpret_cast(v1) - *reinterpret_cast(v2); + + case TYPE_TINYINT: + return *reinterpret_cast(v1) - *reinterpret_cast(v2); + + case TYPE_SMALLINT: + return *reinterpret_cast(v1) - *reinterpret_cast(v2); + + case TYPE_INT: + i1 = *reinterpret_cast(v1); + i2 = *reinterpret_cast(v2); + return i1 > i2 ? 1 : (i1 < i2 ? -1 : 0); + + case TYPE_BIGINT: + b1 = *reinterpret_cast(v1); + b2 = *reinterpret_cast(v2); + return b1 > b2 ? 1 : (b1 < b2 ? -1 : 0); + + case TYPE_FLOAT: + // TODO: can this be faster? (just returning the difference has underflow problems) + f1 = *reinterpret_cast(v1); + f2 = *reinterpret_cast(v2); + return f1 > f2 ? 1 : (f1 < f2 ? -1 : 0); + + case TYPE_DOUBLE: + // TODO: can this be faster? + d1 = *reinterpret_cast(v1); + d2 = *reinterpret_cast(v2); + return d1 > d2 ? 1 : (d1 < d2 ? -1 : 0); + + case TYPE_CHAR: + case TYPE_VARCHAR: + case TYPE_HLL: + case TYPE_VARIANT: + case TYPE_STRING: + string_value1 = reinterpret_cast(v1); + string_value2 = reinterpret_cast(v2); + return string_value1->compare(*string_value2); + + case TYPE_DATE: + case TYPE_DATETIME: + ts_value1 = reinterpret_cast(v1); + ts_value2 = reinterpret_cast(v2); + return *ts_value1 > *ts_value2 ? 1 : (*ts_value1 < *ts_value2 ? -1 : 0); + + case TYPE_DATEV2: { + auto date_v2_value1 = reinterpret_cast< + const doris::vectorized::DateV2Value*>(v1); + auto date_v2_value2 = reinterpret_cast< + const doris::vectorized::DateV2Value*>(v2); + return *date_v2_value1 > *date_v2_value2 ? 1 : (*date_v2_value1 < *date_v2_value2 ? -1 : 0); + } + + case TYPE_DATETIMEV2: { + auto date_v2_value1 = reinterpret_cast< + const doris::vectorized::DateV2Value*>(v1); + auto date_v2_value2 = reinterpret_cast< + const doris::vectorized::DateV2Value*>(v2); + return *date_v2_value1 > *date_v2_value2 ? 1 : (*date_v2_value1 < *date_v2_value2 ? -1 : 0); + } + + case TYPE_DECIMALV2: { + DecimalV2Value decimal_value1(reinterpret_cast(v1)->value); + DecimalV2Value decimal_value2(reinterpret_cast(v2)->value); + return (decimal_value1 > decimal_value2) ? 1 : (decimal_value1 < decimal_value2 ? -1 : 0); + } + + case TYPE_DECIMAL32: { + i1 = *reinterpret_cast(v1); + i2 = *reinterpret_cast(v2); + return i1 > i2 ? 1 : (i1 < i2 ? -1 : 0); + } + + case TYPE_DECIMAL64: { + b1 = *reinterpret_cast(v1); + b2 = *reinterpret_cast(v2); + return b1 > b2 ? 1 : (b1 < b2 ? -1 : 0); + } + + case TYPE_DECIMAL128: { + __int128 large_int_value1 = reinterpret_cast(v1)->value; + __int128 large_int_value2 = reinterpret_cast(v2)->value; + return large_int_value1 > large_int_value2 ? 1 + : (large_int_value1 < large_int_value2 ? -1 : 0); + } + + case TYPE_LARGEINT: { + __int128 large_int_value1 = reinterpret_cast(v1)->value; + __int128 large_int_value2 = reinterpret_cast(v2)->value; + return large_int_value1 > large_int_value2 ? 1 + : (large_int_value1 < large_int_value2 ? -1 : 0); + } + + default: + DCHECK(false) << "invalid type: " << type.type; + return 0; + }; +} + +} // namespace doris diff --git a/be/src/runtime/types.cpp b/be/src/runtime/types.cpp index 53a087e9108592..333bf90a1400cc 100644 --- a/be/src/runtime/types.cpp +++ b/be/src/runtime/types.cpp @@ -78,6 +78,13 @@ TypeDescriptor::TypeDescriptor(const std::vector& types, int* idx) } break; } + case TTypeNodeType::VARIANT: { + DCHECK(!node.__isset.scalar_type); + // variant column must be the last column + DCHECK_EQ(*idx, types.size() - 1); + type = TYPE_VARIANT; + break; + } // case TTypeNodeType::STRUCT: // type = TYPE_STRUCT; // for (int i = 0; i < node.struct_fields.size(); ++i) { @@ -120,6 +127,8 @@ void TypeDescriptor::to_thrift(TTypeDesc* thrift_type) const { } else if (type == TYPE_MAP) { //TODO(xy): need to process children for map node.type = TTypeNodeType::MAP; + } else if (type == TYPE_VARIANT) { + node.type = TTypeNodeType::VARIANT; } else { DCHECK_EQ(type, TYPE_STRUCT); node.type = TTypeNodeType::STRUCT; @@ -186,6 +195,8 @@ void TypeDescriptor::to_protobuf(PTypeDesc* ptype) const { for (const TypeDescriptor& child : children) { child.to_protobuf(ptype); } + } else if (type == TYPE_VARIANT) { + node->set_type(TTypeNodeType::VARIANT); } } @@ -247,6 +258,9 @@ TypeDescriptor::TypeDescriptor(const google::protobuf::RepeatedPtrField"; return ss.str(); } + case TYPE_VARIANT: + ss << "VARIANT"; + return ss.str(); default: return type_to_string(type); } diff --git a/be/src/runtime/types.h b/be/src/runtime/types.h index 3a5f4f14dd3732..56f17c2c92d729 100644 --- a/be/src/runtime/types.h +++ b/be/src/runtime/types.h @@ -192,7 +192,8 @@ struct TypeDescriptor { } bool is_complex_type() const { - return type == TYPE_STRUCT || type == TYPE_ARRAY || type == TYPE_MAP; + return type == TYPE_STRUCT || type == TYPE_ARRAY || type == TYPE_MAP || + type == TYPE_VARIANT; } bool is_collection_type() const { return type == TYPE_ARRAY || type == TYPE_MAP; } @@ -201,6 +202,11 @@ struct TypeDescriptor { bool is_bitmap_type() const { return type == TYPE_OBJECT; } + bool is_variant() const { return type == TYPE_VARIANT; } + + /// Returns the byte size of this type. Returns 0 for variable length types. + int get_byte_size() const { return ::doris::get_byte_size(type); } + int get_slot_size() const { return ::doris::get_slot_size(type); } static inline int get_decimal_byte_size(int precision) { diff --git a/be/src/udf/udf.h b/be/src/udf/udf.h index 8b62898e45feb6..88b06c5bc110da 100644 --- a/be/src/udf/udf.h +++ b/be/src/udf/udf.h @@ -91,6 +91,7 @@ class FunctionContext { TYPE_DECIMAL64, TYPE_DECIMAL128I, TYPE_JSONB, + TYPE_VARIANT }; struct TypeDesc { diff --git a/be/src/vec/CMakeLists.txt b/be/src/vec/CMakeLists.txt index ede1bdfae47f28..df676a1dd0e37e 100644 --- a/be/src/vec/CMakeLists.txt +++ b/be/src/vec/CMakeLists.txt @@ -57,6 +57,10 @@ set(VEC_FILES columns/column_vector.cpp columns/column_map.cpp columns/columns_common.cpp + columns/column_object.cpp + json/parse2column.cpp + json/path_in_data.cpp + common/object_util.cpp common/demangle.cpp common/exception.cpp common/mremap.cpp @@ -98,6 +102,7 @@ set(VEC_FILES data_types/data_type_time_v2.cpp data_types/data_type_jsonb.cpp data_types/data_type_time.cpp + data_types/data_type_object.cpp exec/vaggregation_node.cpp exec/varrow_scanner.cpp exec/vsort_node.cpp diff --git a/be/src/vec/core/types.h b/be/src/vec/core/types.h index 8e62fed5973955..09199be89bc3d2 100644 --- a/be/src/vec/core/types.h +++ b/be/src/vec/core/types.h @@ -84,6 +84,7 @@ enum class TypeIndex { Decimal128I, Map, Struct, + VARIANT, }; struct Consted { @@ -587,6 +588,8 @@ inline const char* getTypeName(TypeIndex idx) { return "AggregateFunction"; case TypeIndex::LowCardinality: return "LowCardinality"; + case TypeIndex::VARIANT: + return "Variant"; case TypeIndex::BitMap: return TypeName::get(); case TypeIndex::HLL: diff --git a/be/src/vec/data_types/data_type.cpp b/be/src/vec/data_types/data_type.cpp index 3fa53aa49c7d80..74c12118000493 100644 --- a/be/src/vec/data_types/data_type.cpp +++ b/be/src/vec/data_types/data_type.cpp @@ -137,6 +137,8 @@ PGenericType_TypeId IDataType::get_pdata_type(const IDataType* data_type) { return PGenericType::DATEV2; case TypeIndex::DateTime: return PGenericType::DATETIME; + case TypeIndex::VARIANT: + return PGenericType::VARIANT; case TypeIndex::DateTimeV2: return PGenericType::DATETIMEV2; case TypeIndex::BitMap: diff --git a/be/src/vec/data_types/data_type.h b/be/src/vec/data_types/data_type.h index e223f4a2e2446e..c287e7281ceb70 100644 --- a/be/src/vec/data_types/data_type.h +++ b/be/src/vec/data_types/data_type.h @@ -321,6 +321,7 @@ struct WhichDataType { bool is_nullable() const { return idx == TypeIndex::Nullable; } bool is_function() const { return idx == TypeIndex::Function; } bool is_aggregate_function() const { return idx == TypeIndex::AggregateFunction; } + bool is_variant() const { return idx == TypeIndex::VARIANT; } }; /// IDataType helpers (alternative for IDataType virtual methods with single point of truth) diff --git a/be/src/vec/data_types/data_type_factory.cpp b/be/src/vec/data_types/data_type_factory.cpp index 6d26e02b8cb11e..a425a8534af675 100644 --- a/be/src/vec/data_types/data_type_factory.cpp +++ b/be/src/vec/data_types/data_type_factory.cpp @@ -135,6 +135,9 @@ DataTypePtr DataTypeFactory::create_data_type(const TypeDescriptor& col_desc, bo break; case TYPE_STRING: case TYPE_CHAR: + case TYPE_VARIANT: + // no need to be wrapped in Nullable + return std::make_shared("json", true); case TYPE_VARCHAR: case TYPE_BINARY: nested = std::make_shared(); diff --git a/fe/fe-common/src/main/java/org/apache/doris/catalog/PrimitiveType.java b/fe/fe-common/src/main/java/org/apache/doris/catalog/PrimitiveType.java index b14d55010252ca..04fc20b70f2f57 100644 --- a/fe/fe-common/src/main/java/org/apache/doris/catalog/PrimitiveType.java +++ b/fe/fe-common/src/main/java/org/apache/doris/catalog/PrimitiveType.java @@ -74,6 +74,7 @@ public enum PrimitiveType { // Unsupported scalar types. BINARY("BINARY", -1, TPrimitiveType.BINARY), ALL("ALL", -1, TPrimitiveType.INVALID_TYPE); + VARIANT("VARIANT", 24, TPrimitiveType.VARIANT), private static final int DATE_INDEX_LEN = 3; @@ -557,6 +558,7 @@ public static ImmutableSetMultimap getImplicitCast supportedTypes.add(ARRAY); supportedTypes.add(MAP); supportedTypes.add(QUANTILE_STATE); + supportedTypes.add(VARIANT); } public static ArrayList getIntegerTypes() { @@ -1004,6 +1006,8 @@ public static PrimitiveType fromThrift(TPrimitiveType tPrimitiveType) { return STRUCT; case ALL: return ALL; + case VARIANT: + return VARIANT; default: return INVALID_TYPE; } @@ -1112,6 +1116,10 @@ public boolean isComplexType() { return this == HLL || this == BITMAP; } + public boolean isVariantType(){ + return this == VARIANT; + } + public boolean isStringType() { return (this == VARCHAR || this == CHAR || this == HLL || this == STRING); } diff --git a/fe/fe-common/src/main/java/org/apache/doris/catalog/ScalarType.java b/fe/fe-common/src/main/java/org/apache/doris/catalog/ScalarType.java index fe1fffbc10ecbc..342a5e3b004fb9 100644 --- a/fe/fe-common/src/main/java/org/apache/doris/catalog/ScalarType.java +++ b/fe/fe-common/src/main/java/org/apache/doris/catalog/ScalarType.java @@ -603,6 +603,7 @@ public String toSql(int depth) { case DATEV2: case HLL: case BITMAP: + case VARIANT: case QUANTILE_STATE: stringBuilder.append(type.toString().toLowerCase()); break; diff --git a/fe/fe-common/src/main/java/org/apache/doris/catalog/Type.java b/fe/fe-common/src/main/java/org/apache/doris/catalog/Type.java index 9e98ed01e59b30..ede6babfdaff34 100644 --- a/fe/fe-common/src/main/java/org/apache/doris/catalog/Type.java +++ b/fe/fe-common/src/main/java/org/apache/doris/catalog/Type.java @@ -474,6 +474,10 @@ public boolean isComplexType() { return isStructType() || isCollectionType(); } + public boolean isVariantType() { + return this instanceof VariantType; + } + public boolean isCollectionType() { return isMapType() || isArrayType() || isMultiRowType() || isStructType(); } @@ -780,6 +784,8 @@ public static Type fromPrimitiveType(PrimitiveType type) { return Type.BITMAP; case QUANTILE_STATE: return Type.QUANTILE_STATE; + case VARIANT: + return new VariantType(); default: return null; } @@ -1553,7 +1559,8 @@ public Integer getNumPrecRadix() { || t1 == PrimitiveType.TIMEV2 || t2 == PrimitiveType.TIMEV2 || t1 == PrimitiveType.MAP || t2 == PrimitiveType.MAP || t1 == PrimitiveType.STRUCT || t2 == PrimitiveType.STRUCT - || t1 == PrimitiveType.UNSUPPORTED || t2 == PrimitiveType.UNSUPPORTED) { + || t1 == PrimitiveType.UNSUPPORTED || t2 == PrimitiveType.UNSUPPORTED + || t1 == PrimitiveType.VARIANT|| t2 == PrimitiveType.VARIANT) { continue; } Preconditions.checkNotNull(compatibilityMatrix[i][j]); diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/VariantType.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/VariantType.java new file mode 100644 index 00000000000000..5d901876498126 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/VariantType.java @@ -0,0 +1,79 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.doris.catalog; + +import org.apache.doris.common.Config; +import org.apache.doris.thrift.TTypeDesc; +import org.apache.doris.thrift.TTypeNode; +import org.apache.doris.thrift.TTypeNodeType; + +public class VariantType extends Type { + public VariantType() { + + } + + @Override + public String toSql(int depth) { + return "VARIANT"; + } + + @Override + protected String prettyPrint(int lpad) { + return "VARIANT"; + } + + @Override + public boolean equals(Object other) { + return other instanceof VariantType; + } + + @Override + public void toThrift(TTypeDesc container) { + TTypeNode node = new TTypeNode(); + container.types.add(node); + node.setType(TTypeNodeType.VARIANT); + } + + @Override + public String toString() { + return toSql(0); + } + + @Override + public PrimitiveType getPrimitiveType() { + return PrimitiveType.VARIANT; + } + + @Override + public boolean supportsTablePartitioning() { + return false; + } + @Override + public int getSlotSize() { + return PrimitiveType.VARIANT.getSlotSize(); + } + + @Override + public boolean isSupported() { + return Config.enable_complex_type_support; + } + @Override + public boolean matchesType(Type t) { + return t.isVariantType() || t.isStringType(); + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/util/Util.java b/fe/fe-core/src/main/java/org/apache/doris/common/util/Util.java index 4dcb130087a533..80e88c2f0cd782 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/common/util/Util.java +++ b/fe/fe-core/src/main/java/org/apache/doris/common/util/Util.java @@ -86,7 +86,8 @@ public class Util { TYPE_STRING_MAP.put(PrimitiveType.BOOLEAN, "bool"); TYPE_STRING_MAP.put(PrimitiveType.BITMAP, "bitmap"); TYPE_STRING_MAP.put(PrimitiveType.QUANTILE_STATE, "quantile_state"); - TYPE_STRING_MAP.put(PrimitiveType.ARRAY, "Array<%s>"); + TYPE_STRING_MAP.put(PrimitiveType.ARRAY, "array<%s>"); + TYPE_STRING_MAP.put(PrimitiveType.VARIANT, "variant"); TYPE_STRING_MAP.put(PrimitiveType.NULL_TYPE, "null"); } diff --git a/gensrc/proto/types.proto b/gensrc/proto/types.proto index dea020d0b4d03b..ff2e3ab1119e5b 100644 --- a/gensrc/proto/types.proto +++ b/gensrc/proto/types.proto @@ -105,6 +105,7 @@ message PGenericType { FIXEDLENGTHOBJECT = 30; JSONB = 31; DECIMAL128I = 32; + VARIANT = 33; UNKNOWN = 999; } required TypeId id = 2; diff --git a/gensrc/thrift/Types.thrift b/gensrc/thrift/Types.thrift index d6f05a0be2d24e..048f0e27cb6786 100644 --- a/gensrc/thrift/Types.thrift +++ b/gensrc/thrift/Types.thrift @@ -92,13 +92,16 @@ enum TPrimitiveType { DECIMAL128I, JSONB, UNSUPPORTED + DECIMAL128, + VARIANT, } enum TTypeNodeType { SCALAR, ARRAY, MAP, - STRUCT + STRUCT, + VARIANT = 100, } enum TStorageBackendType { From 61fd41dd7e3459a0ecb6a53f3064bcb7502f77b8 Mon Sep 17 00:00:00 2001 From: eldenmoon <15605149486@163.com> Date: Mon, 5 Sep 2022 14:58:16 +0800 Subject: [PATCH 02/30] [feature-dynamic-table](column-object) Add a new ColumnObject and it's util functions --- be/src/runtime/primitive_type.cpp | 33 + be/src/runtime/primitive_type.h | 2 + be/src/vec/CMakeLists.txt | 1 + be/src/vec/columns/column.h | 9 + be/src/vec/columns/column_array.h | 7 + be/src/vec/columns/column_complex.h | 4 + be/src/vec/columns/column_const.h | 6 + be/src/vec/columns/column_decimal.h | 2 + be/src/vec/columns/column_dictionary.h | 4 + be/src/vec/columns/column_dummy.h | 4 + be/src/vec/columns/column_nothing.h | 2 + be/src/vec/columns/column_nullable.h | 2 + be/src/vec/columns/column_object.cpp | 828 ++++++++++++++++++ be/src/vec/columns/column_object.h | 357 ++++++++ be/src/vec/columns/column_set.h | 2 + be/src/vec/columns/column_string.h | 11 + be/src/vec/columns/column_vector.h | 1 + be/src/vec/columns/predicate_column.h | 4 + be/src/vec/columns/subcolumn_tree.h | 195 +++++ be/src/vec/common/hash_table/hash_map.h | 7 + be/src/vec/common/object_util.cpp | 730 +++++++++++++++ be/src/vec/common/object_util.h | 146 +++ be/src/vec/common/sip_hash.h | 6 + be/src/vec/common/typeid_cast.h | 8 + be/src/vec/core/accurate_comparison.h | 30 +- be/src/vec/core/field.h | 88 +- be/src/vec/core/types.h | 4 + .../vec/data_types/convert_field_to_type.cpp | 217 +++++ be/src/vec/data_types/convert_field_to_type.h | 37 + be/src/vec/data_types/data_type.h | 4 + be/src/vec/data_types/data_type_factory.cpp | 8 +- be/src/vec/data_types/data_type_object.cpp | 127 +++ be/src/vec/data_types/data_type_object.h | 53 ++ be/src/vec/data_types/get_least_supertype.cpp | 382 +++++--- be/src/vec/data_types/get_least_supertype.h | 12 +- be/src/vec/functions/function_cast.h | 9 +- be/src/vec/functions/if.cpp | 5 +- be/src/vec/io/var_int.h | 1 + 38 files changed, 3179 insertions(+), 169 deletions(-) create mode 100644 be/src/vec/columns/column_object.cpp create mode 100644 be/src/vec/columns/column_object.h create mode 100644 be/src/vec/columns/subcolumn_tree.h create mode 100644 be/src/vec/common/object_util.cpp create mode 100644 be/src/vec/common/object_util.h create mode 100644 be/src/vec/data_types/convert_field_to_type.cpp create mode 100644 be/src/vec/data_types/convert_field_to_type.h create mode 100644 be/src/vec/data_types/data_type_object.cpp create mode 100644 be/src/vec/data_types/data_type_object.h diff --git a/be/src/runtime/primitive_type.cpp b/be/src/runtime/primitive_type.cpp index 56eab8131c01fd..8443be30295b03 100644 --- a/be/src/runtime/primitive_type.cpp +++ b/be/src/runtime/primitive_type.cpp @@ -550,6 +550,39 @@ TTypeDesc gen_type_desc(const TPrimitiveType::type val, const std::string& name) return type_desc; } +PrimitiveType get_primitive_type(vectorized::TypeIndex v_type) { + switch (v_type) { + case vectorized::TypeIndex::Int8: + return PrimitiveType::TYPE_TINYINT; + case vectorized::TypeIndex::Int16: + return PrimitiveType::TYPE_SMALLINT; + case vectorized::TypeIndex::Int32: + return PrimitiveType::TYPE_INT; + case vectorized::TypeIndex::Int64: + return PrimitiveType::TYPE_BIGINT; + case vectorized::TypeIndex::Float32: + return PrimitiveType::TYPE_FLOAT; + case vectorized::TypeIndex::Float64: + return PrimitiveType::TYPE_DOUBLE; + case vectorized::TypeIndex::Decimal32: + return PrimitiveType::TYPE_DECIMALV2; + case vectorized::TypeIndex::Array: + return PrimitiveType::TYPE_ARRAY; + case vectorized::TypeIndex::String: + return PrimitiveType::TYPE_STRING; + case vectorized::TypeIndex::Date: + return PrimitiveType::TYPE_DATE; + case vectorized::TypeIndex::DateTime: + return PrimitiveType::TYPE_DATETIME; + case vectorized::TypeIndex::Tuple: + return PrimitiveType::TYPE_STRUCT; + // TODO add vectorized::more types + default: + LOG(FATAL) << "unknow data_type: " << getTypeName(v_type); + return PrimitiveType::INVALID_TYPE; + } +} + int get_slot_size(PrimitiveType type) { switch (type) { case TYPE_CHAR: diff --git a/be/src/runtime/primitive_type.h b/be/src/runtime/primitive_type.h index e3f3e8390013f2..f6dacd1858b01c 100644 --- a/be/src/runtime/primitive_type.h +++ b/be/src/runtime/primitive_type.h @@ -103,6 +103,8 @@ int get_slot_size(PrimitiveType type); bool is_type_compatible(PrimitiveType lhs, PrimitiveType rhs); +PrimitiveType get_primitive_type(vectorized::TypeIndex v_type); + TExprOpcode::type to_in_opcode(PrimitiveType t); PrimitiveType thrift_to_type(TPrimitiveType::type ttype); TPrimitiveType::type to_thrift(PrimitiveType ptype); diff --git a/be/src/vec/CMakeLists.txt b/be/src/vec/CMakeLists.txt index df676a1dd0e37e..226ad840fa4f83 100644 --- a/be/src/vec/CMakeLists.txt +++ b/be/src/vec/CMakeLists.txt @@ -96,6 +96,7 @@ set(VEC_FILES data_types/data_type_decimal.cpp data_types/data_type_map.cpp data_types/get_least_supertype.cpp + data_types/convert_field_to_type.cpp data_types/nested_utils.cpp data_types/data_type_date.cpp data_types/data_type_date_time.cpp diff --git a/be/src/vec/columns/column.h b/be/src/vec/columns/column.h index ef78f10468203f..5916dd672dd0da 100644 --- a/be/src/vec/columns/column.h +++ b/be/src/vec/columns/column.h @@ -134,6 +134,7 @@ class IColumn : public COW { virtual void set_rowset_segment_id(std::pair rowset_segment_id) {} virtual std::pair get_rowset_segment_id() const { return {}; } + virtual TypeIndex get_data_type() const = 0; /// Returns number of values in column. virtual size_t size() const = 0; @@ -512,6 +513,14 @@ class IColumn : public COW { return res; } + static MutablePtr mutate(Ptr ptr) { + MutablePtr res = ptr->shallow_mutate(); /// Now use_count is 2. + ptr.reset(); /// Reset use_count to 1. + res->for_each_subcolumn( + [](WrappedPtr& subcolumn) { subcolumn = std::move(*subcolumn).mutate(); }); + return res; + } + /** Some columns can contain another columns inside. * So, we have a tree of columns. But not all combinations are possible. * There are the following rules: diff --git a/be/src/vec/columns/column_array.h b/be/src/vec/columns/column_array.h index 824cca8b2389db..1b337d7f457a3e 100644 --- a/be/src/vec/columns/column_array.h +++ b/be/src/vec/columns/column_array.h @@ -177,6 +177,13 @@ class ColumnArray final : public COWHelper { } Status filter_by_selector(const uint16_t* sel, size_t sel_size, IColumn* col_ptr) override; + size_t get_number_of_dimensions() const { + const auto* nested_array = check_and_get_column(*data); + if (!nested_array) return 1; + return 1 + + nested_array + ->get_number_of_dimensions(); /// Every modern C++ compiler optimizes tail recursion. + } private: WrappedPtr data; diff --git a/be/src/vec/columns/column_complex.h b/be/src/vec/columns/column_complex.h index be52a156c3c719..bc4857a5870c40 100644 --- a/be/src/vec/columns/column_complex.h +++ b/be/src/vec/columns/column_complex.h @@ -122,6 +122,10 @@ class ColumnComplexType final : public COWHelper> LOG(FATAL) << "get_permutation not implemented"; } + [[noreturn]] TypeIndex get_data_type() const override { + LOG(FATAL) << "ColumnComplexType get_data_type not implemeted"; + } + void reserve(size_t n) override { data.reserve(n); } void resize(size_t n) override { data.resize(n); } diff --git a/be/src/vec/columns/column_const.h b/be/src/vec/columns/column_const.h index 9637a0943f0799..4567f2d82ed396 100644 --- a/be/src/vec/columns/column_const.h +++ b/be/src/vec/columns/column_const.h @@ -66,6 +66,12 @@ class ColumnConst final : public COWHelper { StringRef get_data_at(size_t) const override { return data->get_data_at(0); } + StringRef get_data_at_with_terminating_zero(size_t) const override { + return data->get_data_at_with_terminating_zero(0); + } + + TypeIndex get_data_type() const override { return data->get_data_type(); } + UInt64 get64(size_t) const override { return data->get64(0); } UInt64 get_uint(size_t) const override { return data->get_uint(0); } diff --git a/be/src/vec/columns/column_decimal.h b/be/src/vec/columns/column_decimal.h index a3960067cb2b86..d38a102e2eef9b 100644 --- a/be/src/vec/columns/column_decimal.h +++ b/be/src/vec/columns/column_decimal.h @@ -194,6 +194,8 @@ class ColumnDecimal final : public COWHelper::value; } + void get_extremes(Field& min, Field& max) const override; MutableColumns scatter(IColumn::ColumnIndex num_columns, diff --git a/be/src/vec/columns/column_dictionary.h b/be/src/vec/columns/column_dictionary.h index eada23d57162fb..539ea1b133442d 100644 --- a/be/src/vec/columns/column_dictionary.h +++ b/be/src/vec/columns/column_dictionary.h @@ -113,6 +113,10 @@ class ColumnDictionary final : public COWHelper> { void reserve(size_t n) override { _codes.reserve(n); } + [[noreturn]] TypeIndex get_data_type() const override { + LOG(FATAL) << "ColumnDictionary get_data_type not implemeted"; + } + const char* get_family_name() const override { return "ColumnDictionary"; } [[noreturn]] MutableColumnPtr clone_resized(size_t size) const override { diff --git a/be/src/vec/columns/column_dummy.h b/be/src/vec/columns/column_dummy.h index 957b33318905e1..9447b0841d7fb5 100644 --- a/be/src/vec/columns/column_dummy.h +++ b/be/src/vec/columns/column_dummy.h @@ -143,6 +143,10 @@ class IColumnDummy : public IColumn { bool is_dummy() const override { return true; } + [[noreturn]] TypeIndex get_data_type() const override { + LOG(FATAL) << "IColumnDummy get_data_type not implemeted"; + } + void replace_column_data(const IColumn& rhs, size_t row, size_t self_row = 0) override { LOG(FATAL) << "should not call the method in column dummy"; } diff --git a/be/src/vec/columns/column_nothing.h b/be/src/vec/columns/column_nothing.h index d3cb88574cb56e..16ab5d171ff49a 100644 --- a/be/src/vec/columns/column_nothing.h +++ b/be/src/vec/columns/column_nothing.h @@ -41,6 +41,8 @@ class ColumnNothing final : public COWHelper { bool structure_equals(const IColumn& rhs) const override { return typeid(rhs) == typeid(ColumnNothing); } + + TypeIndex get_data_type() const override { return TypeIndex::Nothing; } }; } // namespace doris::vectorized diff --git a/be/src/vec/columns/column_nullable.h b/be/src/vec/columns/column_nullable.h index 1da36feeac09a4..6c4744e79ff652 100644 --- a/be/src/vec/columns/column_nullable.h +++ b/be/src/vec/columns/column_nullable.h @@ -84,6 +84,8 @@ class ColumnNullable final : public COWHelper { UInt64 get64(size_t n) const override { return nested_column->get64(n); } StringRef get_data_at(size_t n) const override; + TypeIndex get_data_type() const override { return TypeIndex::Nullable; } + /// Will insert null value if pos=nullptr void insert_data(const char* pos, size_t length) override; diff --git a/be/src/vec/columns/column_object.cpp b/be/src/vec/columns/column_object.cpp new file mode 100644 index 00000000000000..cf5cc339fd0b9b --- /dev/null +++ b/be/src/vec/columns/column_object.cpp @@ -0,0 +1,828 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// This file is copied from +// https://github.com/ClickHouse/ClickHouse/blob/master/src/Columns/ColumnObject.cpp +// and modified by Doris + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace doris::vectorized { +namespace { + +DataTypePtr create_array_of_type(DataTypePtr type, size_t num_dimensions) { + for (size_t i = 0; i < num_dimensions; ++i) + type = std::make_shared(std::move(type)); + return type; +} + +DataTypePtr getBaseTypeOfArray(const DataTypePtr& type) { + /// Get raw pointers to avoid extra copying of type pointers. + const DataTypeArray* last_array = nullptr; + const auto* current_type = type.get(); + while (const auto* type_array = typeid_cast(current_type)) { + current_type = type_array->get_nested_type().get(); + last_array = type_array; + } + return last_array ? last_array->get_nested_type() : type; +} + +size_t getNumberOfDimensions(const IDataType& type) { + if (const auto* type_array = typeid_cast(&type)) { + return type_array->get_number_of_dimensions(); + } + return 0; +} + +DataTypePtr get_data_type_by_column(const IColumn& column) { + auto idx = column.get_data_type(); + if (WhichDataType(idx).is_simple()) { + return DataTypeFactory::instance().get(String(getTypeName(idx))); + } + if (WhichDataType(idx).is_nothing()) { + return std::make_shared(); + } + if (const auto* column_array = check_and_get_column(&column)) { + return std::make_shared(get_data_type_by_column(column_array->get_data())); + } + if (const auto* column_nullable = check_and_get_column(&column)) { + return make_nullable(get_data_type_by_column(column_nullable->get_nested_column())); + } + // TODO add more types + assert(false); + return nullptr; +} + +/// Recreates column with default scalar values and keeps sizes of arrays. +ColumnPtr recreate_column_with_default_value(const ColumnPtr& column, + const DataTypePtr& scalar_type, + size_t num_dimensions) { + const auto* column_array = check_and_get_column(column.get()); + if (column_array && num_dimensions) { + return ColumnArray::create( + recreate_column_with_default_value(column_array->get_data_ptr(), scalar_type, + num_dimensions - 1), + IColumn::mutate(column_array->get_offsets_ptr())); + } + return create_array_of_type(scalar_type, num_dimensions) + ->create_column() + ->clone_resized(column->size()); +} + +Array create_empty_array_field(size_t num_dimensions) { + assert(num_dimensions != 0); + Array array; + Array* current_array = &array; + for (size_t i = 1; i < num_dimensions; ++i) { + current_array->push_back(Array()); + current_array = ¤t_array->back().get(); + } + return array; +} + +/// Replaces NULL fields to given field or empty array. +class FieldVisitorReplaceNull : public StaticVisitor { +public: + explicit FieldVisitorReplaceNull(const Field& replacement_, size_t num_dimensions_) + : replacement(replacement_), num_dimensions(num_dimensions_) {} + Field operator()(const Null&) const { + return num_dimensions ? create_empty_array_field(num_dimensions) : replacement; + } + Field operator()(const Array& x) const { + assert(num_dimensions > 0); + const size_t size = x.size(); + Array res(size); + for (size_t i = 0; i < size; ++i) { + res[i] = apply_visitor(FieldVisitorReplaceNull(replacement, num_dimensions - 1), x[i]); + } + return res; + } + template + Field operator()(const T& x) const { + return x; + } + +private: + const Field& replacement; + size_t num_dimensions; +}; + +/// Calculates number of dimensions in array field. +/// Returns 0 for scalar fields. +class FieldVisitorToNumberOfDimensions : public StaticVisitor { +public: + explicit FieldVisitorToNumberOfDimensions(Status* st) : _st(st) {} + size_t operator()(const Array& x) const { + const size_t size = x.size(); + std::optional dimensions; + for (size_t i = 0; i < size; ++i) { + /// Do not count Nulls, because they will be replaced by default + /// values with proper number of dimensions. + if (x[i].is_null()) continue; + size_t current_dimensions = apply_visitor(*this, x[i]); + if (!dimensions) { + dimensions = current_dimensions; + } else if (current_dimensions != *dimensions) { + *_st = Status::InvalidArgument( + "Number of dimensions mismatched among array elements"); + return 0; + } + } + return 1 + dimensions.value_or(0); + } + template + size_t operator()(const T&) const { + return 0; + } + +private: + mutable Status* _st; +}; + +/// Visitor that allows to get type of scalar field +/// or least common type of scalars in array. +/// More optimized version of FieldToDataType. +class FieldVisitorToScalarType : public StaticVisitor { +public: + using FieldType = Field::Types::Which; + size_t operator()(const Array& x) { + size_t size = x.size(); + for (size_t i = 0; i < size; ++i) apply_visitor(*this, x[i]); + return 0; + } + // TODO doris not support unsigned integers for now + // treat as signed integers + size_t operator()(const UInt64& x) { + field_types.insert(FieldType::UInt64); + if (x <= std::numeric_limits::max()) { + type_indexes.insert(TypeIndex::Int8); + } else if (x <= std::numeric_limits::max()) { + type_indexes.insert(TypeIndex::Int16); + } else if (x <= std::numeric_limits::max()) { + type_indexes.insert(TypeIndex::Int32); + } else { + type_indexes.insert(TypeIndex::Int64); + } + return 0; + } + size_t operator()(const Int64& x) { + // Only support Int32 and Int64 + field_types.insert(FieldType::Int64); + if (x <= std::numeric_limits::max() && x >= std::numeric_limits::min()) { + type_indexes.insert(TypeIndex::Int32); + } else { + type_indexes.insert(TypeIndex::Int64); + } + return 0; + } + size_t operator()(const Null&) { + have_nulls = true; + return 0; + } + template + size_t operator()(const T&) { + Field::EnumToType::Type a; + field_types.insert(Field::TypeToEnum>::value); + type_indexes.insert(TypeId>::value); + return 0; + } + Status getScalarType(DataTypePtr* type) const { + return get_least_supertype(type_indexes, type, true /*compatible with string type*/); + } + bool haveNulls() const { return have_nulls; } + bool needConvertField() const { return field_types.size() > 1; } + +private: + phmap::flat_hash_set type_indexes; + phmap::flat_hash_set field_types; + bool have_nulls = false; +}; + +} // namespace +Status get_field_info(const Field& field, FieldInfo* info) { + FieldVisitorToScalarType to_scalar_type_visitor; + apply_visitor(to_scalar_type_visitor, field); + DataTypePtr type = nullptr; + RETURN_IF_ERROR(to_scalar_type_visitor.getScalarType(&type)); + // array item's dimension may missmatch, eg. [1, 2, [1, 2, 3]] + Status num_to_dimensions_status; + *info = { + type, + to_scalar_type_visitor.haveNulls(), + to_scalar_type_visitor.needConvertField(), + apply_visitor(FieldVisitorToNumberOfDimensions(&num_to_dimensions_status), field), + }; + RETURN_IF_ERROR(num_to_dimensions_status); + return Status::OK(); +} + +ColumnObject::Subcolumn::Subcolumn(MutableColumnPtr&& data_, bool is_nullable_) + : least_common_type(get_data_type_by_column(*data_)), is_nullable(is_nullable_) { + data.push_back(std::move(data_)); +} + +ColumnObject::Subcolumn::Subcolumn(size_t size_, bool is_nullable_) + : least_common_type(std::make_shared()), + is_nullable(is_nullable_), + num_of_defaults_in_prefix(size_) {} + +size_t ColumnObject::Subcolumn::Subcolumn::size() const { + size_t res = num_of_defaults_in_prefix; + for (const auto& part : data) { + res += part->size(); + } + return res; +} + +size_t ColumnObject::Subcolumn::Subcolumn::byteSize() const { + size_t res = 0; + for (const auto& part : data) { + res += part->byte_size(); + } + return res; +} + +size_t ColumnObject::Subcolumn::Subcolumn::allocatedBytes() const { + size_t res = 0; + for (const auto& part : data) { + res += part->allocated_bytes(); + } + return res; +} + +Status ColumnObject::Subcolumn::insert(Field field) { + FieldInfo info; + RETURN_IF_ERROR(get_field_info(field, &info)); + return insert(std::move(field), std::move(info)); +} + +void ColumnObject::Subcolumn::add_new_column_part(DataTypePtr type) { + data.push_back(ColumnSparse::create(type->create_column())); + least_common_type = LeastCommonType {std::move(type)}; +} + +Status ColumnObject::Subcolumn::insert(Field field, FieldInfo info) { + auto base_type = std::move(info.scalar_type); + if (is_nothing(base_type)) { + insertDefault(); + return Status::OK(); + } + auto column_dim = least_common_type.getDimensions(); + auto value_dim = info.num_dimensions; + if (is_nothing(least_common_type.getBase())) { + column_dim = value_dim; + } + if (is_nothing(base_type)) { + value_dim = column_dim; + } + if (value_dim != column_dim) { + return Status::InvalidArgument( + "Dimension of types mismatched between inserted value and column."); + } + if (is_nullable && !is_nothing(base_type)) { + base_type = make_nullable(base_type); + } + // alawys nullable at present + if (!is_nullable && info.have_nulls) { + field = apply_visitor(FieldVisitorReplaceNull(base_type->get_default(), value_dim), + std::move(field)); + } + // need replace muli dimensions array which contains null. eg. [[1, 2, 3], null] -> [[1, 2, 3], []] + // since column array doesnt known null's dimension + if (info.num_dimensions >= 2 && info.have_nulls) { + field = apply_visitor(FieldVisitorReplaceNull(base_type->get_default(), value_dim), + std::move(field)); + } + + bool type_changed = false; + const auto& least_common_base_type = least_common_type.getBase(); + if (data.empty()) { + add_new_column_part(create_array_of_type(std::move(base_type), value_dim)); + } else if (!least_common_base_type->equals(*base_type) && !is_nothing(base_type)) { + if (!object_util::is_conversion_required_between_integers(*base_type, + *least_common_base_type)) { + RETURN_IF_ERROR( + get_least_supertype(DataTypes {std::move(base_type), least_common_base_type}, + &base_type, true /*compatible with string type*/)); + type_changed = true; + if (!least_common_base_type->equals(*base_type)) { + add_new_column_part(create_array_of_type(std::move(base_type), value_dim)); + } + } + } + + if (type_changed || info.need_convert) { + Field new_field; + RETURN_IF_ERROR(convert_field_to_type(field, *least_common_type.get(), &new_field)); + field = new_field; + } + + data.back()->insert(field); + return Status::OK(); +} + +Status ColumnObject::Subcolumn::insertRangeFrom(const Subcolumn& src, size_t start, size_t length) { + assert(src.is_finalized()); + const auto& src_column = src.data.back(); + const auto& src_type = src.least_common_type.get(); + if (data.empty()) { + add_new_column_part(src.least_common_type.get()); + data.back()->insert_range_from(*src_column, start, length); + } else if (least_common_type.get()->equals(*src_type)) { + data.back()->insert_range_from(*src_column, start, length); + } else { + DataTypePtr new_least_common_type = nullptr; + RETURN_IF_ERROR(get_least_supertype(DataTypes {least_common_type.get(), src_type}, + &new_least_common_type, + true /*compatible with string type*/)); + ColumnPtr casted_column; + RETURN_IF_ERROR(object_util::cast_column({src_column, src_type, ""}, new_least_common_type, + &casted_column)); + if (!least_common_type.get()->equals(*new_least_common_type)) + add_new_column_part(std::move(new_least_common_type)); + data.back()->insert_range_from(*casted_column, start, length); + } + return Status::OK(); +} + +bool ColumnObject::Subcolumn::is_finalized() const { + return data.empty() || + (data.size() == 1 && !data[0]->is_sparse() && num_of_defaults_in_prefix == 0); +} + +template +ColumnPtr ColumnObject::apply_for_subcolumns(Func&& func, std::string_view func_name) const { + if (!is_finalized()) { + LOG(FATAL) << "Cannot " << func_name << " non-finalized ColumnObject"; + } + auto res = ColumnObject::create(is_nullable); + for (const auto& subcolumn : subcolumns) { + auto new_subcolumn = func(subcolumn->data.get_finalized_column()); + res->add_sub_column(subcolumn->path, new_subcolumn->assume_mutable()); + } + return res; +} +ColumnPtr ColumnObject::index(const IColumn& indexes, size_t limit) const { + return apply_for_subcolumns( + [&](const auto& subcolumn) { return subcolumn.index(indexes, limit); }, "index"); +} + +void ColumnObject::Subcolumn::finalize() { + if (is_finalized()) { + return; + } + if (data.size() == 1 && num_of_defaults_in_prefix == 0) { + data[0] = data[0]->convert_to_full_column_if_sparse(); + return; + } + const auto& to_type = least_common_type.get(); + auto result_column = to_type->create_column(); + if (num_of_defaults_in_prefix) { + result_column->insert_many_defaults(num_of_defaults_in_prefix); + } + for (auto& part : data) { + part = part->convert_to_full_column_if_sparse(); + auto from_type = get_data_type_by_column(*part); + size_t part_size = part->size(); + if (!from_type->equals(*to_type)) { + auto offsets = ColumnUInt64::create(); + auto& offsets_data = offsets->get_data(); + /// We need to convert only non-default values and then recreate column + /// with default value of new type, because default values (which represents misses in data) + /// may be inconsistent between types (e.g "0" in UInt64 and empty string in String). + part->get_indices_of_non_default_rows(offsets_data, 0, part_size); + if (offsets->size() == part_size) { + ColumnPtr ptr; + object_util::cast_column({part, from_type, ""}, to_type, &ptr); + part = ptr; + } else { + auto values = part->index(*offsets, offsets->size()); + object_util::cast_column({values, from_type, ""}, to_type, &values); + part = values->create_with_offsets(offsets_data, to_type->get_default(), part_size, + /*shift=*/0); + } + } + result_column->insert_range_from(*part, 0, part_size); + } + data = {std::move(result_column)}; + num_of_defaults_in_prefix = 0; +} + +void ColumnObject::Subcolumn::insertDefault() { + if (data.empty()) { + ++num_of_defaults_in_prefix; + } else { + data.back()->insert_default(); + } +} + +void ColumnObject::Subcolumn::insertManyDefaults(size_t length) { + if (data.empty()) { + num_of_defaults_in_prefix += length; + } else { + data.back()->insert_many_defaults(length); + } +} + +void ColumnObject::Subcolumn::pop_back(size_t n) { + assert(n <= size()); + size_t num_removed = 0; + for (auto it = data.rbegin(); it != data.rend(); ++it) { + if (n == 0) break; + auto& column = *it; + if (n < column->size()) { + column->pop_back(n); + n = 0; + } else { + ++num_removed; + n -= column->size(); + } + } + data.resize(data.size() - num_removed); + num_of_defaults_in_prefix -= n; +} + +Field ColumnObject::Subcolumn::getLastField() const { + if (data.empty()) return Field(); + const auto& last_part = data.back(); + assert(!last_part->empty()); + return (*last_part)[last_part->size() - 1]; +} + +ColumnObject::Subcolumn ColumnObject::Subcolumn::recreateWithDefaultValues( + const FieldInfo& field_info) const { + auto scalar_type = field_info.scalar_type; + if (is_nullable) { + scalar_type = make_nullable(scalar_type); + } + Subcolumn new_subcolumn; + new_subcolumn.least_common_type = + LeastCommonType {create_array_of_type(scalar_type, field_info.num_dimensions)}; + new_subcolumn.is_nullable = is_nullable; + new_subcolumn.num_of_defaults_in_prefix = num_of_defaults_in_prefix; + new_subcolumn.data.reserve(data.size()); + for (const auto& part : data) { + new_subcolumn.data.push_back( + recreate_column_with_default_value(part, scalar_type, field_info.num_dimensions)); + } + return new_subcolumn; +} + +IColumn& ColumnObject::Subcolumn::get_finalized_column() { + assert(is_finalized()); + return *data[0]; +} + +const IColumn& ColumnObject::Subcolumn::get_finalized_column() const { + assert(is_finalized()); + return *data[0]; +} + +const ColumnPtr& ColumnObject::Subcolumn::get_finalized_column_ptr() const { + assert(is_finalized()); + return data[0]; +} + +ColumnObject::Subcolumn::LeastCommonType::LeastCommonType(DataTypePtr type_) + : type(std::move(type_)), + base_type(getBaseTypeOfArray(type)), + num_dimensions(getNumberOfDimensions(*type)) {} + +ColumnObject::ColumnObject(bool is_nullable_) : is_nullable(is_nullable_), num_rows(0) {} + +ColumnObject::ColumnObject(Subcolumns&& subcolumns_, bool is_nullable_) + : is_nullable(is_nullable_), + subcolumns(std::move(subcolumns_)), + num_rows(subcolumns.empty() ? 0 : (*subcolumns.begin())->data.size()) { + check_consistency(); +} + +void ColumnObject::check_consistency() const { + if (subcolumns.empty()) return; + for (const auto& leaf : subcolumns) { + if (num_rows != leaf->data.size()) { + assert(false); + } + } +} + +size_t ColumnObject::size() const { +#ifndef NDEBUG + check_consistency(); +#endif + return num_rows; +} + +MutableColumnPtr ColumnObject::clone_resized(size_t new_size) const { + /// cloneResized with new_size == 0 is used for cloneEmpty(). + if (new_size != 0) { + LOG(FATAL) << "ColumnObject doesn't support resize to non-zero length"; + } + return ColumnObject::create(is_nullable); +} + +size_t ColumnObject::byte_size() const { + size_t res = 0; + for (const auto& entry : subcolumns) { + res += entry->data.byteSize(); + } + return res; +} + +size_t ColumnObject::allocated_bytes() const { + size_t res = 0; + for (const auto& entry : subcolumns) { + res += entry->data.allocatedBytes(); + } + return res; +} + +void ColumnObject::for_each_subcolumn(ColumnCallback callback) { + if (!is_finalized()) assert(false); + for (auto& entry : subcolumns) { + callback(entry->data.data.back()); + } +} + +Status ColumnObject::try_insert_from(const IColumn& src, size_t n) { + return try_insert(src[n]); +} + +Status ColumnObject::try_insert(const Field& field) { + const auto& object = field.get(); + phmap::flat_hash_set inserted; + size_t old_size = size(); + for (const auto& [key_str, value] : object) { + PathInData key(key_str); + inserted.insert(key_str); + if (!has_subcolumn(key)) add_sub_column(key, old_size); + auto& subcolumn = get_subcolumn(key); + RETURN_IF_ERROR(subcolumn.insert(value)); + } + for (auto& entry : subcolumns) { + if (!inserted.contains(entry->path.get_path())) { + entry->data.insertDefault(); + } + } + ++num_rows; + return Status::OK(); +} + +void ColumnObject::insert_default() { + for (auto& entry : subcolumns) { + entry->data.insertDefault(); + } + ++num_rows; +} + +Field ColumnObject::operator[](size_t n) const { + if (!is_finalized()) assert(false); + Object object; + for (const auto& entry : subcolumns) { + object[entry->path.get_path()] = (*entry->data.data.back())[n]; + } + return object; +} + +void ColumnObject::get(size_t n, Field& res) const { + if (!is_finalized()) assert(false); + auto& object = res.get(); + for (const auto& entry : subcolumns) { + auto it = object.try_emplace(entry->path.get_path()).first; + entry->data.data.back()->get(n, it->second); + } +} + +Status ColumnObject::try_insert_indices_from(const IColumn& src, const int* indices_begin, + const int* indices_end) { + for (auto x = indices_begin; x != indices_end; ++x) { + if (*x == -1) { + ColumnObject::insert_default(); + } else { + RETURN_IF_ERROR(ColumnObject::try_insert_from(src, *x)); + } + } + finalize(); + return Status::OK(); +} + +Status ColumnObject::try_insert_range_from(const IColumn& src, size_t start, size_t length) { + const auto& src_object = assert_cast(src); + if (UNLIKELY(src_object.empty())) { + return Status::OK(); + } + for (auto& entry : subcolumns) { + if (src_object.has_subcolumn(entry->path)) { + RETURN_IF_ERROR(entry->data.insertRangeFrom(src_object.get_subcolumn(entry->path), + start, length)); + } else { + entry->data.insertManyDefaults(length); + } + } + for (const auto& entry : src_object.subcolumns) { + if (!has_subcolumn(entry->path)) { + if (entry->path.has_nested_part()) { + const auto& base_type = entry->data.getLeastCommonTypeBase(); + FieldInfo field_info { + .scalar_type = base_type, + .have_nulls = base_type->is_nullable(), + .need_convert = false, + .num_dimensions = entry->data.getDimensions(), + }; + add_nested_subcolumn(entry->path, field_info, num_rows); + } else { + add_sub_column(entry->path, num_rows); + } + auto& subcolumn = get_subcolumn(entry->path); + RETURN_IF_ERROR(subcolumn.insertRangeFrom(entry->data, start, length)); + } + } + num_rows += length; + finalize(); + return Status::OK(); +} + +void ColumnObject::pop_back(size_t length) { + for (auto& entry : subcolumns) entry->data.pop_back(length); + num_rows -= length; +} + +const ColumnObject::Subcolumn& ColumnObject::get_subcolumn(const PathInData& key) const { + const auto* node = subcolumns.find_leaf(key); + if (node == nullptr) { + LOG(FATAL) << "There is no subcolumn " << key.get_path(); + } + return node->data; +} + +ColumnObject::Subcolumn& ColumnObject::get_subcolumn(const PathInData& key) { + const auto* node = subcolumns.find_leaf(key); + if (node == nullptr) { + LOG(FATAL) << "There is no subcolumn " << key.get_path(); + } + return const_cast(node)->data; +} + +bool ColumnObject::has_subcolumn(const PathInData& key) const { + return subcolumns.find_leaf(key) != nullptr; +} + +void ColumnObject::add_sub_column(const PathInData& key, MutableColumnPtr&& subcolumn) { + size_t new_size = subcolumn->size(); + bool inserted = subcolumns.add(key, Subcolumn(std::move(subcolumn), is_nullable)); + if (!inserted) { + LOG(FATAL) << "Duplicated sub column " << key.get_path(); + } + if (num_rows == 0) { + num_rows = new_size; + } else if (new_size != num_rows) { + LOG(FATAL) << "Size of subcolumn is in consistent with column"; + } +} + +void ColumnObject::add_sub_column(const PathInData& key, size_t new_size) { + bool inserted = subcolumns.add(key, Subcolumn(new_size, is_nullable)); + if (!inserted) { + LOG(FATAL) << "Duplicated sub column " << key.get_path(); + } + if (num_rows == 0) { + num_rows = new_size; + } else if (new_size != num_rows) { + LOG(FATAL) << "Size of subcolumn is in consistent with column"; + } +} + +void ColumnObject::add_nested_subcolumn(const PathInData& key, const FieldInfo& field_info, + size_t new_size) { + assert(key.has_nested_part()); + bool inserted = false; + /// We find node that represents the same Nested type as @key. + const auto* nested_node = subcolumns.find_best_match(key); + if (nested_node) { + /// Find any leaf of Nested subcolumn. + const auto* leaf = subcolumns.find_leaf(nested_node, [&](const auto&) { return true; }); + assert(leaf); + /// Recreate subcolumn with default values and the same sizes of arrays. + auto new_subcolumn = leaf->data.recreateWithDefaultValues(field_info); + /// It's possible that we have already inserted value from current row + /// to this subcolumn. So, adjust size to expected. + if (new_subcolumn.size() > new_size) + new_subcolumn.pop_back(new_subcolumn.size() - new_size); + assert(new_subcolumn.size() == new_size); + inserted = subcolumns.add(key, new_subcolumn); + } else { + /// If node was not found just add subcolumn with empty arrays. + inserted = subcolumns.add(key, Subcolumn(new_size, is_nullable)); + } + if (!inserted) { + LOG(FATAL) << "Subcolumn already exists"; + } + if (num_rows == 0) num_rows = new_size; +} + +PathsInData ColumnObject::getKeys() const { + PathsInData keys; + keys.reserve(subcolumns.size()); + for (const auto& entry : subcolumns) { + keys.emplace_back(entry->path); + } + return keys; +} + +void ColumnObject::remove_subcolumns(const std::unordered_set& keys) { + Subcolumns new_subcolumns; + for (auto& entry : subcolumns) { + if (keys.count(entry->path.get_path()) == 0) { + new_subcolumns.add(entry->path, entry->data); + } + } + std::swap(subcolumns, new_subcolumns); +} + +bool ColumnObject::is_finalized() const { + return std::all_of(subcolumns.begin(), subcolumns.end(), + [](const auto& entry) { return entry->data.is_finalized(); }); +} + +void ColumnObject::finalize() { + size_t old_size = size(); + Subcolumns new_subcolumns; + for (auto&& entry : subcolumns) { + const auto& least_common_type = entry->data.getLeastCommonType(); + /// Do not add subcolumns, which consists only from NULLs. + if (is_nothing(getBaseTypeOfArray(least_common_type))) continue; + entry->data.finalize(); + new_subcolumns.add(entry->path, entry->data); + } + /// If all subcolumns were skipped add a dummy subcolumn, + /// because Tuple type must have at least one element. + if (new_subcolumns.empty()) { + new_subcolumns.add( + PathInData {COLUMN_NAME_DUMMY}, + Subcolumn {static_cast(ColumnUInt8::create(old_size, 0)), + is_nullable}); + } + std::swap(subcolumns, new_subcolumns); +} + +bool ColumnObject::empty() const { + return subcolumns.empty() || subcolumns.begin()->get()->path.get_path() == COLUMN_NAME_DUMMY; +} + +ColumnPtr get_base_column_of_array(const ColumnPtr& column) { + if (const auto* column_array = check_and_get_column(column)) { + return column_array->get_data_ptr(); + } + return column; +} + +void ColumnObject::strip_outer_array() { + assert(is_finalized()); + size_t old_size = size(); + Subcolumns new_subcolumns; + for (auto&& entry : subcolumns) { + auto base_column = get_base_column_of_array(entry->data.get_finalized_column_ptr()); + new_subcolumns.add(entry->path, Subcolumn {base_column->assume_mutable(), is_nullable}); + num_rows = base_column->size(); + } + /// If all subcolumns were skipped add a dummy subcolumn, + /// because Tuple type must have at least one element. + if (new_subcolumns.empty()) { + new_subcolumns.add( + PathInData {COLUMN_NAME_DUMMY}, + Subcolumn {static_cast(ColumnUInt8::create(old_size, 0)), + is_nullable}); + } + std::swap(subcolumns, new_subcolumns); +} + +} // namespace doris::vectorized diff --git a/be/src/vec/columns/column_object.h b/be/src/vec/columns/column_object.h new file mode 100644 index 00000000000000..07db5949098769 --- /dev/null +++ b/be/src/vec/columns/column_object.h @@ -0,0 +1,357 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// This file is copied from +// https://github.com/ClickHouse/ClickHouse/blob/master/src/Columns/ColumnObject.h +// and modified by Doris + +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common/status.h" +namespace doris::vectorized { + +/// Info that represents a scalar or array field in a decomposed view. +/// It allows to recreate field with different number +/// of dimensions or nullability. +struct FieldInfo { + /// The common type of of all scalars in field. + DataTypePtr scalar_type; + /// Do we have NULL scalar in field. + bool have_nulls; + /// If true then we have scalars with different types in array and + /// we need to convert scalars to the common type. + bool need_convert; + /// Number of dimension in array. 0 if field is scalar. + size_t num_dimensions; +}; +Status get_field_info(const Field& field, FieldInfo* info); +/** A column that represents object with dynamic set of subcolumns. + * Subcolumns are identified by paths in document and are stored in + * a trie-like structure. ColumnObject is not suitable for writing into tables + * and it should be converted to Tuple with fixed set of subcolumns before that. + */ +class ColumnObject final : public COWHelper { +public: + /** Class that represents one subcolumn. + * It stores values in several parts of column + * and keeps current common type of all parts. + * We add a new column part with a new type, when we insert a field, + * which can't be converted to the current common type. + * After insertion of all values subcolumn should be finalized + * for writing and other operations. + */ + class Subcolumn { + public: + Subcolumn() = default; + + Subcolumn(size_t size_, bool is_nullable_); + + Subcolumn(MutableColumnPtr&& data_, bool is_nullable_); + + size_t size() const; + + size_t byteSize() const; + + size_t allocatedBytes() const; + + bool is_finalized() const; + + const DataTypePtr& getLeastCommonType() const { return least_common_type.get(); } + + const DataTypePtr& getLeastCommonTypeBase() const { return least_common_type.getBase(); } + + size_t getDimensions() const { return least_common_type.getDimensions(); } + + /// Checks the consistency of column's parts stored in @data. + void checkTypes() const; + + /// Inserts a field, which scalars can be arbitrary, but number of + /// dimensions should be consistent with current common type. + /// return Status::InvalidArgument when meet conflict types + Status insert(Field field); + + Status insert(Field field, FieldInfo info); + + void insertDefault(); + + void insertManyDefaults(size_t length); + + Status insertRangeFrom(const Subcolumn& src, size_t start, size_t length); + + void pop_back(size_t n); + + /// Converts all column's parts to the common type and + /// creates a single column that stores all values. + void finalize(); + + /// Returns last inserted field. + Field getLastField() const; + + /// Recreates subcolumn with default scalar values and keeps sizes of arrays. + /// Used to create columns of type Nested with consistent array sizes. + Subcolumn recreateWithDefaultValues(const FieldInfo& field_info) const; + + /// Returns single column if subcolumn in finalizes. + /// Otherwise -- undefined behaviour. + IColumn& get_finalized_column(); + + const IColumn& get_finalized_column() const; + + const ColumnPtr& get_finalized_column_ptr() const; + + friend class ColumnObject; + + private: + class LeastCommonType { + public: + LeastCommonType() = default; + + explicit LeastCommonType(DataTypePtr type_); + + const DataTypePtr& get() const { return type; } + + const DataTypePtr& getBase() const { return base_type; } + + size_t getDimensions() const { return num_dimensions; } + + private: + DataTypePtr type; + DataTypePtr base_type; + size_t num_dimensions = 0; + }; + void add_new_column_part(DataTypePtr type); + + /// Current least common type of all values inserted to this subcolumn. + LeastCommonType least_common_type; + /// If true then common type type of subcolumn is Nullable + /// and default values are NULLs. + bool is_nullable = false; + /// Parts of column. Parts should be in increasing order in terms of subtypes/supertypes. + /// That means that the least common type for i-th prefix is the type of i-th part + /// and it's the supertype for all type of column from 0 to i-1. + std::vector data; + /// Until we insert any non-default field we don't know further + /// least common type and we count number of defaults in prefix, + /// which will be converted to the default type of final common type. + size_t num_of_defaults_in_prefix = 0; + }; + using Subcolumns = SubcolumnsTree; + +private: + /// If true then all subcolumns are nullable. + const bool is_nullable; + Subcolumns subcolumns; + size_t num_rows; + +public: + static constexpr auto COLUMN_NAME_DUMMY = "_dummy"; + + explicit ColumnObject(bool is_nullable_); + + ColumnObject(Subcolumns&& subcolumns_, bool is_nullable_); + + ~ColumnObject() = default; + + bool can_be_inside_nullable() const override { return true; } + + /// Checks that all subcolumns have consistent sizes. + void check_consistency() const; + + bool has_subcolumn(const PathInData& key) const; + + const Subcolumn& get_subcolumn(const PathInData& key) const; + + Subcolumn& get_subcolumn(const PathInData& key); + + void incr_num_rows() { ++num_rows; } + + /// Adds a subcolumn from existing IColumn. + void add_sub_column(const PathInData& key, MutableColumnPtr&& subcolumn); + + /// Adds a subcolumn of specific size with default values. + void add_sub_column(const PathInData& key, size_t new_size); + + /// Adds a subcolumn of type Nested of specific size with default values. + /// It cares about consistency of sizes of Nested arrays. + void add_nested_subcolumn(const PathInData& key, const FieldInfo& field_info, size_t new_size); + + const Subcolumns& get_subcolumns() const { return subcolumns; } + + Subcolumns& get_subcolumns() { return subcolumns; } + + PathsInData getKeys() const; + + std::string get_keys_str() const { + std::stringstream ss; + bool first = true; + for (auto& k : getKeys()) { + if (first) { + first = false; + } else { + ss << ", "; + } + ss << k.get_path(); + } + + return ss.str(); + } + + void remove_subcolumns(const std::unordered_set& keys); + + /// Finalizes all subcolumns. + void finalize(); + + bool is_finalized() const; + + /// Part of interface + const char* get_family_name() const override { return "Variant"; } + + TypeIndex get_data_type() const override { return TypeIndex::VARIANT; } + + size_t size() const override; + + MutableColumnPtr clone_resized(size_t new_size) const override; + + size_t byte_size() const override; + + size_t allocated_bytes() const override; + + void for_each_subcolumn(ColumnCallback callback) override; + + // Do nothing, call try_insert instead + void insert(const Field& field) override { + Status st = try_insert(field); + if (!st.ok()) LOG(FATAL) << "insert return ERROR status: " << st; + } + + // Do nothing, call try_insert_range_from instead + void insert_range_from(const IColumn& src, size_t start, size_t length) override { + Status st = try_insert_range_from(src, start, length); + if (!st.ok()) LOG(FATAL) << "insert_range_from return ERROR status: " << st; + } + + // Only called in Block::add_row + Status try_insert(const Field& field); + + Status try_insert_from(const IColumn& src, size_t n); + + // Only called in Block::add_row + Status try_insert_range_from(const IColumn& src, size_t start, size_t length); + + void insert_default() override; + + [[noreturn]] ColumnPtr replicate(const Offsets& offsets) const override { + LOG(FATAL) << "should not call the method replicate in column object"; + } + + void pop_back(size_t length) override; + + Field operator[](size_t n) const override; + + void get(size_t n, Field& res) const override; + + /// All other methods throw exception. + StringRef get_data_at(size_t) const override { + LOG(FATAL) << "should not call the method in column object"; + return StringRef(); + } + + void insert_indices_from(const IColumn& src, const int* indices_begin, + const int* indices_end) override { + LOG(FATAL) << "should not call the method in column object"; + } + + Status try_insert_indices_from(const IColumn& src, const int* indices_begin, + const int* indices_end); + + StringRef serialize_value_into_arena(size_t n, Arena& arena, + char const*& begin) const override { + LOG(FATAL) << "should not call the method in column object"; + return StringRef(); + } + + const char* deserialize_and_insert_from_arena(const char* pos) override { + LOG(FATAL) << "should not call the method in column object"; + return nullptr; + } + + void update_hash_with_value(size_t n, SipHash& hash) const override { + LOG(FATAL) << "should not call the method in column object"; + } + + void insert_data(const char* pos, size_t length) override { + LOG(FATAL) << "should not call the method in column object"; + } + + ColumnPtr filter(const Filter&, ssize_t) const override { + LOG(FATAL) << "should not call the method in column object"; + return nullptr; + } + + ColumnPtr permute(const Permutation&, size_t) const override { + LOG(FATAL) << "should not call the method in column object"; + return nullptr; + } + + int compare_at(size_t n, size_t m, const IColumn& rhs, int nan_direction_hint) const override { + LOG(FATAL) << "should not call the method in column object"; + return 0; + } + + void get_permutation(bool reverse, size_t limit, int nan_direction_hint, + Permutation& res) const override { + LOG(FATAL) << "should not call the method in column object"; + } + + MutableColumns scatter(ColumnIndex, const Selector&) const override { + LOG(FATAL) << "should not call the method in column object"; + return {}; + } + + void replace_column_data(const IColumn&, size_t row, size_t self_row) override { + LOG(FATAL) << "should not call the method in column object"; + } + + void replace_column_data_default(size_t self_row) override { + LOG(FATAL) << "should not call the method in column object"; + } + + virtual void get_extremes(Field& min, Field& max) const override { + LOG(FATAL) << "should not call the method in column object"; + } + + void get_indices_of_non_default_rows(Offsets&, size_t, size_t) const override { + LOG(FATAL) << "should not call the method in column object"; + } + + template + ColumnPtr apply_for_subcolumns(Func&& func, std::string_view func_name) const; + + ColumnPtr index(const IColumn& indexes, size_t limit) const override; + + void strip_outer_array(); + + bool empty() const; +}; +} // namespace doris::vectorized diff --git a/be/src/vec/columns/column_set.h b/be/src/vec/columns/column_set.h index 3b330f82284838..531946f2b6e669 100644 --- a/be/src/vec/columns/column_set.h +++ b/be/src/vec/columns/column_set.h @@ -43,6 +43,8 @@ class ColumnSet final : public COWHelper { ConstSetPtr get_data() const { return data; } + TypeIndex get_data_type() const override { return TypeIndex::String; } + private: ConstSetPtr data; }; diff --git a/be/src/vec/columns/column_string.h b/be/src/vec/columns/column_string.h index 920f480484f80d..075125e8c41a10 100644 --- a/be/src/vec/columns/column_string.h +++ b/be/src/vec/columns/column_string.h @@ -472,6 +472,17 @@ class ColumnString final : public COWHelper { void compare_internal(size_t rhs_row_id, const IColumn& rhs, int nan_direction_hint, int direction, std::vector& cmp_res, uint8* __restrict filter) const override; + MutableColumnPtr get_shinked_column() const { + auto shrinked_column = ColumnString::create(); + for (int i = 0; i < size(); i++) { + StringRef str = get_data_at(i); + reinterpret_cast(shrinked_column.get()) + ->insert_data(str.data, strnlen(str.data, str.size)); + } + return shrinked_column; + } + + TypeIndex get_data_type() const override { return TypeIndex::String; } }; } // namespace doris::vectorized diff --git a/be/src/vec/columns/column_vector.h b/be/src/vec/columns/column_vector.h index c944827fbc832a..d3849eb3c56ca0 100644 --- a/be/src/vec/columns/column_vector.h +++ b/be/src/vec/columns/column_vector.h @@ -395,6 +395,7 @@ class ColumnVector final : public COWHelper> void compare_internal(size_t rhs_row_id, const IColumn& rhs, int nan_direction_hint, int direction, std::vector& cmp_res, uint8* __restrict filter) const override; + TypeIndex get_data_type() const override { return TypeId::value; } protected: Container data; diff --git a/be/src/vec/columns/predicate_column.h b/be/src/vec/columns/predicate_column.h index 5a276233da5bef..16b832cc334bca 100644 --- a/be/src/vec/columns/predicate_column.h +++ b/be/src/vec/columns/predicate_column.h @@ -446,6 +446,10 @@ class PredicateColumnType final : public COWHelper) { insert_string_to_res_column(sel, sel_size, diff --git a/be/src/vec/columns/subcolumn_tree.h b/be/src/vec/columns/subcolumn_tree.h new file mode 100644 index 00000000000000..14288d422582c5 --- /dev/null +++ b/be/src/vec/columns/subcolumn_tree.h @@ -0,0 +1,195 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// This file is copied from +// https://github.com/ClickHouse/ClickHouse/blob/master/src/DataTypes/Serializations/SubcolumnsTree.h +// and modified by Doris + +#pragma once +#include +#include +#include +#include +namespace doris::vectorized { +/// Tree that represents paths in document +/// with additional data in nodes. + +template +class SubcolumnsTree { +public: + struct Node { + enum Kind { + TUPLE, + NESTED, + SCALAR, + }; + + explicit Node(Kind kind_) : kind(kind_) {} + Node(Kind kind_, const NodeData& data_) : kind(kind_), data(data_) {} + Node(Kind kind_, const NodeData& data_, const PathInData& path_) + : kind(kind_), data(data_), path(path_) {} + + Kind kind = TUPLE; + const Node* parent = nullptr; + + Arena strings_pool; + HashMapWithStackMemory, StringRefHash, 4> children; + + NodeData data; + PathInData path; + + bool is_nested() const { return kind == NESTED; } + bool is_scalar() const { return kind == SCALAR; } + + void add_child(std::string_view key, std::shared_ptr next_node) { + next_node->parent = this; + StringRef key_ref {strings_pool.insert(key.data(), key.length()), key.length()}; + children[key_ref] = std::move(next_node); + } + }; + + using NodeKind = typename Node::Kind; + using NodePtr = std::shared_ptr; + + /// Add a leaf without any data in other nodes. + bool add(const PathInData& path, const NodeData& leaf_data) { + return add(path, [&](NodeKind kind, bool exists) -> NodePtr { + if (exists) return nullptr; + + if (kind == Node::SCALAR) return std::make_shared(kind, leaf_data, path); + + return std::make_shared(kind); + }); + } + + /// Callback for creation of node. Receives kind of node and + /// flag, which is true if node already exists. + using NodeCreator = std::function; + + bool add(const PathInData& path, const NodeCreator& node_creator) { + const auto& parts = path.get_parts(); + + if (parts.empty()) return false; + + if (!root) root = std::make_shared(Node::TUPLE); + + Node* current_node = root.get(); + for (size_t i = 0; i < parts.size() - 1; ++i) { + assert(current_node->kind != Node::SCALAR); + + auto it = current_node->children.find( + StringRef {parts[i].key.data(), parts[i].key.size()}); + if (it != current_node->children.end()) { + current_node = it->get_second().get(); + node_creator(current_node->kind, true); + + if (current_node->is_nested() != parts[i].is_nested) return false; + } else { + auto next_kind = parts[i].is_nested ? Node::NESTED : Node::TUPLE; + auto next_node = node_creator(next_kind, false); + current_node->add_child(String(parts[i].key), next_node); + current_node = next_node.get(); + } + } + + auto it = current_node->children.find( + StringRef {parts.back().key.data(), parts.back().key.size()}); + if (it != current_node->children.end()) return false; + + auto next_node = node_creator(Node::SCALAR, false); + current_node->add_child(String(parts.back().key), next_node); + leaves.push_back(std::move(next_node)); + + return true; + } + + /// Find node that matches the path the best. + const Node* find_best_match(const PathInData& path) const { return find_impl(path, false); } + + /// Find node that matches the path exactly. + const Node* find_exact(const PathInData& path) const { return find_impl(path, true); } + + /// Find leaf by path. + const Node* find_leaf(const PathInData& path) const { + const auto* candidate = find_exact(path); + if (!candidate || !candidate->is_scalar()) return nullptr; + return candidate; + } + + using NodePredicate = std::function; + + /// Finds leaf that satisfies the predicate. + const Node* find_leaf(const NodePredicate& predicate) { + return find_leaf(root.get(), predicate); + } + + static const Node* find_leaf(const Node* node, const NodePredicate& predicate) { + if (!node) return nullptr; + + if (node->is_scalar()) return predicate(*node) ? node : nullptr; + + for (auto it = node->children.begin(); it != node->children.end(); ++it) { + auto child = it->get_second(); + if (const auto* leaf = find_leaf(child.get(), predicate)) return leaf; + } + return nullptr; + } + + /// Find first parent node that satisfies the predicate. + static const Node* find_parent(const Node* node, const NodePredicate& predicate) { + while (node && !predicate(*node)) node = node->parent; + return node; + } + + bool empty() const { return root == nullptr; } + size_t size() const { return leaves.size(); } + + using Nodes = std::vector; + + const Nodes& get_leaves() const { return leaves; } + const Node* get_root() const { return root.get(); } + + using iterator = typename Nodes::iterator; + using const_iterator = typename Nodes::const_iterator; + + iterator begin() { return leaves.begin(); } + iterator end() { return leaves.end(); } + + const_iterator begin() const { return leaves.begin(); } + const_iterator end() const { return leaves.end(); } + +private: + const Node* find_impl(const PathInData& path, bool find_exact) const { + if (!root) return nullptr; + + const auto& parts = path.get_parts(); + const Node* current_node = root.get(); + + for (const auto& part : parts) { + auto it = current_node->children.find(StringRef {part.key.data(), part.key.size()}); + if (it == current_node->children.end()) return find_exact ? nullptr : current_node; + + current_node = it->get_second().get(); + } + + return current_node; + } + + NodePtr root; + Nodes leaves; +}; + +} // namespace doris::vectorized diff --git a/be/src/vec/common/hash_table/hash_map.h b/be/src/vec/common/hash_table/hash_map.h index 118b87087d9714..813950533c7fae 100644 --- a/be/src/vec/common/hash_table/hash_map.h +++ b/be/src/vec/common/hash_table/hash_map.h @@ -241,3 +241,10 @@ template , typename Grower = HashTableGrower<>, typename Allocator = HashTableAllocator> using HashMapWithSavedHash = HashMapTable, Hash, Grower, Allocator>; + +template +using HashMapWithStackMemory = HashMapTable< + Key, HashMapCellWithSavedHash, Hash, + HashTableGrower, + HashTableAllocatorWithStackMemory<(1ULL << initial_size_degree) * + sizeof(HashMapCellWithSavedHash)>>; \ No newline at end of file diff --git a/be/src/vec/common/object_util.cpp b/be/src/vec/common/object_util.cpp new file mode 100644 index 00000000000000..90b3027e0da223 --- /dev/null +++ b/be/src/vec/common/object_util.cpp @@ -0,0 +1,730 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// This file is copied from +// https://github.com/ClickHouse/ClickHouse/blob/master/src/DataTypes/ObjectUtils.h +// and modified by Doris + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "gen_cpp/FrontendService.h" +#include "gen_cpp/HeartbeatService_types.h" +#include "olap/rowset/rowset_writer_context.h" +#include "runtime/client_cache.h" +#include "runtime/exec_env.h" +#include "util/thrift_rpc_helper.h" + +namespace doris::vectorized::object_util { +template +static auto extract_vector(const std::vector& vec) { + static_assert(I < std::tuple_size_v); + std::vector> res; + res.reserve(vec.size()); + for (const auto& elem : vec) res.emplace_back(std::get(elem)); + return res; +} + +size_t get_number_of_dimensions(const IDataType& type) { + if (const auto* type_array = typeid_cast(&type)) + return type_array->get_number_of_dimensions(); + return 0; +} +size_t get_number_of_dimensions(const IColumn& column) { + if (const auto* column_array = check_and_get_column(column)) + return column_array->get_number_of_dimensions(); + return 0; +} + +DataTypePtr get_base_type_of_array(const DataTypePtr& type) { + /// Get raw pointers to avoid extra copying of type pointers. + const DataTypeArray* last_array = nullptr; + const auto* current_type = type.get(); + while (const auto* type_array = typeid_cast(current_type)) { + current_type = type_array->get_nested_type().get(); + last_array = type_array; + } + return last_array ? last_array->get_nested_type() : type; +} + +Array create_empty_array_field(size_t num_dimensions) { + DCHECK(num_dimensions > 0); + Array array; + Array* current_array = &array; + for (size_t i = 1; i < num_dimensions; ++i) { + current_array->push_back(Array()); + current_array = ¤t_array->back().get(); + } + return array; +} + +Status convert_objects_to_tuples(Block& block) { + for (auto& column : block) { + if (!column.type->is_object()) continue; + auto& column_object = assert_cast(*column.column->assume_mutable()); + column_object.finalize(); + const auto& subcolumns = column_object.get_subcolumns(); + if (!column_object.is_finalized()) + return Status::InvalidArgument("Can't convert object to tuple"); + PathsInData tuple_paths; + DataTypes tuple_types; + Columns tuple_columns; + for (const auto& entry : subcolumns) { + tuple_paths.emplace_back(entry->path); + tuple_types.emplace_back(entry->data.getLeastCommonType()); + tuple_columns.emplace_back(entry->data.get_finalized_column_ptr()); + } + std::tie(column.column, column.type) = + unflatten_tuple(tuple_paths, tuple_types, tuple_columns); + } + return Status::OK(); +} + +DataTypePtr unflatten_tuple(const PathsInData& paths, const DataTypes& tuple_types) { + assert(paths.size() == tuple_types.size()); + Columns tuple_columns; + tuple_columns.reserve(tuple_types.size()); + for (const auto& type : tuple_types) tuple_columns.emplace_back(type->create_column()); + return unflatten_tuple(paths, tuple_types, tuple_columns).second; +} +ColumnPtr reduce_number_of_dimensions(ColumnPtr column, size_t dimensions_to_reduce) { + while (dimensions_to_reduce--) { + const auto* column_array = typeid_cast(column.get()); + DCHECK(column_array) << "Not enough dimensions to reduce"; + column = column_array->get_data_ptr(); + } + return column; +} +DataTypePtr reduce_number_of_dimensions(DataTypePtr type, size_t dimensions_to_reduce) { + while (dimensions_to_reduce--) { + const auto* type_array = typeid_cast(type.get()); + DCHECK(type_array) << "Not enough dimensions to reduce"; + type = type_array->get_nested_type(); + } + return type; +} + +struct ColumnWithTypeAndDimensions { + ColumnPtr column; + DataTypePtr type; + size_t array_dimensions; +}; +using SubcolumnsTreeWithColumns = SubcolumnsTree; +using Node = SubcolumnsTreeWithColumns::Node; + +// Creates data type and column from tree of subcolumns. +// ColumnWithTypeAndDimensions create_type_from_node(const Node* node) { +// auto collect_tuple_elemets = [](const auto& children) { +// std::vector> tuple_elements; +// tuple_elements.reserve(children.size()); +// //for (const auto & [name, child] : children) +// for (auto it = children.begin(); it != children.end(); ++it) { +// auto column = create_type_from_node(it->get_second().get()); +// tuple_elements.emplace_back(it->get_first(), std::move(column)); +// } +// /// Sort to always create the same type for the same set of subcolumns. +// std::sort(tuple_elements.begin(), tuple_elements.end(), +// [](const auto& lhs, const auto& rhs) { +// return std::get<0>(lhs) < std::get<0>(rhs); +// }); +// auto tuple_names = extract_vector<0>(tuple_elements); +// auto tuple_columns = extract_vector<1>(tuple_elements); +// return std::make_tuple(std::move(tuple_names), std::move(tuple_columns)); +// }; +// if (node->kind == Node::SCALAR) { +// return node->data; +// } else if (node->kind == Node::NESTED) { +// auto [tuple_names, tuple_columns] = collect_tuple_elemets(node->children); +// Columns offsets_columns; +// offsets_columns.reserve(tuple_columns[0].array_dimensions + 1); +// /// If we have a Nested node and child node with anonymous array levels +// /// we need to push a Nested type through all array levels. +// /// Example: { "k1": [[{"k2": 1, "k3": 2}] } should be parsed as +// /// `k1 Array(Nested(k2 Int, k3 Int))` and k1 is marked as Nested +// /// and `k2` and `k3` has anonymous_array_level = 1 in that case. +// const auto& current_array = assert_cast(*node->data.column); +// offsets_columns.push_back(current_array.get_offsets_ptr()); +// auto first_column = tuple_columns[0].column; +// for (size_t i = 0; i < tuple_columns[0].array_dimensions; ++i) { +// const auto& column_array = assert_cast(*first_column); +// offsets_columns.push_back(column_array.get_offsets_ptr()); +// first_column = column_array.get_data_ptr(); +// } +// size_t num_elements = tuple_columns.size(); +// Columns tuple_elements_columns(num_elements); +// DataTypes tuple_elements_types(num_elements); +// /// Reduce extra array dimensions to get columns and types of Nested elements. +// for (size_t i = 0; i < num_elements; ++i) { +// assert(tuple_columns[i].array_dimensions == tuple_columns[0].array_dimensions); +// tuple_elements_columns[i] = reduce_number_of_dimensions( +// tuple_columns[i].column, tuple_columns[i].array_dimensions); +// tuple_elements_types[i] = reduce_number_of_dimensions( +// tuple_columns[i].type, tuple_columns[i].array_dimensions); +// } +// auto result_column = ColumnArray::create(ColumnTuple::create(tuple_elements_columns), +// offsets_columns.back()); +// auto result_type = std::make_shared( +// std::make_shared(tuple_elements_types, tuple_names)); +// /// Recreate result Array type and Array column. +// for (auto it = offsets_columns.rbegin() + 1; it != offsets_columns.rend(); ++it) { +// result_column = ColumnArray::create(result_column, *it); +// result_type = std::make_shared(result_type); +// } +// return {result_column, result_type, tuple_columns[0].array_dimensions}; +// } else { +// auto [tuple_names, tuple_columns] = collect_tuple_elemets(node->children); +// size_t num_elements = tuple_columns.size(); +// Columns tuple_elements_columns(num_elements); +// DataTypes tuple_elements_types(num_elements); +// for (size_t i = 0; i < tuple_columns.size(); ++i) { +// assert(tuple_columns[i].array_dimensions == tuple_columns[0].array_dimensions); +// tuple_elements_columns[i] = tuple_columns[i].column; +// tuple_elements_types[i] = tuple_columns[i].type; +// } +// auto result_column = ColumnTuple::create(tuple_elements_columns); +// auto result_type = std::make_shared(tuple_elements_types, tuple_names); +// return {result_column, result_type, tuple_columns[0].array_dimensions}; +// } +// } +// +// std::pair unflatten_tuple(const PathsInData& paths, +// const DataTypes& tuple_types, +// const Columns& tuple_columns) { +// assert(paths.size() == tuple_types.size()); +// assert(paths.size() == tuple_columns.size()); +// /// We add all paths to the subcolumn tree and then create a type from it. +// /// The tree stores column, type and number of array dimensions +// /// for each intermediate node. +// SubcolumnsTreeWithColumns tree; +// for (size_t i = 0; i < paths.size(); ++i) { +// auto column = tuple_columns[i]; +// auto type = tuple_types[i]; +// const auto& parts = paths[i].get_parts(); +// size_t num_parts = parts.size(); +// size_t pos = 0; +// tree.add(paths[i], [&](Node::Kind kind, bool exists) -> std::shared_ptr { +// DCHECK(pos < num_parts) << "Not enough name parts for path" << paths[i].get_path() +// << "Expected at least " << pos + 1 << ", got " << num_parts; +// size_t array_dimensions = kind == Node::NESTED ? 1 : parts[pos].anonymous_array_level; +// ColumnWithTypeAndDimensions current_column {column, type, array_dimensions}; +// /// Get type and column for next node. +// if (array_dimensions) { +// type = reduce_number_of_dimensions(type, array_dimensions); +// column = reduce_number_of_dimensions(column, array_dimensions); +// } +// ++pos; +// if (exists) return nullptr; +// return kind == Node::SCALAR ? std::make_shared(kind, current_column, paths[i]) +// : std::make_shared(kind, current_column); +// }); +// } +// auto [column, type, _] = create_type_from_node(tree.get_root()); +// return std::make_pair(std::move(column), std::move(type)); +// } +// +// void flatten_tuple_impl(PathInDataBuilder& builder, DataTypePtr type, +// std::vector& new_paths, DataTypes& new_types) { +// if (const auto* type_tuple = typeid_cast(type.get())) { +// const auto& tuple_names = type_tuple->get_element_names(); +// const auto& tuple_types = type_tuple->get_elements(); +// +// for (size_t i = 0; i < tuple_names.size(); ++i) { +// builder.append(tuple_names[i], false); +// flatten_tuple_impl(builder, tuple_types[i], new_paths, new_types); +// builder.pop_back(); +// } +// } +// // TODO(lhy) flatten nested array +// //else if (const auto * type_array = typeid_cast(type.get())) +// //{ +// // PathInDataBuilder element_builder; +// // std::vector element_paths; +// // DataTypes element_types; +// +// // flatten_tuple_impl(element_builder, type_array->get_nested_type(), element_paths, element_types); +// // assert(element_paths.size() == element_types.size()); +// +// // for (size_t i = 0; i < element_paths.size(); ++i) +// // { +// // builder.append(element_paths[i], true); +// // new_paths.emplace_back(builder.get_parts()); +// // new_types.emplace_back(std::make_shared(element_types[i])); +// // builder.pop_back(element_paths[i].size()); +// // } +// //} +// else { +// new_paths.emplace_back(builder.get_parts()); +// new_types.emplace_back(type); +// } +// } +// +// /// @offsets_columns are used as stack of array offsets and allows to recreate Array columns. +// void flatten_tuple_impl(const ColumnPtr& column, Columns& new_columns, Columns& offsets_columns) { +// if (const auto* column_tuple = check_and_get_column(column.get())) { +// const auto& subcolumns = column_tuple->get_columns(); +// for (const auto& subcolumn : subcolumns) +// flatten_tuple_impl(subcolumn, new_columns, offsets_columns); +// } else { +// // TODO(lhy) flatten nested array +// new_columns.push_back(column); +// } +// } +// +// std::pair flatten_tuple(const DataTypePtr& type) { +// std::vector new_path_parts; +// DataTypes new_types; +// PathInDataBuilder builder; +// +// flatten_tuple_impl(builder, type, new_path_parts, new_types); +// +// PathsInData new_paths(new_path_parts.begin(), new_path_parts.end()); +// return {new_paths, new_types}; +// } +// +// void flatten_tuple(Block& block) { +// size_t pos = 0; +// Columns columns; +// PathsInData paths; +// DataTypes types; +// for (auto& column : block) { +// if (check_and_get_column(column.column)) { +// columns = flatten_tuple(column.column); +// std::tie(paths, types) = flatten_tuple(column.type); +// DCHECK_EQ(columns.size(), types.size()); +// break; +// } +// ++pos; +// } +// DCHECK_EQ(pos, block.columns() - 1); +// block.erase(pos); +// for (size_t i = 0; i < columns.size(); ++i) { +// if (paths[i].get_path() != ColumnObject::COLUMN_NAME_DUMMY) +// block.insert(ColumnWithTypeAndName {columns[i], types[i], paths[i].get_path()}); +// } +// } +// +// Columns flatten_tuple(const ColumnPtr& column) { +// Columns new_columns; +// Columns offsets_columns; +// +// flatten_tuple_impl(column, new_columns, offsets_columns); +// return new_columns; +// } + +FieldType get_field_type(const IDataType* data_type) { + switch (data_type->get_type_id()) { + case TypeIndex::UInt8: + return FieldType::OLAP_FIELD_TYPE_UNSIGNED_TINYINT; + case TypeIndex::UInt16: + return FieldType::OLAP_FIELD_TYPE_UNSIGNED_SMALLINT; + case TypeIndex::UInt32: + return FieldType::OLAP_FIELD_TYPE_UNSIGNED_INT; + case TypeIndex::UInt64: + return FieldType::OLAP_FIELD_TYPE_UNSIGNED_BIGINT; + case TypeIndex::Int8: + return FieldType::OLAP_FIELD_TYPE_TINYINT; + case TypeIndex::Int16: + return FieldType::OLAP_FIELD_TYPE_SMALLINT; + case TypeIndex::Int32: + return FieldType::OLAP_FIELD_TYPE_INT; + case TypeIndex::Int64: + return FieldType::OLAP_FIELD_TYPE_BIGINT; + case TypeIndex::Float32: + return FieldType::OLAP_FIELD_TYPE_FLOAT; + case TypeIndex::Float64: + return FieldType::OLAP_FIELD_TYPE_DOUBLE; + case TypeIndex::Decimal32: + return FieldType::OLAP_FIELD_TYPE_DECIMAL; + case TypeIndex::Array: + return FieldType::OLAP_FIELD_TYPE_ARRAY; + case TypeIndex::String: + return FieldType::OLAP_FIELD_TYPE_STRING; + case TypeIndex::Date: + return FieldType::OLAP_FIELD_TYPE_DATE; + case TypeIndex::DateTime: + return FieldType::OLAP_FIELD_TYPE_DATETIME; + case TypeIndex::Tuple: + return FieldType::OLAP_FIELD_TYPE_STRUCT; + // TODO add more types + default: + LOG(FATAL) << "unknow type"; + return FieldType::OLAP_FIELD_TYPE_UNKNOWN; + } +} + +void convert_to_tablet_column(const DataTypePtr& data_type, TabletColumn* column) { + if (data_type->is_nullable()) { + const auto& real_type = static_cast(*data_type); + column->set_is_nullable(true); + convert_to_tablet_column(real_type.get_nested_type(), column); + return; + } + column->set_index_length(-1); + column->set_is_key(false); + column->set_type(get_field_type(data_type.get())); + if (data_type->get_type_id() == TypeIndex::Array) { + TabletColumn children; + convert_to_tablet_column( + assert_cast(data_type.get())->get_nested_type(), &children); + column->add_sub_column(children); + return; + } + if (data_type->get_type_id() == TypeIndex::Tuple) { + auto tuple_type = assert_cast(data_type.get()); + DCHECK_EQ(tuple_type->get_elements().size(), tuple_type->get_element_names().size()); + for (size_t i = 0; i < tuple_type->get_elements().size(); ++i) { + TabletColumn children; + convert_to_tablet_column(tuple_type->get_element(i), &children); + children.set_name(tuple_type->get_name_by_position(i)); + column->add_sub_column(children); + } + return; + } + if (data_type->get_type_id() == TypeIndex::String) { + return; + } + if (WhichDataType(*data_type).is_simple()) { + column->set_length(data_type->get_size_of_value_in_memory()); + return; + } +} + +Status parse_object_column(ColumnObject& dest, const IColumn& src, bool need_finalize, + const int* row_begin, const int* row_end) { + assert(src.is_column_string()); + const ColumnString* parsing_column {nullptr}; + if (!src.is_nullable()) { + parsing_column = reinterpret_cast(src.get_ptr().get()); + } else { + auto nullable_column = reinterpret_cast(src.get_ptr().get()); + parsing_column = reinterpret_cast( + nullable_column->get_nested_column().get_ptr().get()); + } + std::vector jsons; + if (row_begin != nullptr) { + assert(row_end); + for (auto x = row_begin; x != row_end; ++x) { + StringRef ref = parsing_column->get_data_at(*x); + jsons.push_back(ref); + } + } else { + for (size_t i = 0; i < parsing_column->size(); ++i) { + StringRef ref = parsing_column->get_data_at(i); + jsons.push_back(ref); + } + } + // batch parse + RETURN_IF_ERROR(parse_json_to_variant(dest, jsons)); + + if (need_finalize) { + dest.finalize(); + } + return Status::OK(); +} + +Status parse_object_column(Block& block, size_t position) { + // parse variant column and rewrite column + auto col = block.get_by_position(position).column; + const std::string& col_name = block.get_by_position(position).name; + if (!col->is_column_string()) { + return Status::InvalidArgument("only ColumnString can be parsed to ColumnObject"); + } + vectorized::DataTypePtr type( + std::make_shared("", col->is_nullable())); + auto column_object = type->create_column(); + RETURN_IF_ERROR( + parse_object_column(assert_cast(column_object->assume_mutable_ref()), + *col, true /*need finalize*/, nullptr, nullptr)); + // replace by object + block.safe_get_by_position(position).column = column_object->get_ptr(); + block.safe_get_by_position(position).type = type; + block.safe_get_by_position(position).name = col_name; + return Status::OK(); +} + +void flatten_object(Block& block, size_t pos, bool replace_if_duplicated) { + auto column_object_ptr = + assert_cast(block.get_by_position(pos).column->assume_mutable().get()); + if (column_object_ptr->empty()) { + block.erase(pos); + return; + } + size_t num_rows = column_object_ptr->size(); + assert(block.rows() <= num_rows); + assert(column_object_ptr->is_finalized()); + Columns subcolumns; + DataTypes types; + Names names; + for (auto& subcolumn : column_object_ptr->get_subcolumns()) { + subcolumns.push_back(subcolumn->data.get_finalized_column().get_ptr()); + types.push_back(subcolumn->data.getLeastCommonType()); + names.push_back(subcolumn->path.get_path()); + } + block.erase(pos); + for (size_t i = 0; i < subcolumns.size(); ++i) { + // block may already contains this column, eg. key columns, we should ignore + // or replcace the same column from object subcolumn + if (block.has(names[i])) { + if (replace_if_duplicated) { + auto& column_type_name = block.get_by_name(names[i]); + column_type_name.column = subcolumns[i]; + column_type_name.type = types[i]; + } + continue; + } + block.insert(ColumnWithTypeAndName {subcolumns[i], types[i], names[i]}); + } + + // fill default value + for (auto& [column, _1, _2] : block.get_columns_with_type_and_name()) { + if (column->size() < num_rows) { + column->assume_mutable()->insert_many_defaults(num_rows - column->size()); + } + } +} + +Status flatten_object(Block& block, bool replace_if_duplicated) { + auto object_pos = + std::find_if(block.begin(), block.end(), [](const ColumnWithTypeAndName& column) { + return column.type->get_type_id() == TypeIndex::VARIANT; + }); + if (object_pos != block.end()) { + flatten_object(block, object_pos - block.begin(), replace_if_duplicated); + } + return Status::OK(); +} + +bool is_conversion_required_between_integers(const IDataType& lhs, const IDataType& rhs) { + WhichDataType which_lhs(lhs); + WhichDataType which_rhs(rhs); + bool is_native_int = which_lhs.is_native_int() && which_rhs.is_native_int(); + bool is_native_uint = which_lhs.is_native_uint() && which_rhs.is_native_uint(); + return (is_native_int || is_native_uint) && + lhs.get_size_of_value_in_memory() <= rhs.get_size_of_value_in_memory(); +} + +bool is_conversion_required_between_integers(FieldType lhs, FieldType rhs) { + // We only support signed integers for semi-structure data at present + // TODO add unsigned integers + if (lhs == OLAP_FIELD_TYPE_BIGINT) { + return !(rhs == OLAP_FIELD_TYPE_TINYINT || rhs == OLAP_FIELD_TYPE_SMALLINT || + rhs == OLAP_FIELD_TYPE_INT || rhs == OLAP_FIELD_TYPE_BIGINT); + } + if (lhs == OLAP_FIELD_TYPE_INT) { + return !(rhs == OLAP_FIELD_TYPE_TINYINT || rhs == OLAP_FIELD_TYPE_SMALLINT || + rhs == OLAP_FIELD_TYPE_INT); + } + if (lhs == OLAP_FIELD_TYPE_SMALLINT) { + return !(rhs == OLAP_FIELD_TYPE_TINYINT || rhs == OLAP_FIELD_TYPE_SMALLINT); + } + if (lhs == OLAP_FIELD_TYPE_TINYINT) { + return !(rhs == OLAP_FIELD_TYPE_TINYINT); + } + return true; +} + +Status cast_column(const ColumnWithTypeAndName& arg, const DataTypePtr& type, ColumnPtr* result) { + ColumnsWithTypeAndName arguments {arg, + {type->create_column_const_with_default_value(1), type, ""}}; + auto function = SimpleFunctionFactory::instance().get_function("CAST", arguments, type); + Block tmp_block {arguments}; + // the 0 position is input argument, the 1 position is to type argument, the 2 position is result argument + vectorized::ColumnNumbers argnum; + argnum.emplace_back(0); + argnum.emplace_back(1); + size_t result_column = tmp_block.columns(); + tmp_block.insert({nullptr, type, arg.name}); + RETURN_IF_ERROR( + function->execute(nullptr, tmp_block, argnum, result_column, arg.column->size())); + *result = tmp_block.get_by_position(result_column).column; + return Status::OK(); +} + +static void get_column_def(const vectorized::DataTypePtr& data_type, const std::string& name, + TColumnDef* column) { + if (!name.empty()) { + column->columnDesc.__set_columnName(name); + } + if (data_type->is_nullable()) { + const auto& real_type = static_cast(*data_type); + column->columnDesc.__set_isAllowNull(true); + get_column_def(real_type.get_nested_type(), "", column); + return; + } + column->columnDesc.__set_columnType(to_thrift(get_primitive_type(data_type->get_type_id()))); + if (data_type->get_type_id() == TypeIndex::Array) { + TColumnDef child; + column->columnDesc.__set_children({}); + get_column_def(assert_cast(data_type.get())->get_nested_type(), "", + &child); + column->columnDesc.columnLength = + TabletColumn::get_field_length_by_type(column->columnDesc.columnType, 0); + column->columnDesc.children.push_back(child.columnDesc); + return; + } + if (data_type->get_type_id() == TypeIndex::Tuple) { + // TODO + // auto tuple_type = assert_cast(data_type.get()); + // DCHECK_EQ(tuple_type->get_elements().size(), tuple_type->get_element_names().size()); + // for (size_t i = 0; i < tuple_type->get_elements().size(); ++i) { + // TColumnDef child; + // get_column_def(tuple_type->get_element(i), tuple_type->get_element_names()[i], &child); + // column->columnDesc.children.push_back(child.columnDesc); + // } + // return; + } + if (data_type->get_type_id() == TypeIndex::String) { + return; + } + if (WhichDataType(*data_type).is_simple()) { + column->columnDesc.__set_columnLength(data_type->get_size_of_value_in_memory()); + return; + } + return; +} + +// send an empty add columns rpc, the rpc response will fill with base schema info +// maybe we could seperate this rpc from add columns rpc +Status send_fetch_full_base_schema_view_rpc(FullBaseSchemaView* schema_view) { + TAddColumnsRequest req; + TAddColumnsResult res; + TTabletInfo tablet_info; + req.__set_table_name(schema_view->table_name); + req.__set_db_name(schema_view->db_name); + req.__set_table_id(schema_view->table_id); + auto master_addr = ExecEnv::GetInstance()->master_info()->network_address; + Status rpc_st = ThriftRpcHelper::rpc( + master_addr.hostname, master_addr.port, + [&req, &res](FrontendServiceConnection& client) { client->addColumns(res, req); }, + config::txn_commit_rpc_timeout_ms); + if (!rpc_st.ok()) { + return Status::InternalError("Failed to fetch schema info, encounter rpc failure"); + } + // TODO(lhy) handle more status code + if (res.status.status_code != TStatusCode::OK) { + LOG(WARNING) << "failed to fetch schema info, code:" << res.status.status_code + << ", msg:" << res.status.error_msgs[0]; + return Status::InvalidArgument( + fmt::format("Failed to fetch schema info, {}", res.status.error_msgs[0])); + } + for (const auto& column : res.allColumns) { + schema_view->column_name_to_column[column.column_name] = column; + } + schema_view->schema_version = res.schema_version; + return Status::OK(); +} + +// Do batch add columns schema change +// only the base table supported +Status send_add_columns_rpc(ColumnsWithTypeAndName column_type_names, + FullBaseSchemaView* schema_view) { + if (column_type_names.empty()) { + return Status::OK(); + } + TAddColumnsRequest req; + TAddColumnsResult res; + TTabletInfo tablet_info; + req.__set_table_name(schema_view->table_name); + req.__set_db_name(schema_view->db_name); + req.__set_table_id(schema_view->table_id); + // TODO(lhy) more configurable + req.__set_type_conflict_free(true); + for (const auto& column_type_name : column_type_names) { + TColumnDef col; + get_column_def(column_type_name.type, column_type_name.name, &col); + req.addColumns.push_back(col); + } + auto master_addr = ExecEnv::GetInstance()->master_info()->network_address; + Status rpc_st = ThriftRpcHelper::rpc( + master_addr.hostname, master_addr.port, + [&req, &res](FrontendServiceConnection& client) { client->addColumns(res, req); }, + config::txn_commit_rpc_timeout_ms); + if (!rpc_st.ok()) { + return Status::InternalError("Failed to do schema change, rpc error"); + } + // TODO(lhy) handle more status code + if (res.status.status_code != TStatusCode::OK) { + LOG(WARNING) << "failed to do schema change, code:" << res.status.status_code + << ", msg:" << res.status.error_msgs[0]; + return Status::InvalidArgument( + fmt::format("Failed to do schema change, {}", res.status.error_msgs[0])); + } + size_t sz = res.allColumns.size(); + if (sz < column_type_names.size()) { + return Status::InternalError( + fmt::format("Unexpected result columns {}, expected at least {}", + res.allColumns.size(), column_type_names.size())); + } + for (const auto& column : res.allColumns) { + schema_view->column_name_to_column[column.column_name] = column; + } + schema_view->schema_version = res.schema_version; + return Status::OK(); +} + +template +void align_block_by_name_and_type(MutableBlock* mblock, const Block* block, size_t row_cnt, + ColumnInserterFn inserter) { + assert(!mblock->get_names().empty()); + const auto& names = mblock->get_names(); + [[maybe_unused]] const auto& data_types = mblock->data_types(); + for (size_t i = 0; i < mblock->columns(); ++i) { + auto& dst = mblock->get_column_by_position(i); + if (!block->has(names[i])) { + dst->insert_many_defaults(row_cnt); + } else { + assert(data_types[i]->equals(*block->get_by_name(names[i]).type)); + const auto& src = *(block->get_by_name(names[i]).column.get()); + inserter(src, dst); + } + } + for (const auto& [column, type, name] : *block) { + // encounter a new column + if (!mblock->has(name)) { + auto new_column = type->create_column(); + new_column->insert_many_defaults(mblock->rows()); + inserter(*column.get(), new_column); + mblock->mutable_columns().push_back(std::move(new_column)); + mblock->data_types().push_back(type); + mblock->get_names().push_back(name); + } + } +} + +void align_block_by_name_and_type(MutableBlock* mblock, const Block* block, const int* row_begin, + const int* row_end) { + align_block_by_name_and_type(mblock, block, row_end - row_begin, + [row_begin, row_end](const IColumn& src, MutableColumnPtr& dst) { + dst->insert_indices_from(src, row_begin, row_end); + }); +} +void align_block_by_name_and_type(MutableBlock* mblock, const Block* block, size_t row_begin, + size_t length) { + align_block_by_name_and_type(mblock, block, length, + [row_begin, length](const IColumn& src, MutableColumnPtr& dst) { + dst->insert_range_from(src, row_begin, length); + }); +} + +} // namespace doris::vectorized::object_util diff --git a/be/src/vec/common/object_util.h b/be/src/vec/common/object_util.h new file mode 100644 index 00000000000000..021fcf3762067a --- /dev/null +++ b/be/src/vec/common/object_util.h @@ -0,0 +1,146 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// https://github.com/ClickHouse/ClickHouse/blob/master/src/DataTypes/ObjectUtils.cpp +// and modified by Doris + +#pragma once + +#include +#include +#include +#include +#include +#include + +#include "olap/tablet_schema.h" + +namespace doris { +class RowsetLocalSchemaChangeHistory; +} + +namespace doris::vectorized::object_util { +/// Returns number of dimensions in Array type. 0 if type is not array. +size_t get_number_of_dimensions(const IDataType& type); + +/// Returns number of dimensions in Array column. 0 if column is not array. +size_t get_number_of_dimensions(const IColumn& column); + +/// Returns type of scalars of Array of arbitrary dimensions. +DataTypePtr get_base_type_of_array(const DataTypePtr& type); + +/// Returns Array with requested number of dimensions and no scalars. +Array create_empty_array_field(size_t num_dimensions); + +/// Converts Object types and columns to Tuples in @columns_list and @block +/// and checks that types are consistent with types in @extended_storage_columns. +Status convert_objects_to_tuples(Block& block); + +/// Receives several Tuple types and deduces the least common type among them. +DataTypePtr get_least_common_type_for_object(const DataTypes& types, + bool check_ambiguos_paths = false); + +/// Flattens nested Tuple to plain Tuple. I.e extracts all paths and types from tuple. +/// E.g. Tuple(t Tuple(c1 UInt32, c2 String), c3 UInt64) -> Tuple(t.c1 UInt32, t.c2 String, c3 UInt32) +std::pair flatten_tuple(const DataTypePtr& type); + +/// Flattens nested Tuple column to plain columns. +Columns flatten_tuple(const ColumnPtr& column); + +void flatten_tuple(Block& block); + +/// The reverse operation to 'flattenTuple'. +/// Creates nested Tuple from all paths and types. +/// E.g. Tuple(t.c1 UInt32, t.c2 String, c3 UInt32) -> Tuple(t Tuple(c1 UInt32, c2 String), c3 UInt64) +DataTypePtr unflatten_tuple(const PathsInData& paths, const DataTypes& tuple_types); + +std::pair unflatten_tuple(const PathsInData& paths, + const DataTypes& tuple_types, + const Columns& tuple_columns); + +// None nested type +FieldType get_field_type(const IDataType* data_type); +// NOTICE: output column only used for generating none key anounymous column writer +// eg. We use this to generate variant type column which we converted to tuple for +// convenience + +void convert_to_tablet_column(const DataTypePtr& data_type, TabletColumn* column); + +// NOTICE: the last column must be dynamic column +// 1. The dynamic column will be parsed to ColumnObject and the parsed column will +// be flattened to multiple subcolumns, thus the dynamic schema is infered from the +// dynamic column. +// 2. Schema change which is add columns will be performed if the infered schema is +// different from the original tablet schema, new columns added to schema change history +Status parse_and_expand_dynamic_column(Block& block, const TabletSchema& schema_hints, + RowsetLocalSchemaChangeHistory* history); + +Status parse_object_column(Block& block, size_t position); + +Status parse_object_column(ColumnObject& dest, const IColumn& src, bool need_finalize, + const int* row_begin, const int* row_end); + +// Object column will be flattened and if replace_if_duplicated +// the original column in the block will be replaced with the subcolumn +// from object column.Also if column in block is empty, it will be filled +// with num_rows of default values +Status flatten_object(Block& block, bool replace_if_duplicated); + +/// If both of types are signed/unsigned integers and size of left field type +/// is less than right type, we don't need to convert field, +/// because all integer fields are stored in Int64/UInt64. +bool is_conversion_required_between_integers(const IDataType& lhs, const IDataType& rhs); +bool is_conversion_required_between_integers(FieldType lhs, FieldType rhs); + +// Cast column to type +Status cast_column(const ColumnWithTypeAndName& arg, const DataTypePtr& type, ColumnPtr* result); + +// Align block schema with tablet schema +// eg. +// Block: col1(int), col2(string) +// Schema: col1(double), col3(date) +// 1. col1(int) in block which type missmatch with schema col1 will be converted to double +// 2. col2 in block which missing in current schema will launch a schema change rpc +// 3. col3 in schema which missing in block will be ignored +// After schema changed, schame change history will add new columns +Status align_block_with_schema(const TabletSchema& schema, int64_t table_id /*for schema change*/, + Block& block, RowsetLocalSchemaChangeHistory* history); +// record base schema column infos +// maybe use col_unique_id as key in the future +// but for dynamic table, column name if ok +struct FullBaseSchemaView { + phmap::flat_hash_map column_name_to_column; + int32_t schema_version = -1; + int32_t table_id = 0; + std::string table_name; + std::string db_name; + + bool empty() { return column_name_to_column.empty() && schema_version == -1; } +}; + +Status send_add_columns_rpc(ColumnsWithTypeAndName column_type_names, + FullBaseSchemaView* schema_view); + +Status send_fetch_full_base_schema_view_rpc(FullBaseSchemaView* schema_view); + +// block alignment +// TODO using column_unique_id instead of names +void align_block_by_name_and_type(MutableBlock* mblock, const Block* block, const int* row_begin, + const int* row_end); +void align_block_by_name_and_type(MutableBlock* mblock, const Block* block, size_t row_begin, + size_t length); + +} // namespace doris::vectorized::object_util diff --git a/be/src/vec/common/sip_hash.h b/be/src/vec/common/sip_hash.h index 21f1870e83abc7..e9afdca10a6a9d 100644 --- a/be/src/vec/common/sip_hash.h +++ b/be/src/vec/common/sip_hash.h @@ -198,6 +198,12 @@ class SipHash { finalize(); return v0 ^ v1 ^ v2 ^ v3; } + + template + ALWAYS_INLINE void get128(T& dst) { + static_assert(sizeof(T) == 16); + get128(reinterpret_cast(&dst)); + } }; #undef ROTL diff --git a/be/src/vec/common/typeid_cast.h b/be/src/vec/common/typeid_cast.h index 60ef9743d9fdfe..0284c911068edb 100644 --- a/be/src/vec/common/typeid_cast.h +++ b/be/src/vec/common/typeid_cast.h @@ -29,6 +29,14 @@ #include "vec/common/demangle.h" #include "vec/common/exception.h" +#define TYPEID_MAP(_A) \ + template <> \ + inline constexpr TypeIndex TypeToTypeIndex<_A> = TypeIndex::_A; \ + template <> \ + struct TypeIndexToTypeHelper : std::true_type { \ + using T = _A; \ + }; + /** Checks type by comparing typeid. * The exact match of the type is checked. That is, cast to the ancestor will be unsuccessful. * In the rest, behaves like a dynamic_cast. diff --git a/be/src/vec/core/accurate_comparison.h b/be/src/vec/core/accurate_comparison.h index e52cc4ef6596c5..bfb6f928adbd98 100644 --- a/be/src/vec/core/accurate_comparison.h +++ b/be/src/vec/core/accurate_comparison.h @@ -456,22 +456,36 @@ inline bool_if_safe_conversion greaterOrEqualsOp(A a, B b) { } /// Converts numeric to an equal numeric of other type. -template +/// When `strict` is `true` check that result exactly same as input, otherwise just check overflow +template inline bool convertNumeric(From value, To& result) { /// If the type is actually the same it's not necessary to do any checks. if constexpr (std::is_same_v) { result = value; return true; } - - /// Note that NaNs doesn't compare equal to anything, but they are still in range of any Float type. - if (is_nan(value) && std::is_floating_point_v) { - result = value; - return true; + if constexpr (std::is_floating_point_v && std::is_floating_point_v) { + /// Note that NaNs doesn't compare equal to anything, but they are still in range of any Float type. + if (is_nan(value)) { + result = value; + return true; + } + if (value == std::numeric_limits::infinity()) { + result = std::numeric_limits::infinity(); + return true; + } + if (value == -std::numeric_limits::infinity()) { + result = -std::numeric_limits::infinity(); + return true; + } + } + if (greaterOp(value, std::numeric_limits::max()) || + lessOp(value, std::numeric_limits::lowest())) { + return false; } - result = static_cast(value); - return equalsOp(value, result); + if constexpr (strict) return equalsOp(value, result); + return true; } } // namespace accurate diff --git a/be/src/vec/core/field.h b/be/src/vec/core/field.h index 78ac881a19a062..bf9f59c18304fe 100644 --- a/be/src/vec/core/field.h +++ b/be/src/vec/core/field.h @@ -87,6 +87,14 @@ DEFINE_FIELD_VECTOR(Array); DEFINE_FIELD_VECTOR(Tuple); DEFINE_FIELD_VECTOR(Map); +using FieldMap = std::map>; +#define DEFINE_FIELD_MAP(X) \ + struct X : public FieldMap { \ + using FieldMap::FieldMap; \ + } +DEFINE_FIELD_MAP(Object); +#undef DEFINE_FIELD_MAP + #undef DEFINE_FIELD_VECTOR struct AggregateFunctionStateData { @@ -310,6 +318,7 @@ class Field { JSONB = 23, Decimal128I = 24, Map = 25, + Object = 26, }; static const int MIN_NON_POD = 16; @@ -350,6 +359,8 @@ class Field { return "AggregateFunctionState"; case FixedLengthObject: return "FixedLengthObject"; + case Object: + return "Object"; } LOG(FATAL) << "Bad type of Field"; @@ -526,6 +537,8 @@ class Field { return get() < rhs.get(); case Types::FixedLengthObject: break; + case Types::Object: + return get() < rhs.get(); } LOG(FATAL) << "Bad type of Field"; @@ -573,6 +586,8 @@ class Field { return get() <= rhs.get(); case Types::FixedLengthObject: break; + case Types::Object: + return get() <= rhs.get(); } LOG(FATAL) << "Bad type of Field"; return {}; @@ -616,6 +631,8 @@ class Field { return get() == rhs.get(); case Types::FixedLengthObject: break; + case Types::Object: + return get() == rhs.get(); } CHECK(false) << "Bad type of Field"; @@ -711,6 +728,9 @@ class Field { case Types::FixedLengthObject: LOG(FATAL) << "FixedLengthObject not supported"; break; + case Types::Object: + f(field.template get()); + return; } } @@ -771,6 +791,9 @@ class Field { case Types::AggregateFunctionState: destroy(); break; + case Types::Object: + destroy(); + break; default: break; } @@ -788,33 +811,53 @@ class Field { #undef DBMS_MIN_FIELD_SIZE +template <> +struct TypeId { + static constexpr const TypeIndex value = TypeIndex::AggregateFunction; +}; +template <> +struct TypeId { + static constexpr const TypeIndex value = TypeIndex::Tuple; +}; +template <> +struct TypeId> { + static constexpr const TypeIndex value = TypeIndex::Decimal32; +}; +template <> +struct TypeId> { + static constexpr const TypeIndex value = TypeIndex::Decimal64; +}; +template <> +struct TypeId> { + static constexpr const TypeIndex value = TypeIndex::Decimal128; +}; template <> struct Field::TypeToEnum { - static const Types::Which value = Types::Null; + static constexpr Types::Which value = Types::Null; }; template <> struct Field::TypeToEnum { - static const Types::Which value = Types::UInt64; + static constexpr Types::Which value = Types::UInt64; }; template <> struct Field::TypeToEnum { - static const Types::Which value = Types::UInt128; + static constexpr Types::Which value = Types::UInt128; }; template <> struct Field::TypeToEnum { - static const Types::Which value = Types::Int64; + static constexpr Types::Which value = Types::Int64; }; template <> struct Field::TypeToEnum { - static const Types::Which value = Types::Int128; + static constexpr Types::Which value = Types::Int128; }; template <> struct Field::TypeToEnum { - static const Types::Which value = Types::Float64; + static constexpr Types::Which value = Types::Float64; }; template <> struct Field::TypeToEnum { - static const Types::Which value = Types::String; + static constexpr Types::Which value = Types::String; }; template <> struct Field::TypeToEnum { @@ -822,11 +865,11 @@ struct Field::TypeToEnum { }; template <> struct Field::TypeToEnum { - static const Types::Which value = Types::Array; + static constexpr Types::Which value = Types::Array; }; template <> struct Field::TypeToEnum { - static const Types::Which value = Types::Tuple; + static constexpr Types::Which value = Types::Tuple; }; template <> struct Field::TypeToEnum { @@ -834,15 +877,15 @@ struct Field::TypeToEnum { }; template <> struct Field::TypeToEnum> { - static const Types::Which value = Types::Decimal32; + static constexpr Types::Which value = Types::Decimal32; }; template <> struct Field::TypeToEnum> { - static const Types::Which value = Types::Decimal64; + static constexpr Types::Which value = Types::Decimal64; }; template <> struct Field::TypeToEnum> { - static const Types::Which value = Types::Decimal128; + static constexpr Types::Which value = Types::Decimal128; }; template <> struct Field::TypeToEnum> { @@ -850,7 +893,7 @@ struct Field::TypeToEnum> { }; template <> struct Field::TypeToEnum { - static const Types::Which value = Types::AggregateFunctionState; + static constexpr Types::Which value = Types::AggregateFunctionState; }; template <> @@ -917,6 +960,10 @@ template <> struct Field::EnumToType { using Type = DecimalField; }; +template <> +struct Field::EnumToType { + using Type = Object; +}; template T get(const Field& field) { @@ -946,6 +993,11 @@ template <> struct TypeName { static std::string get() { return "Tuple"; } }; + +template <> +struct TypeName { + static std::string get() { return "Object"; } +}; template <> struct TypeName { static std::string get() { return "Map"; } @@ -994,6 +1046,11 @@ struct NearestFieldTypeImpl { using Type = Int64; }; +template <> +struct NearestFieldTypeImpl { + using Type = Object; +}; + /// long and long long are always different types that may behave identically or not. /// This is different on Linux and Mac. template <> @@ -1090,6 +1147,11 @@ struct NearestFieldTypeImpl { using Type = Null; }; +template <> +struct NearestFieldTypeImpl { + using Type = String; +}; + template <> struct NearestFieldTypeImpl { using Type = AggregateFunctionStateData; diff --git a/be/src/vec/core/types.h b/be/src/vec/core/types.h index 09199be89bc3d2..f8f02032087f3e 100644 --- a/be/src/vec/core/types.h +++ b/be/src/vec/core/types.h @@ -248,6 +248,10 @@ template <> struct TypeId { static constexpr const TypeIndex value = TypeIndex::Float64; }; +template <> +struct TypeId { + static constexpr const TypeIndex value = TypeIndex::String; +}; /// Not a data type in database, defined just for convenience. using Strings = std::vector; diff --git a/be/src/vec/data_types/convert_field_to_type.cpp b/be/src/vec/data_types/convert_field_to_type.cpp new file mode 100644 index 00000000000000..d62ec6331c8e2b --- /dev/null +++ b/be/src/vec/data_types/convert_field_to_type.cpp @@ -0,0 +1,217 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// This file is copied from +// https://github.com/ClickHouse/ClickHouse/blob/master/src/Interpreters/convert_field_to_type.cpp +// and modified by Doris + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +// #include +namespace doris::vectorized { +/** Checking for a `Field from` of `From` type falls to a range of values of type `To`. + * `From` and `To` - numeric types. They can be floating-point types. + * `From` is one of UInt64, Int64, Float64, + * whereas `To` can also be 8, 16, 32 bit. + * + * If falls into a range, then `from` is converted to the `Field` closest to the `To` type. + * If not, return Field(Null). + */ + +/** simple types of implementation of visitor to string*/ +// TODO support more types +class FieldVisitorToStringSimple : public StaticVisitor { +public: + String operator()(const Null& x) const { return "NULL"; } + String operator()(const UInt64& x) const { return std::to_string(x); } + String operator()(const Int64& x) const { return std::to_string(x); } + String operator()(const Float64& x) const { return std::to_string(x); } + String operator()(const String& x) const { return x; } + [[noreturn]] String operator()(const UInt128& x) const { LOG(FATAL) << "not implemeted"; } + [[noreturn]] String operator()(const Array& x) const { LOG(FATAL) << "not implemeted"; } + [[noreturn]] String operator()(const Tuple& x) const { LOG(FATAL) << "not implemeted"; } + [[noreturn]] String operator()(const DecimalField& x) const { + LOG(FATAL) << "not implemeted"; + } + [[noreturn]] String operator()(const DecimalField& x) const { + LOG(FATAL) << "not implemeted"; + } + [[noreturn]] String operator()(const DecimalField& x) const { + LOG(FATAL) << "not implemeted"; + } + [[noreturn]] String operator()(const AggregateFunctionStateData& x) const { + LOG(FATAL) << "not implemeted"; + } +}; + +namespace { +template +Field convert_numeric_type_impl(const Field& from) { + To result; + if (!accurate::convertNumeric(from.get(), result)) return {}; + return result; +} +template +Status convert_numric_type(const Field& from, const IDataType& type, Field* to) { + if (from.get_type() == Field::Types::UInt64) + *to = convert_numeric_type_impl(from); + else if (from.get_type() == Field::Types::Int64) + *to = convert_numeric_type_impl(from); + else if (from.get_type() == Field::Types::Float64) + *to = convert_numeric_type_impl(from); + else if (from.get_type() == Field::Types::UInt128) + *to = convert_numeric_type_impl(from); + else if (from.get_type() == Field::Types::Int128) + *to = convert_numeric_type_impl(from); + else + return Status::InvalidArgument( + fmt::format("Type mismatch in IN or VALUES section. Expected: {}. Got: {}", + type.get_name(), from.get_type())); + return Status::OK(); +} + +Status convert_field_to_typeImpl(const Field& src, const IDataType& type, + const IDataType* from_type_hint, Field* to) { + if (from_type_hint && from_type_hint->equals(type)) { + *to = src; + return Status::OK(); + } + WhichDataType which_type(type); + // TODO add more types + if (type.is_value_represented_by_number() && src.get_type() != Field::Types::String) { + if (which_type.is_uint8()) return convert_numric_type(src, type, to); + if (which_type.is_uint16()) return convert_numric_type(src, type, to); + if (which_type.is_uint32()) return convert_numric_type(src, type, to); + if (which_type.is_uint64()) return convert_numric_type(src, type, to); + if (which_type.is_uint128()) return convert_numric_type(src, type, to); + if (which_type.is_int8()) return convert_numric_type(src, type, to); + if (which_type.is_int16()) return convert_numric_type(src, type, to); + if (which_type.is_int32()) return convert_numric_type(src, type, to); + if (which_type.is_int64()) return convert_numric_type(src, type, to); + if (which_type.is_int128()) return convert_numric_type(src, type, to); + if (which_type.is_float32()) return convert_numric_type(src, type, to); + if (which_type.is_float64()) return convert_numric_type(src, type, to); + if ((which_type.is_date() || which_type.is_date_time()) && + src.get_type() == Field::Types::UInt64) { + /// We don't need any conversion UInt64 is under type of Date and DateTime + *to = src; + return Status::OK(); + } + } else if (which_type.is_string_or_fixed_string()) { + if (src.get_type() == Field::Types::String) { + *to = src; + return Status::OK(); + } + // TODO this is a very simple translator, support more complex types + *to = apply_visitor(FieldVisitorToStringSimple(), src); + return Status::OK(); + } else if (const DataTypeArray* type_array = typeid_cast(&type)) { + if (src.get_type() == Field::Types::Array) { + const Array& src_arr = src.get(); + size_t src_arr_size = src_arr.size(); + const auto& element_type = *(type_array->get_nested_type()); + Array res(src_arr_size); + for (size_t i = 0; i < src_arr_size; ++i) { + RETURN_IF_ERROR(convert_field_to_type(src_arr[i], element_type, &res[i])); + if (res[i].is_null() && !element_type.is_nullable()) { + return Status::InvalidArgument( + fmt::format("Cannot convert NULL to {}", element_type.get_name())); + } + } + *to = Field(res); + return Status::OK(); + } + } + // else if (const DataTypeTuple* type_tuple = typeid_cast(&type)) { + // if (src.get_type() == Field::Types::Tuple) { + // const auto& src_tuple = src.get(); + // size_t src_tuple_size = src_tuple.size(); + // size_t dst_tuple_size = type_tuple->get_elements().size(); + // if (dst_tuple_size != src_tuple_size) { + // return Status::InvalidArgument("Bad size of tuple in IN or VALUES section"); + // } + // Tuple res(dst_tuple_size); + // bool have_unconvertible_element = false; + // for (size_t i = 0; i < dst_tuple_size; ++i) { + // const auto& element_type = *(type_tuple->get_elements()[i]); + // RETURN_IF_ERROR(convert_field_to_type(src_tuple[i], element_type, &res[i])); + // if (!res[i].is_null() || element_type.is_nullable()) continue; + // /* + // * Either the source element was Null, or the conversion did not + // * succeed, because the source and the requested types of the + // * element are compatible, but the value is not convertible + // * (e.g. trying to convert -1 from Int8 to UInt8). In these + // * cases, consider the whole tuple also compatible but not + // * convertible. According to the specification of this function, + // * we must return Null in this case. + // * + // * The following elements might be not even compatible, so it + // * makes sense to check them to detect user errors. Remember + // * that there is an unconvertible element, and try to process + // * the remaining ones. The convert_field_to_type for each element + // * will throw if it detects incompatibility. + // */ + // have_unconvertible_element = true; + // } + // if (have_unconvertible_element) { + // return Status::InvalidArgument(fmt::format("Cannot convert {} to {}", + // src.get_type_name(), type.get_name())); + // } + // *to = Field(res); + // return Status::OK(); + // } + // } + return Status::InvalidArgument( + fmt::format("Type mismatch in IN or VALUES section. Expected: {}. Got: {}", + type.get_name(), src.get_type())); +} +} // namespace +Status convert_field_to_type(const Field& from_value, const IDataType& to_type, Field* to, + const IDataType* from_type_hint) { + if (from_value.is_null()) { + *to = from_value; + return Status::OK(); + } + if (from_type_hint && from_type_hint->equals(to_type)) { + *to = from_value; + return Status::OK(); + } + if (const auto* nullable_type = typeid_cast(&to_type)) { + const IDataType& nested_type = *nullable_type->get_nested_type(); + /// NULL remains NULL after any conversion. + if (WhichDataType(nested_type).is_nothing()) { + *to = {}; + return Status::OK(); + } + if (from_type_hint && from_type_hint->equals(nested_type)) { + *to = from_value; + return Status::OK(); + } + return convert_field_to_typeImpl(from_value, nested_type, from_type_hint, to); + } else + return convert_field_to_typeImpl(from_value, to_type, from_type_hint, to); +} +} // namespace doris::vectorized \ No newline at end of file diff --git a/be/src/vec/data_types/convert_field_to_type.h b/be/src/vec/data_types/convert_field_to_type.h new file mode 100644 index 00000000000000..1f5567a139b114 --- /dev/null +++ b/be/src/vec/data_types/convert_field_to_type.h @@ -0,0 +1,37 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// This file is copied from +// https://github.com/ClickHouse/ClickHouse/blob/master/src/Interpreters/convert_field_to_type.h +// and modified by Doris + +#pragma once +#include +namespace doris::vectorized { + +class IDataType; +/** Used to interpret expressions in a set in IN, + * and also in the query of the form INSERT ... VALUES ... + * + * To work correctly with expressions of the form `1.0 IN (1)` or, for example, `1 IN (1, 2.0, 2.5, -1)` work the same way as `1 IN (1, 2)`. + * Checks for the compatibility of types, checks values fall in the range of valid values of the type, makes type conversion. + * If the value does not fall into the range - returns Null. + */ + +Status convert_field_to_type(const Field& from_value, const IDataType& to_type, Field* field, + const IDataType* from_type_hint = nullptr); + +} // namespace doris::vectorized diff --git a/be/src/vec/data_types/data_type.h b/be/src/vec/data_types/data_type.h index c287e7281ceb70..58fcf5a80e048c 100644 --- a/be/src/vec/data_types/data_type.h +++ b/be/src/vec/data_types/data_type.h @@ -177,6 +177,10 @@ class IDataType : private boost::noncopyable { */ virtual bool is_value_represented_by_integer() const { return false; } + virtual bool is_object() const { return false; } + + bool is_simple() const { return is_int() || is_uint() || is_float() || is_string(); } + /** Unsigned Integers, Date, DateTime. Not nullable. */ virtual bool is_value_represented_by_unsigned_integer() const { return false; } diff --git a/be/src/vec/data_types/data_type_factory.cpp b/be/src/vec/data_types/data_type_factory.cpp index a425a8534af675..65510dd9f2dcfb 100644 --- a/be/src/vec/data_types/data_type_factory.cpp +++ b/be/src/vec/data_types/data_type_factory.cpp @@ -21,6 +21,8 @@ #include "vec/data_types/data_type_factory.hpp" #include "data_type_time.h" +#include "vec/data_types/data_type_hll.h" +#include "vec/data_types/data_type_object.h" namespace doris::vectorized { @@ -135,9 +137,6 @@ DataTypePtr DataTypeFactory::create_data_type(const TypeDescriptor& col_desc, bo break; case TYPE_STRING: case TYPE_CHAR: - case TYPE_VARIANT: - // no need to be wrapped in Nullable - return std::make_shared("json", true); case TYPE_VARCHAR: case TYPE_BINARY: nested = std::make_shared(); @@ -189,6 +188,9 @@ DataTypePtr DataTypeFactory::create_data_type(const TypeDescriptor& col_desc, bo nested = std::make_shared(dataTypes, names); break; } + case TYPE_VARIANT: + // ColumnObject always none nullable + return std::make_shared("json", true); case INVALID_TYPE: default: DCHECK(false) << "invalid PrimitiveType:" << (int)col_desc.type; diff --git a/be/src/vec/data_types/data_type_object.cpp b/be/src/vec/data_types/data_type_object.cpp new file mode 100644 index 00000000000000..2558a24ecc4297 --- /dev/null +++ b/be/src/vec/data_types/data_type_object.cpp @@ -0,0 +1,127 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// This file is copied from +// https://github.com/ClickHouse/ClickHouse/blob/master/src/DataTypes/DataTypeObject.cpp +// and modified by Doris + +#include +#include +#include + +#include + +namespace doris::vectorized { + +DataTypeObject::DataTypeObject(const String& schema_format_, bool is_nullable_) + : schema_format(to_lower(schema_format_)), is_nullable(is_nullable_) {} +bool DataTypeObject::equals(const IDataType& rhs) const { + if (const auto* object = typeid_cast(&rhs)) { + return schema_format == object->schema_format && is_nullable == object->is_nullable; + } + return false; +} + +int64_t DataTypeObject::get_uncompressed_serialized_bytes(const IColumn& column) const { + const auto& column_object = assert_cast(column); + assert(column_object.is_finalized()); + + const auto& subcolumns = column_object.get_subcolumns(); + size_t size = 0; + + size += sizeof(uint32_t); + for (const auto& entry : subcolumns) { + auto type = entry->data.getLeastCommonType(); + + PColumnMeta column_meta_pb; + column_meta_pb.set_name(entry->path.get_path()); + type->to_pb_column_meta(&column_meta_pb); + std::string meta_binary; + column_meta_pb.SerializeToString(&meta_binary); + size += sizeof(uint32_t); + size += meta_binary.size(); + + size += type->get_uncompressed_serialized_bytes(entry->data.get_finalized_column()); + } + + return size; +} + +char* DataTypeObject::serialize(const IColumn& column, char* buf) const { + const auto& column_object = assert_cast(column); + assert(column_object.is_finalized()); + + const auto& subcolumns = column_object.get_subcolumns(); + + // 1. serialize num of subcolumns + *reinterpret_cast(buf) = subcolumns.size(); + buf += sizeof(uint32_t); + + // 2. serialize each subcolumn in a loop + for (const auto& entry : subcolumns) { + // 2.1 serialize subcolumn column meta pb (path and type) + auto type = entry->data.getLeastCommonType(); + + PColumnMeta column_meta_pb; + column_meta_pb.set_name(entry->path.get_path()); + type->to_pb_column_meta(&column_meta_pb); + std::string meta_binary; + column_meta_pb.SerializeToString(&meta_binary); + *reinterpret_cast(buf) = meta_binary.size(); + buf += sizeof(uint32_t); + memcpy(buf, meta_binary.data(), meta_binary.size()); + buf += meta_binary.size(); + + // 2.2 serialize subcolumn + buf = type->serialize(entry->data.get_finalized_column(), buf); + } + + return buf; +} + +const char* DataTypeObject::deserialize(const char* buf, IColumn* column) const { + auto column_object = assert_cast(column); + + // 1. deserialize num of subcolumns + uint32_t num_subcolumns = *reinterpret_cast(buf); + buf += sizeof(uint32_t); + + // 2. deserialize each subcolumn in a loop + for (uint32_t i = 0; i < num_subcolumns; i++) { + // 2.1 deserialize subcolumn column path (str size + str data) + uint32_t size = *reinterpret_cast(buf); + buf += sizeof(uint32_t); + std::string meta_binary {buf, size}; + buf += size; + PColumnMeta column_meta_pb; + column_meta_pb.ParseFromString(meta_binary); + + // 2.2 deserialize subcolumn + auto type = DataTypeFactory::instance().create_data_type(column_meta_pb); + MutableColumnPtr sub_column = type->create_column(); + buf = type->deserialize(buf, sub_column.get()); + + // add subcolumn to column_object + PathInData key {column_meta_pb.name()}; + column_object->add_sub_column(key, std::move(sub_column)); + } + + column_object->finalize(); + + return buf; +} + +} // namespace doris::vectorized diff --git a/be/src/vec/data_types/data_type_object.h b/be/src/vec/data_types/data_type_object.h new file mode 100644 index 00000000000000..96ae37b99b72af --- /dev/null +++ b/be/src/vec/data_types/data_type_object.h @@ -0,0 +1,53 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// This file is copied from +// https://github.com/ClickHouse/ClickHouse/blob/master/src/DataTypes/DataTypeObject.h +// and modified by Doris + +#pragma once +#include +#include +#include +namespace doris::vectorized { +class DataTypeObject : public IDataType { +private: + String schema_format; + bool is_nullable; + +public: + DataTypeObject(const String& schema_format_, bool is_nullable_); + const char* get_family_name() const override { return "Variant"; } + TypeIndex get_type_id() const override { return TypeIndex::VARIANT; } + MutableColumnPtr create_column() const override { return ColumnObject::create(is_nullable); } + bool is_object() const override { return true; } + bool equals(const IDataType& rhs) const override; + bool hasNullableSubcolumns() const { return is_nullable; } + bool get_is_parametric() const override { return true; } + bool can_be_inside_nullable() const override { return true; } + bool have_subtypes() const override { return true; }; + int64_t get_uncompressed_serialized_bytes(const IColumn& column) const override; + std::string to_string(const IColumn& column, size_t row_num) const override { + const auto& column_object = assert_cast(column); + return "Variant: " + column_object.get_keys_str(); + } + char* serialize(const IColumn& column, char* buf) const override; + const char* deserialize(const char* buf, IColumn* column) const override; + [[noreturn]] Field get_default() const override { + LOG(FATAL) << "Method getDefault() is not implemented for data type " << get_name(); + } +}; +} // namespace doris::vectorized diff --git a/be/src/vec/data_types/get_least_supertype.cpp b/be/src/vec/data_types/get_least_supertype.cpp index 8c8b9d7e7ba7d6..9c0f00189f69ea 100644 --- a/be/src/vec/data_types/get_least_supertype.cpp +++ b/be/src/vec/data_types/get_least_supertype.cpp @@ -50,12 +50,152 @@ String get_exception_message_prefix(const DataTypes& types) { } } // namespace -DataTypePtr get_least_supertype(const DataTypes& types) { +Status get_numeric_type(const TypeIndexSet& types, DataTypePtr* type) { + bool all_numbers = true; + + size_t max_bits_of_signed_integer = 0; + size_t max_bits_of_unsigned_integer = 0; + size_t max_mantissa_bits_of_floating = 0; + + auto maximize = [](size_t& what, size_t value) { + if (value > what) what = value; + }; + + for (const auto& type : types) { + if (type == TypeIndex::UInt8) + maximize(max_bits_of_unsigned_integer, 8); + else if (type == TypeIndex::UInt16) + maximize(max_bits_of_unsigned_integer, 16); + else if (type == TypeIndex::UInt32) + maximize(max_bits_of_unsigned_integer, 32); + else if (type == TypeIndex::UInt64) + maximize(max_bits_of_unsigned_integer, 64); + else if (type == TypeIndex::UInt128) + maximize(max_bits_of_unsigned_integer, 128); + else if (type == TypeIndex::Int8 || type == TypeIndex::Enum8) + maximize(max_bits_of_signed_integer, 8); + else if (type == TypeIndex::Int16 || type == TypeIndex::Enum16) + maximize(max_bits_of_signed_integer, 16); + else if (type == TypeIndex::Int32) + maximize(max_bits_of_signed_integer, 32); + else if (type == TypeIndex::Int64) + maximize(max_bits_of_signed_integer, 64); + else if (type == TypeIndex::Int128) + maximize(max_bits_of_signed_integer, 128); + else if (type == TypeIndex::Float32) + maximize(max_mantissa_bits_of_floating, 24); + else if (type == TypeIndex::Float64) + maximize(max_mantissa_bits_of_floating, 53); + else + all_numbers = false; + } + + if (max_bits_of_signed_integer || max_bits_of_unsigned_integer || + max_mantissa_bits_of_floating) { + if (!all_numbers) { + LOG(INFO) << " because some of them are numbers and some of them are not"; + *type = nullptr; + return Status::InvalidArgument("some of them are numbers and some of them are not"); + } + + /// If there are signed and unsigned types of same bit-width, the result must be signed number with at least one more bit. + /// Example, common of Int32, UInt32 = Int64. + + size_t min_bit_width_of_integer = + std::max(max_bits_of_signed_integer, max_bits_of_unsigned_integer); + + /// If unsigned is not covered by signed. + if (max_bits_of_signed_integer && + max_bits_of_unsigned_integer >= max_bits_of_signed_integer) + ++min_bit_width_of_integer; + + /// If the result must be floating. + if (max_mantissa_bits_of_floating) { + size_t min_mantissa_bits = + std::max(min_bit_width_of_integer, max_mantissa_bits_of_floating); + if (min_mantissa_bits <= 24) { + *type = std::make_shared(); + return Status::OK(); + } else if (min_mantissa_bits <= 53) { + *type = std::make_shared(); + return Status::OK(); + } else { + LOG(INFO) << " because some of them are integers and some are floating point " + "but there is no floating point type, that can exactly represent " + "all required integers"; + *type = nullptr; + return Status::InvalidArgument( + "there is no floating point type, that can exactly represent " + "all required integers"); + } + } + + /// If the result must be signed integer. + if (max_bits_of_signed_integer) { + if (min_bit_width_of_integer <= 8) { + *type = std::make_shared(); + return Status::OK(); + } else if (min_bit_width_of_integer <= 16) { + *type = std::make_shared(); + return Status::OK(); + } else if (min_bit_width_of_integer <= 32) { + *type = std::make_shared(); + return Status::OK(); + } else if (min_bit_width_of_integer <= 64) { + *type = std::make_shared(); + return Status::OK(); + } else { + LOG(INFO) << " because some of them are signed integers and some are unsigned " + "integers, but there is no signed integer type, that can exactly " + "represent all required unsigned integer values"; + return Status::InvalidArgument( + "there is no signed integer type, that can exactly " + "represent all required unsigned integer values"); + } + } + + /// All unsigned. + { + if (min_bit_width_of_integer <= 8) { + *type = std::make_shared(); + return Status::OK(); + } else if (min_bit_width_of_integer <= 16) { + *type = std::make_shared(); + return Status::OK(); + } else if (min_bit_width_of_integer <= 32) { + *type = std::make_shared(); + return Status::OK(); + } else if (min_bit_width_of_integer <= 64) { + *type = std::make_shared(); + return Status::OK(); + } else { + LOG(FATAL) << "Logical error: " + << "but as all data types are unsigned integers, we must have found " + "maximum unsigned integer type"; + *type = nullptr; + return Status::InvalidArgument( + "all data types are unsigned integers, we must have found " + "maximum unsigned integer type"); + } + } + } + *type = nullptr; + return Status::OK(); +} + +// TODO conflict type resolve +Status get_least_supertype(const DataTypes& types, DataTypePtr* type, bool compatible_with_string) { /// Trivial cases - if (types.empty()) return std::make_shared(); + if (types.empty()) { + *type = std::make_shared(); + return Status::OK(); + } - if (types.size() == 1) return types[0]; + if (types.size() == 1) { + *type = types[0]; + return Status::OK(); + } /// All types are equal { @@ -67,7 +207,10 @@ DataTypePtr get_least_supertype(const DataTypes& types) { } } - if (all_equal) return types[0]; + if (all_equal) { + *type = types[0]; + return Status::OK(); + } } /// Recursive rules @@ -81,7 +224,8 @@ DataTypePtr get_least_supertype(const DataTypes& types) { if (!typeid_cast(type.get())) non_nothing_types.emplace_back(type); - if (non_nothing_types.size() < types.size()) return get_least_supertype(non_nothing_types); + if (non_nothing_types.size() < types.size()) + return get_least_supertype(non_nothing_types, type, compatible_with_string); } /// For Nullable @@ -103,13 +247,19 @@ DataTypePtr get_least_supertype(const DataTypes& types) { } if (have_nullable) { - return std::make_shared(get_least_supertype(nested_types)); + DataTypePtr nested_type; + Status st = get_least_supertype(nested_types, &nested_type, compatible_with_string); + if (!st.ok()) { + return st; + } + *type = std::make_shared(nested_type); + return st; } } /// Non-recursive rules - std::unordered_set type_ids; + phmap::flat_hash_set type_ids; for (const auto& type : types) type_ids.insert(type->get_type_id()); /// For String and FixedString, or for different FixedStrings, the common type is String. @@ -120,13 +270,16 @@ DataTypePtr get_least_supertype(const DataTypes& types) { if (have_string || have_fixed_string) { bool all_strings = type_ids.size() == (have_string + have_fixed_string); - if (!all_strings) { - LOG(FATAL) + if (!all_strings && !compatible_with_string) { + LOG(INFO) << get_exception_message_prefix(types) << " because some of them are String/FixedString and some of them are not"; + return Status::InvalidArgument( + "some of them are String/FixedString and some of them are not"); } - return std::make_shared(); + *type = std::make_shared(); + return Status::OK(); } } @@ -138,28 +291,14 @@ DataTypePtr get_least_supertype(const DataTypes& types) { if (have_date || have_datetime) { bool all_date_or_datetime = type_ids.size() == (have_date + have_datetime); if (!all_date_or_datetime) { - LOG(FATAL) << get_exception_message_prefix(types) - << " because some of them are Date/DateTime and some of them are not"; + LOG(INFO) << get_exception_message_prefix(types) + << " because some of them are Date/DateTime and some of them are not"; + return Status::InvalidArgument( + "because some of them are Date/DateTime and some of them are not"); } - return std::make_shared(); - } - } - - { - UInt32 have_date_v2 = type_ids.count(TypeIndex::DateV2); - - UInt32 have_datetime_v2 = type_ids.count(TypeIndex::DateTimeV2); - - if (have_date_v2 || have_datetime_v2) { - bool all_datev2_or_datetimev2 = type_ids.size() == (have_date_v2 + have_datetime_v2); - if (!all_datev2_or_datetimev2) { - LOG(FATAL) - << get_exception_message_prefix(types) - << " because some of them are DateV2/DateTimeV2 and some of them are not"; - } - - return std::make_shared(); + *type = std::make_shared(); + return Status::OK(); } } @@ -188,8 +327,10 @@ DataTypePtr get_least_supertype(const DataTypes& types) { } if (num_supported != type_ids.size()) { - LOG(FATAL) << get_exception_message_prefix(types) - << " because some of them have no lossless convertion to Decimal"; + LOG(INFO) << get_exception_message_prefix(types) + << " because some of them have no lossless convertion to Decimal"; + return Status::InvalidArgument( + "some of them have no lossless convertion to Decimal"); } UInt32 max_scale = 0; @@ -209,136 +350,95 @@ DataTypePtr get_least_supertype(const DataTypes& types) { } if (min_precision > DataTypeDecimal::max_precision()) { - LOG(FATAL) << fmt::format("{} because the least supertype is Decimal({},{})", - get_exception_message_prefix(types), min_precision, - max_scale); + LOG(INFO) << fmt::format("{} because the least supertype is Decimal({},{})", + get_exception_message_prefix(types), min_precision, + max_scale); + return Status::InvalidArgument( + fmt::format("{} because the least supertype is Decimal({},{})", + get_exception_message_prefix(types), min_precision, max_scale)); } - if (have_decimal128 || min_precision > DataTypeDecimal::max_precision()) - return std::make_shared>( + if (have_decimal128 || min_precision > DataTypeDecimal::max_precision()) { + *type = std::make_shared>( DataTypeDecimal::max_precision(), max_scale); - if (have_decimal128i || min_precision > DataTypeDecimal::max_precision()) - return std::make_shared>( + return Status::OK(); + } + if (have_decimal128i || min_precision > DataTypeDecimal::max_precision()) { + *type = std::make_shared>( DataTypeDecimal::max_precision(), max_scale); - if (have_decimal64 || min_precision > DataTypeDecimal::max_precision()) - return std::make_shared>( + return Status::OK(); + } + if (have_decimal64 || min_precision > DataTypeDecimal::max_precision()) { + *type = std::make_shared>( DataTypeDecimal::max_precision(), max_scale); - return std::make_shared>( + return Status::OK(); + } + *type = std::make_shared>( DataTypeDecimal::max_precision(), max_scale); + return Status::OK(); } } /// For numeric types, the most complicated part. { - bool all_numbers = true; - - size_t max_bits_of_signed_integer = 0; - size_t max_bits_of_unsigned_integer = 0; - size_t max_mantissa_bits_of_floating = 0; + DataTypePtr numeric_type = nullptr; + Status st = get_numeric_type(type_ids, &numeric_type); + if (numeric_type) { + DCHECK(st.ok()); + *type = numeric_type; + return Status::OK(); + } + } - auto maximize = [](size_t& what, size_t value) { - if (value > what) what = value; - }; + /// All other data types (UUID, AggregateFunction, Enum...) are compatible only if they are the same (checked in trivial cases). + *type = nullptr; + return Status::InvalidArgument(get_exception_message_prefix(types)); +} - for (const auto& type : types) { - if (typeid_cast(type.get())) - maximize(max_bits_of_unsigned_integer, 8); - else if (typeid_cast(type.get())) - maximize(max_bits_of_unsigned_integer, 16); - else if (typeid_cast(type.get())) - maximize(max_bits_of_unsigned_integer, 32); - else if (typeid_cast(type.get())) - maximize(max_bits_of_unsigned_integer, 64); - else if (typeid_cast(type.get())) - maximize(max_bits_of_signed_integer, 8); - else if (typeid_cast(type.get())) - maximize(max_bits_of_signed_integer, 16); - else if (typeid_cast(type.get())) - maximize(max_bits_of_signed_integer, 32); - else if (typeid_cast(type.get())) - maximize(max_bits_of_signed_integer, 64); - else if (typeid_cast(type.get())) - maximize(max_mantissa_bits_of_floating, 24); - else if (typeid_cast(type.get())) - maximize(max_mantissa_bits_of_floating, 53); - else - all_numbers = false; +Status get_least_supertype(const TypeIndexSet& types, DataTypePtr* type, + bool compatible_with_string) { + TypeIndexSet types_set; + for (const auto& t : types) { + if (WhichDataType(t).is_nothing()) continue; + + if (!WhichDataType(t).is_simple()) { + LOG(INFO) << "Cannot get common type by type ids with parametric type" + << getTypeName(t); + *type = nullptr; + return Status::InvalidArgument( + "Cannot get common type by type ids with parametric type"); } - if (max_bits_of_signed_integer || max_bits_of_unsigned_integer || - max_mantissa_bits_of_floating) { - if (!all_numbers) { - LOG(FATAL) << get_exception_message_prefix(types) - << " because some of them are numbers and some of them are not"; - } - - /// If there are signed and unsigned types of same bit-width, the result must be signed number with at least one more bit. - /// Example, common of Int32, UInt32 = Int64. - - size_t min_bit_width_of_integer = - std::max(max_bits_of_signed_integer, max_bits_of_unsigned_integer); - - /// If unsigned is not covered by signed. - if (max_bits_of_signed_integer && - max_bits_of_unsigned_integer >= max_bits_of_signed_integer) - ++min_bit_width_of_integer; - - /// If the result must be floating. - if (max_mantissa_bits_of_floating) { - size_t min_mantissa_bits = - std::max(min_bit_width_of_integer, max_mantissa_bits_of_floating); - if (min_mantissa_bits <= 24) - return std::make_shared(); - else if (min_mantissa_bits <= 53) - return std::make_shared(); - else { - LOG(FATAL) << get_exception_message_prefix(types) - << " because some of them are integers and some are floating point " - "but there is no floating point type, that can exactly represent " - "all required integers"; - } - } + types_set.insert(t); + } - /// If the result must be signed integer. - if (max_bits_of_signed_integer) { - if (min_bit_width_of_integer <= 8) - return std::make_shared(); - else if (min_bit_width_of_integer <= 16) - return std::make_shared(); - else if (min_bit_width_of_integer <= 32) - return std::make_shared(); - else if (min_bit_width_of_integer <= 64) - return std::make_shared(); - else { - LOG(FATAL) << get_exception_message_prefix(types) - << " because some of them are signed integers and some are unsigned " - "integers, but there is no signed integer type, that can exactly " - "represent all required unsigned integer values"; - } - } + if (types_set.empty()) { + *type = std::make_shared(); + return Status::OK(); + } - /// All unsigned. - { - if (min_bit_width_of_integer <= 8) - return std::make_shared(); - else if (min_bit_width_of_integer <= 16) - return std::make_shared(); - else if (min_bit_width_of_integer <= 32) - return std::make_shared(); - else if (min_bit_width_of_integer <= 64) - return std::make_shared(); - else { - LOG(FATAL) << "Logical error: " << get_exception_message_prefix(types) - << "but as all data types are unsigned integers, we must have found " - "maximum unsigned integer type"; - } - } + if (types.count(TypeIndex::String)) { + if (types.size() != 1 && !compatible_with_string) { + LOG(INFO) << " because some of them are String and some of them are not"; + *type = nullptr; + return Status::InvalidArgument("some of them are String and some of them are not"); } + + *type = std::make_shared(); + return Status::OK(); } + /// For numeric types, the most complicated part. + DataTypePtr numeric_type = nullptr; + Status st = get_numeric_type(types, &numeric_type); + if (numeric_type) { + DCHECK(st.ok()); + *type = numeric_type; + return Status::OK(); + } /// All other data types (UUID, AggregateFunction, Enum...) are compatible only if they are the same (checked in trivial cases). - LOG(FATAL) << get_exception_message_prefix(types); - return nullptr; + *type = nullptr; + return Status::InvalidArgument("unknown type"); } } // namespace doris::vectorized diff --git a/be/src/vec/data_types/get_least_supertype.h b/be/src/vec/data_types/get_least_supertype.h index 64f6e7619a5711..e0ab9438034205 100644 --- a/be/src/vec/data_types/get_least_supertype.h +++ b/be/src/vec/data_types/get_least_supertype.h @@ -20,8 +20,11 @@ #pragma once +#include #include +#include "common/status.h" + namespace doris::vectorized { /** Get data type that covers all possible values of passed data types. @@ -30,6 +33,13 @@ namespace doris::vectorized { * Examples: least common supertype for UInt8, Int8 - Int16. * Examples: there is no least common supertype for Array(UInt8), Int8. */ -DataTypePtr get_least_supertype(const DataTypes& types); + +using TypeIndexSet = phmap::flat_hash_set; + +Status get_least_supertype(const DataTypes& types, DataTypePtr* type, + bool compatible_with_string = false); + +Status get_least_supertype(const TypeIndexSet& types, DataTypePtr* type, + bool compatible_with_string = false); } // namespace doris::vectorized diff --git a/be/src/vec/functions/function_cast.h b/be/src/vec/functions/function_cast.h index b87e0142c6f504..6eb7c6a03b3ecc 100644 --- a/be/src/vec/functions/function_cast.h +++ b/be/src/vec/functions/function_cast.h @@ -1765,9 +1765,14 @@ class FunctionBuilderCast : public FunctionBuilderImpl { DataTypePtr get_return_type_impl(const ColumnsWithTypeAndName& arguments) const override { const auto type_col = check_and_get_column_const(arguments.back().column.get()); + DataTypePtr type; if (!type_col) { - LOG(FATAL) << fmt::format( - "Second argument to {} must be a constant string describing type", get_name()); + // only used in object_util::cast_column + // use second arg as type arg + // since not all types are in the DatatypeFactory + type = arguments[1].type; + } else { + type = DataTypeFactory::instance().get(type_col->get_value()); } // TODO(xy): support return struct type for factory auto type = DataTypeFactory::instance().get(type_col->get_value()); diff --git a/be/src/vec/functions/if.cpp b/be/src/vec/functions/if.cpp index 031ec30118b5c3..a8eec9233eac8d 100644 --- a/be/src/vec/functions/if.cpp +++ b/be/src/vec/functions/if.cpp @@ -122,7 +122,10 @@ class FunctionIf : public IFunction { } DataTypePtr get_return_type_impl(const DataTypes& arguments) const override { - return get_least_supertype({arguments[1], arguments[2]}); + DataTypePtr type = nullptr; + get_least_supertype(DataTypes {arguments[1], arguments[2]}, &type); + DCHECK_NE(type, nullptr); + return type; } static ColumnPtr materialize_column_if_const(const ColumnPtr& column) { diff --git a/be/src/vec/io/var_int.h b/be/src/vec/io/var_int.h index e932c506b7177f..af979194e8c0c2 100644 --- a/be/src/vec/io/var_int.h +++ b/be/src/vec/io/var_int.h @@ -19,6 +19,7 @@ #include +#include "vec/common/string_buffer.hpp" #include "vec/core/types.h" namespace doris::vectorized { From f2ee7cc8e218e561e4cdf3053854ffef30d7c230 Mon Sep 17 00:00:00 2001 From: eldenmoon <15605149486@163.com> Date: Mon, 5 Sep 2022 17:26:34 +0800 Subject: [PATCH 03/30] [feature-dynamic-table](column-object) support parse json documents to ColumnObject --- be/src/common/config.h | 2 + be/src/vec/CMakeLists.txt | 1 + be/src/vec/common/string_ref.h | 2 + be/src/vec/json/json_parser.cpp | 256 +++++++++++++++++++++++++++++ be/src/vec/json/json_parser.h | 99 +++++++++++ be/src/vec/json/parse2column.cpp | 246 +++++++++++++++++++++++++++ be/src/vec/json/parse2column.h | 23 +++ be/src/vec/json/path_in_data.cpp | 126 ++++++++++++++ be/src/vec/json/path_in_data.h | 106 ++++++++++++ be/src/vec/json/simd_json_parser.h | 177 ++++++++++++++++++++ 10 files changed, 1038 insertions(+) create mode 100644 be/src/vec/json/json_parser.cpp create mode 100644 be/src/vec/json/json_parser.h create mode 100644 be/src/vec/json/parse2column.cpp create mode 100644 be/src/vec/json/parse2column.h create mode 100644 be/src/vec/json/path_in_data.cpp create mode 100644 be/src/vec/json/path_in_data.h create mode 100644 be/src/vec/json/simd_json_parser.h diff --git a/be/src/common/config.h b/be/src/common/config.h index 0eb8a600a948fb..7dd3345a7016f5 100644 --- a/be/src/common/config.h +++ b/be/src/common/config.h @@ -903,6 +903,8 @@ CONF_String(inverted_index_dict_path, "${DORIS_HOME}/dict"); CONF_Int32(max_depth_in_bkd_tree, "32"); // use num_broadcast_buffer blocks as buffer to do broadcast CONF_Int32(num_broadcast_buffer, "32"); +// semi-structure configs +CONF_Bool(enable_parse_multi_dimession_array, "true"); #ifdef BE_TEST // test s3 CONF_String(test_s3_resource, "resource"); diff --git a/be/src/vec/CMakeLists.txt b/be/src/vec/CMakeLists.txt index 226ad840fa4f83..9646f8c89126d2 100644 --- a/be/src/vec/CMakeLists.txt +++ b/be/src/vec/CMakeLists.txt @@ -58,6 +58,7 @@ set(VEC_FILES columns/column_map.cpp columns/columns_common.cpp columns/column_object.cpp + json/json_parser.cpp json/parse2column.cpp json/path_in_data.cpp common/object_util.cpp diff --git a/be/src/vec/common/string_ref.h b/be/src/vec/common/string_ref.h index 1e98addf9ee27b..9447ccf26fd9c6 100644 --- a/be/src/vec/common/string_ref.h +++ b/be/src/vec/common/string_ref.h @@ -242,6 +242,8 @@ struct StringRef { // Trims leading and trailing spaces. StringRef trim() const; + bool empty() const { return size == 0; } + // support for type_limit static constexpr char MIN_CHAR = 0; static constexpr char MAX_CHAR = char( diff --git a/be/src/vec/json/json_parser.cpp b/be/src/vec/json/json_parser.cpp new file mode 100644 index 00000000000000..2a5f0a6220a011 --- /dev/null +++ b/be/src/vec/json/json_parser.cpp @@ -0,0 +1,256 @@ +#include "vec/json/json_parser.h" +#include "vec/json/simd_json_parser.h" + +namespace doris::vectorized { + +template +bool JSONDataParser::extract_key( + MutableColumns& columns, StringRef json, + const std::vector& keys, const std::vector& types) { + assert(types.size() == keys.size()); + assert(columns.size() >= keys.size()); + Element document; + if (!parser.parse(json.to_string_view(), document) || !document.isObject()) { + return false; + } + const auto& obj = document.getObject(); + for (size_t x = 0; x < types.size(); ++x) { + Element element; + PathInData key_path(keys[x].to_string_view()); + if (!obj.find(key_path, element) || element.isNull()) { + columns[x]->insert_default(); + continue; + } + switch (types[x]) { + case ExtractType::ToString: { + if (element.isString()) { + auto str = element.getString(); + columns[x]->insert_data(str.data(), str.size()); + break; + } + auto str = castValueAsString(element); + columns[x]->insert_data(str.data(), str.size()); + break; + } + default: + break; + } + } + return true; +} + +template +std::optional JSONDataParser::parse(const char * begin, size_t length) +{ + std::string_view json{begin, length}; + Element document; + if (!parser.parse(json, document)) + return {}; + ParseContext context; + traverse(document, context); + ParseResult result; + result.values = std::move(context.values); + result.paths.reserve(context.paths.size()); + for (auto && path : context.paths) + result.paths.emplace_back(std::move(path)); + return result; +} + +template +void JSONDataParser::traverse(const Element & element, ParseContext & ctx) +{ + // checkStackSize(); + if (element.isObject()) + { + traverseObject(element.getObject(), ctx); + } + else if (element.isArray()) + { + traverseArray(element.getArray(), ctx); + } + else + { + ctx.paths.push_back(ctx.builder.get_parts()); + ctx.values.push_back(getValueAsField(element)); + } +} +template +void JSONDataParser::traverseObject(const JSONObject & object, ParseContext & ctx) +{ + ctx.paths.reserve(ctx.paths.size() + object.size()); + ctx.values.reserve(ctx.values.size() + object.size()); + for (auto it = object.begin(); it != object.end(); ++it) + { + const auto & [key, value] = *it; + ctx.builder.append(key, false); + traverse(value, ctx); + ctx.builder.pop_back(); + } +} +template +void JSONDataParser::traverseArray(const JSONArray & array, ParseContext & ctx) +{ + /// Traverse elements of array and collect an array of fields by each path. + ParseArrayContext array_ctx; + array_ctx.total_size = array.size(); + for (auto it = array.begin(); it != array.end(); ++it) + { + traverseArrayElement(*it, array_ctx); + ++array_ctx.current_size; + } + auto && arrays_by_path = array_ctx.arrays_by_path; + if (arrays_by_path.empty()) + { + ctx.paths.push_back(ctx.builder.get_parts()); + ctx.values.push_back(Array()); + } + else + { + ctx.paths.reserve(ctx.paths.size() + arrays_by_path.size()); + ctx.values.reserve(ctx.values.size() + arrays_by_path.size()); + for (auto it = arrays_by_path.begin(); it != arrays_by_path.end(); ++it) + { + auto && [path, path_array] = it->second; + /// Merge prefix path and path of array element. + ctx.paths.push_back(ctx.builder.append(path, true).get_parts()); + ctx.values.push_back(std::move(path_array)); + ctx.builder.pop_back(path.size()); + } + } +} +template +void JSONDataParser::traverseArrayElement(const Element & element, ParseArrayContext & ctx) +{ + ParseContext element_ctx; + traverse(element, element_ctx); + auto & [_, paths, values] = element_ctx; + size_t size = paths.size(); + size_t keys_to_update = ctx.arrays_by_path.size(); + for (size_t i = 0; i < size; ++i) + { + if (values[i].is_null()) + continue; + UInt128 hash = PathInData::get_parts_hash(paths[i]); + auto found = ctx.arrays_by_path.find(hash); + if (found != ctx.arrays_by_path.end()) + { + auto & path_array = found->second.second; + assert(path_array.size() == ctx.current_size); + /// If current element of array is part of Nested, + /// collect its size or check it if the size of + /// the Nested has been already collected. + auto nested_key = getNameOfNested(paths[i], values[i]); + if (!nested_key.empty()) + { + size_t array_size = get(values[i]).size(); + auto & current_nested_sizes = ctx.nested_sizes_by_key[nested_key]; + if (current_nested_sizes.size() == ctx.current_size) + current_nested_sizes.push_back(array_size); + else if (array_size != current_nested_sizes.back()) { + LOG(FATAL) << fmt::format( + "Array sizes mismatched ({} and {})", array_size, current_nested_sizes.back()); + } + } + path_array.push_back(std::move(values[i])); + --keys_to_update; + } + else + { + /// We found a new key. Add and empty array with current size. + Array path_array; + path_array.reserve(ctx.total_size); + path_array.resize(ctx.current_size); + auto nested_key = getNameOfNested(paths[i], values[i]); + if (!nested_key.empty()) + { + size_t array_size = get(values[i]).size(); + auto & current_nested_sizes = ctx.nested_sizes_by_key[nested_key]; + if (current_nested_sizes.empty()) + { + current_nested_sizes.resize(ctx.current_size); + } + else + { + /// If newly added element is part of the Nested then + /// resize its elements to keep correct sizes of Nested arrays. + for (size_t j = 0; j < ctx.current_size; ++j) + path_array[j] = Array(current_nested_sizes[j]); + } + if (current_nested_sizes.size() == ctx.current_size) + current_nested_sizes.push_back(array_size); + else if (array_size != current_nested_sizes.back()) + LOG(FATAL) << fmt::format( + "Array sizes mismatched ({} and {})", array_size, current_nested_sizes.back()); + } + path_array.push_back(std::move(values[i])); + auto & elem = ctx.arrays_by_path[hash]; + elem.first = std::move(paths[i]); + elem.second = std::move(path_array); + } + } + /// If some of the keys are missed in current element, + /// add default values for them. + if (keys_to_update) + fillMissedValuesInArrays(ctx); +} + +template +void JSONDataParser::fillMissedValuesInArrays(ParseArrayContext & ctx) +{ + for (auto it = ctx.arrays_by_path.begin(); it != ctx.arrays_by_path.end(); ++it) + { + auto & [path, path_array] = it->second; + assert(path_array.size() == ctx.current_size || path_array.size() == ctx.current_size + 1); + if (path_array.size() == ctx.current_size) + { + bool inserted = tryInsertDefaultFromNested(ctx, path, path_array); + if (!inserted) + path_array.emplace_back(); + } + } +} + +template +bool JSONDataParser::tryInsertDefaultFromNested( + ParseArrayContext & ctx, const PathInData::Parts & path, Array & array) +{ + /// If there is a collected size of current Nested + /// then insert array of this size as a default value. + if (path.empty() || array.empty()) + return false; + /// Last element is not Null, because otherwise this path wouldn't exist. + auto nested_key = getNameOfNested(path, array.back()); + if (nested_key.empty()) + return false; + auto mapped = ctx.nested_sizes_by_key.find(nested_key); + if (mapped == ctx.nested_sizes_by_key.end()) + return false; + auto & current_nested_sizes = mapped->second; + assert(current_nested_sizes.size() == ctx.current_size || current_nested_sizes.size() == ctx.current_size + 1); + /// If all keys of Nested were missed then add a zero length. + if (current_nested_sizes.size() == ctx.current_size) + current_nested_sizes.push_back(0); + size_t array_size = current_nested_sizes.back(); + array.push_back(Array(array_size)); + return true; +} + +template +StringRef JSONDataParser::getNameOfNested(const PathInData::Parts & path, const Field & value) +{ + if (value.get_type() != Field::Types::Array || path.empty()) + return {}; + /// Find first key that is marked as nested, + /// because we may have tuple of Nested and there could be + /// several arrays with the same prefix, but with independent sizes. + /// Consider we have array element with type `k2 Tuple(k3 Nested(...), k5 Nested(...))` + /// Then subcolumns `k2.k3` and `k2.k5` may have indepented sizes and we should extract + /// `k3` and `k5` keys instead of `k2`. + for (const auto & part : path) + if (part.is_nested) + return StringRef(part.key.data(), part.key.size()); + return {}; +} + +template class JSONDataParser; +} \ No newline at end of file diff --git a/be/src/vec/json/json_parser.h b/be/src/vec/json/json_parser.h new file mode 100644 index 00000000000000..000b0583ab2ffc --- /dev/null +++ b/be/src/vec/json/json_parser.h @@ -0,0 +1,99 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// This file is copied from +// https://github.com/ClickHouse/ClickHouse/blob/master/src/Common/JSONParsers/SimdJSONParser.h +// and modified by Doris + +#pragma once + +#include +#include +#include +#include + +namespace doris::vectorized { + +template +static Field getValueAsField(const Element& element) { + // bool will convert to type FiledType::UInt64 + if (element.isBool()) return element.getBool(); + if (element.isInt64()) return element.getInt64(); + // doris only support signed integers at present + if (element.isUInt64()) return element.getInt64(); + if (element.isDouble()) return element.getDouble(); + if (element.isString()) return element.getString(); + if (element.isNull()) return Field(); + return Field(); +} + +template +static std::string castValueAsString(const Element& element) { + if (element.isBool()) return element.getBool() ? "1" : "0"; + if (element.isInt64()) return std::to_string(element.getInt64()); + if (element.isUInt64()) return std::to_string(element.getUInt64()); + if (element.isDouble()) return std::to_string(element.getDouble()); + if (element.isNull()) return ""; + return ""; +} + +enum class ExtractType { + ToString = 0, + // ... +}; +template +class JSONDataParser { +public: + std::optional parse(const char* begin, size_t length); + + // extract keys's element into columns + bool extract_key(MutableColumns& columns, StringRef json, + const std::vector& keys, const std::vector& types); + +private: + using Element = typename ParserImpl::Element; + using JSONObject = typename ParserImpl::Object; + using JSONArray = typename ParserImpl::Array; + struct ParseContext + { + PathInDataBuilder builder; + std::vector paths; + std::vector values; + }; + using PathPartsWithArray = std::pair; + using PathToArray = phmap::flat_hash_map; + using KeyToSizes = phmap::flat_hash_map, StringRefHash>; + struct ParseArrayContext + { + size_t current_size = 0; + size_t total_size = 0; + PathToArray arrays_by_path; + KeyToSizes nested_sizes_by_key; + // Arena strings_pool; + }; + void traverse(const Element & element, ParseContext & ctx); + void traverseObject(const JSONObject & object, ParseContext & ctx); + void traverseArray(const JSONArray & array, ParseContext & ctx); + void traverseArrayElement(const Element & element, ParseArrayContext & ctx); + static void fillMissedValuesInArrays(ParseArrayContext & ctx); + static bool tryInsertDefaultFromNested( + ParseArrayContext & ctx, const PathInData::Parts & path, Array & array); + static StringRef getNameOfNested(const PathInData::Parts & path, const Field & value); + + ParserImpl parser; +}; + +} // namespace doris::vectorized diff --git a/be/src/vec/json/parse2column.cpp b/be/src/vec/json/parse2column.cpp new file mode 100644 index 00000000000000..797b05f30e0312 --- /dev/null +++ b/be/src/vec/json/parse2column.cpp @@ -0,0 +1,246 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace doris::vectorized { + +/** Pool for objects that cannot be used from different threads simultaneously. + * Allows to create an object for each thread. + * Pool has unbounded size and objects are not destroyed before destruction of pool. + * + * Use it in cases when thread local storage is not appropriate + * (when maximum number of simultaneously used objects is less + * than number of running/sleeping threads, that has ever used object, + * and creation/destruction of objects is expensive). + */ +template +class SimpleObjectPool +{ +protected: + /// Hold all available objects in stack. + std::mutex mutex; + std::stack> stack; + /// Specialized deleter for std::unique_ptr. + /// Returns underlying pointer back to stack thus reclaiming its ownership. + struct Deleter + { + SimpleObjectPool * parent; + Deleter(SimpleObjectPool * parent_ = nullptr) : parent{parent_} {} /// NOLINT + void operator()(T * owning_ptr) const + { + std::lock_guard lock{parent->mutex}; + parent->stack.emplace(owning_ptr); + } + }; +public: + using Pointer = std::unique_ptr; + /// Extracts and returns a pointer from the stack if it's not empty, + /// creates a new one by calling provided f() otherwise. + template + Pointer get(Factory && f) + { + std::unique_lock lock(mutex); + if (stack.empty()) + { + lock.unlock(); + return { f(), this }; + } + auto object = stack.top().release(); + stack.pop(); + return std::unique_ptr(object, Deleter(this)); + } + /// Like get(), but creates object using default constructor. + Pointer getDefault() + { + return get([] { return new T; }); + } +}; + +SimpleObjectPool> parsers_pool; + +using Node = typename ColumnObject::Subcolumns::Node; +/// Visitor that keeps @num_dimensions_to_keep dimensions in arrays +/// and replaces all scalars or nested arrays to @replacement at that level. +class FieldVisitorReplaceScalars : public StaticVisitor { +public: + FieldVisitorReplaceScalars(const Field& replacement_, size_t num_dimensions_to_keep_) + : replacement(replacement_), num_dimensions_to_keep(num_dimensions_to_keep_) {} + template + Field operator()(const T& x) const { + if constexpr (std::is_same_v) { + if (num_dimensions_to_keep == 0) return replacement; + const size_t size = x.size(); + Array res(size); + for (size_t i = 0; i < size; ++i) { + res[i] = apply_visitor( + FieldVisitorReplaceScalars(replacement, num_dimensions_to_keep - 1), x[i]); + } + return res; + } else { + return replacement; + } + } + +private: + const Field& replacement; + size_t num_dimensions_to_keep; +}; + +/// Finds a subcolumn from the same Nested type as @entry and inserts +/// an array with default values with consistent sizes as in Nested type. +bool try_insert_default_from_nested(const std::shared_ptr& entry, + const ColumnObject::Subcolumns& subcolumns) { + if (!entry->path.has_nested_part()) return false; + + const Node* current_node = subcolumns.find_leaf(entry->path); + const Node* leaf = nullptr; + size_t num_skipped_nested = 0; + + while (current_node) { + /// Try to find the first Nested up to the current node. + const auto* node_nested = subcolumns.find_parent( + current_node, [](const auto& candidate) { return candidate.is_nested(); }); + + if (!node_nested) break; + + /// If there are no leaves, skip current node and find + /// the next node up to the current. + leaf = subcolumns.find_leaf(node_nested, [&](const auto& candidate) { + return candidate.data.size() == entry->data.size() + 1; + }); + + if (leaf) break; + + current_node = node_nested->parent; + ++num_skipped_nested; + } + + if (!leaf) return false; + + auto last_field = leaf->data.getLastField(); + if (last_field.is_null()) return false; + + const auto& least_common_type = entry->data.getLeastCommonType(); + size_t num_dimensions = object_util::get_number_of_dimensions(*least_common_type); + assert(num_skipped_nested < num_dimensions); + + /// Replace scalars to default values with consistent array sizes. + size_t num_dimensions_to_keep = num_dimensions - num_skipped_nested; + auto default_scalar = + num_skipped_nested + ? object_util::create_empty_array_field(num_skipped_nested) + : object_util::get_base_type_of_array(least_common_type)->get_default(); + + auto default_field = apply_visitor( + FieldVisitorReplaceScalars(default_scalar, num_dimensions_to_keep), last_field); + entry->data.insert(std::move(default_field)); + + return true; +} + +template +Status parse_json_to_variant(IColumn& column, const char* src, size_t length, + JSONDataParser* parser) { + auto& column_object = assert_cast(column); + std::optional result; + /// Treat empty string as an empty object + /// for better CAST from String to Object. + if (length > 0) { + result = parser->parse(src, length); + } else { + result = ParseResult {}; + } + if (!result) { + LOG(INFO) << "failed to parse" << std::string_view(src, length) + << ", length= " << length; + return Status::InvalidArgument(fmt::format("Cannot parse object {}", std::string_view(src, length))); + } + auto& [paths, values] = *result; + assert(paths.size() == values.size()); + phmap::flat_hash_set paths_set; + size_t num_rows = column_object.size(); + for (size_t i = 0; i < paths.size(); ++i) { + FieldInfo field_info; + RETURN_IF_ERROR(get_field_info(values[i], &field_info)); + // TODO support multi dimensions array + if (!config::enable_parse_multi_dimession_array && field_info.num_dimensions >= 2) { + return Status::InvalidArgument( + "Sorry multi dimensions array is not supported now, we are working on it"); + } + if (is_nothing(field_info.scalar_type)) continue; + if (!paths_set.insert(paths[i].get_path()).second) { + return Status::InvalidArgument("Object has ambiguous path"); + } + + if (!column_object.has_subcolumn(paths[i])) { + if (paths[i].has_nested_part()) { + column_object.add_nested_subcolumn(paths[i], field_info, num_rows); + } else { + column_object.add_sub_column(paths[i], num_rows); + } + } + auto& subcolumn = column_object.get_subcolumn(paths[i]); + assert(subcolumn.size() == num_rows); + RETURN_IF_ERROR(subcolumn.insert(std::move(values[i]), std::move(field_info))); + } + // /// Insert default values to missed subcolumns. + const auto& subcolumns = column_object.get_subcolumns(); + for (const auto& entry : subcolumns) { + if (!paths_set.contains(entry->path.get_path())) { + bool inserted = try_insert_default_from_nested(entry, subcolumns); + if (!inserted) entry->data.insertDefault(); + } + } + column_object.incr_num_rows(); + return Status::OK(); +} + +bool extract_key(MutableColumns& columns, StringRef json, + const std::vector& keys, const std::vector& types, + JSONDataParser* parser) { + return parser->extract_key(columns, json, keys, types); +} + +// exposed interfaces +Status parse_json_to_variant(IColumn& column, const StringRef& json, JSONDataParser* parser) { + return parse_json_to_variant(column, json.data, json.size, parser); +} + +Status parse_json_to_variant(IColumn& column, const std::vector& jsons) { + auto parser = parsers_pool.get([] { return new JSONDataParser(); }); + for (StringRef str: jsons) { + RETURN_IF_ERROR(parse_json_to_variant(column, str.data, str.size, parser.get())); + } + return Status::OK(); +} + +bool extract_key(MutableColumns& columns, const std::vector& jsons, + const std::vector& keys, const std::vector& types) { + auto parser = parsers_pool.get([] { return new JSONDataParser(); }); + for (StringRef json : jsons) { + if (!extract_key(columns, json, keys, types, parser.get())) { + return false; + } + } + return true; +} + +bool extract_key(MutableColumns& columns, const ColumnString& json_column, + const std::vector& keys, const std::vector& types) { + auto parser = parsers_pool.get([] { return new JSONDataParser(); }); + for (size_t x = 0; x < json_column.size(); ++x) { + if (!extract_key(columns, json_column.get_data_at(x), keys, types, parser.get())) { + return false; + } + } + return true; +} + +} // namespace doris::vectorized diff --git a/be/src/vec/json/parse2column.h b/be/src/vec/json/parse2column.h new file mode 100644 index 00000000000000..5c8d8d0bce4228 --- /dev/null +++ b/be/src/vec/json/parse2column.h @@ -0,0 +1,23 @@ +#pragma once + +#include +#include +#include +#include + +namespace doris::vectorized { + +// parse a batch of json strings into column object +Status parse_json_to_variant(IColumn& column, const std::vector& jsons); + +// parse a single json +Status parse_json_to_variant(IColumn& column, const StringRef& jsons, JSONDataParser* parser); + +// extract keys columns from json strings into columns +bool extract_key(MutableColumns& columns, const std::vector& jsons, + const std::vector& keys, const std::vector& types); + +// extract keys columns from colunnstring(json format) into columns +bool extract_key(MutableColumns& columns, const ColumnString& json_column, + const std::vector& keys, const std::vector& types); +} diff --git a/be/src/vec/json/path_in_data.cpp b/be/src/vec/json/path_in_data.cpp new file mode 100644 index 00000000000000..e6542fe9e048cc --- /dev/null +++ b/be/src/vec/json/path_in_data.cpp @@ -0,0 +1,126 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// This file is copied from +// https://github.com/ClickHouse/ClickHouse/blob/master/src/DataTypes/Serializations/PathInData.cpp +// and modified by Doris + +#include +#include +#include + +#include +namespace doris::vectorized { +PathInData::PathInData(std::string_view path_) : path(path_) { + const char* begin = path.data(); + const char* end = path.data() + path.size(); + for (const char* it = path.data(); it != end; ++it) { + if (*it == '.') { + size_t size = static_cast(it - begin); + parts.emplace_back(std::string_view {begin, size}, false, 0); + begin = it + 1; + } + } + size_t size = static_cast(end - begin); + parts.emplace_back(std::string_view {begin, size}, false, 0.); +} +PathInData::PathInData(const Parts& parts_) { + build_path(parts_); + build_parts(parts_); +} +PathInData::PathInData(const PathInData& other) : path(other.path) { + build_parts(other.get_parts()); +} +PathInData& PathInData::operator=(const PathInData& other) { + if (this != &other) { + path = other.path; + build_parts(other.parts); + } + return *this; +} +UInt128 PathInData::get_parts_hash(const Parts& parts_) { + SipHash hash; + hash.update(parts_.size()); + for (const auto& part : parts_) { + hash.update(part.key.data(), part.key.length()); + hash.update(part.is_nested); + hash.update(part.anonymous_array_level); + } + UInt128 res; + hash.get128(res); + return res; +} + +void PathInData::build_path(const Parts& other_parts) { + if (other_parts.empty()) return; + path.clear(); + auto it = other_parts.begin(); + path += it->key; + ++it; + for (; it != other_parts.end(); ++it) { + path += "."; + path += it->key; + } +} +void PathInData::build_parts(const Parts& other_parts) { + if (other_parts.empty()) return; + parts.clear(); + parts.reserve(other_parts.size()); + const char* begin = path.data(); + for (const auto& part : other_parts) { + has_nested |= part.is_nested; + parts.emplace_back(std::string_view {begin, part.key.length()}, part.is_nested, + part.anonymous_array_level); + begin += part.key.length() + 1; + } +} +size_t PathInData::Hash::operator()(const PathInData& value) const { + auto hash = get_parts_hash(value.parts); + return hash.low ^ hash.high; +} +PathInDataBuilder& PathInDataBuilder::append(std::string_view key, bool is_array) { + if (parts.empty()) current_anonymous_array_level += is_array; + if (!key.empty()) { + if (!parts.empty()) { + parts.back().is_nested = is_array; + } + parts.emplace_back(key, false, current_anonymous_array_level); + current_anonymous_array_level = 0; + } + return *this; +} +PathInDataBuilder& PathInDataBuilder::append(const PathInData::Parts& path, bool is_array) { + if (parts.empty()) current_anonymous_array_level += is_array; + if (!path.empty()) { + if (!parts.empty()) { + parts.back().is_nested = is_array; + } + auto it = parts.insert(parts.end(), path.begin(), path.end()); + for (; it != parts.end(); ++it) { + it->anonymous_array_level += current_anonymous_array_level; + } + current_anonymous_array_level = 0; + } + return *this; +} +void PathInDataBuilder::pop_back() { + parts.pop_back(); +} +void PathInDataBuilder::pop_back(size_t n) { + assert(n <= parts.size()); + parts.resize(parts.size() - n); +} +} // namespace doris::vectorized diff --git a/be/src/vec/json/path_in_data.h b/be/src/vec/json/path_in_data.h new file mode 100644 index 00000000000000..299bb8500c3ebf --- /dev/null +++ b/be/src/vec/json/path_in_data.h @@ -0,0 +1,106 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// This file is copied from +// https://github.com/ClickHouse/ClickHouse/blob/master/src/DataTypes/Serializations/PathInData.h +// and modified by Doris + +#pragma once + +#include +#include +#include "vec/core/field.h" +#include "vec/core/types.h" +namespace doris::vectorized { +class ReadBuffer; +class WriteBuffer; +/// Class that represents path in document, e.g. JSON. +class PathInData { +public: + struct Part { + Part() = default; + Part(std::string_view key_, bool is_nested_, vectorized::UInt8 anonymous_array_level_) + : key(key_), is_nested(is_nested_), anonymous_array_level(anonymous_array_level_) {} + bool operator==(const Part& other) const { + return this->key == other.key && this->is_nested == other.is_nested && + this->anonymous_array_level == other.anonymous_array_level; + } + /// Name of part of path. + std::string_view key; + /// If this part is Nested, i.e. element + /// related to this key is the array of objects. + bool is_nested = false; + /// Number of array levels between current key and previous key. + /// E.g. in JSON {"k1": [[[{"k2": 1, "k3": 2}]]]} + /// "k1" is nested and has anonymous_array_level = 0. + /// "k2" and "k3" are not nested and have anonymous_array_level = 2. + UInt8 anonymous_array_level = 0; + }; + using Parts = std::vector; + PathInData() = default; + explicit PathInData(std::string_view path_); + explicit PathInData(const Parts& parts_); + PathInData(const PathInData& other); + PathInData& operator=(const PathInData& other); + static UInt128 get_parts_hash(const Parts& parts_); + bool empty() const { return parts.empty(); } + const vectorized::String& get_path() const { return path; } + const Parts& get_parts() const { return parts; } + bool is_nested(size_t i) const { return parts[i].is_nested; } + bool has_nested_part() const { return has_nested; } + bool operator==(const PathInData& other) const { return parts == other.parts; } + struct Hash { + size_t operator()(const PathInData& value) const; + }; + +private: + /// Creates full path from parts. + void build_path(const Parts& other_parts); + /// Creates new parts full from full path with correct string pointers. + void build_parts(const Parts& other_parts); + /// The full path. Parts are separated by dots. + vectorized::String path; + /// Parts of the path. All string_view-s in parts must point to the @path. + Parts parts; + /// True if at least one part is nested. + /// Cached to avoid linear complexity at 'has_nested'. + bool has_nested = false; +}; +class PathInDataBuilder { +public: + const PathInData::Parts& get_parts() const { return parts; } + PathInDataBuilder& append(std::string_view key, bool is_array); + PathInDataBuilder& append(const PathInData::Parts& path, bool is_array); + void pop_back(); + void pop_back(size_t n); + +private: + PathInData::Parts parts; + /// Number of array levels without key to which + /// next non-empty key will be nested. + /// Example: for JSON { "k1": [[{"k2": 1, "k3": 2}] } + // `k2` and `k3` has anonymous_array_level = 1 in that case. + size_t current_anonymous_array_level = 0; +}; +using PathsInData = std::vector; +/// Result of parsing of a document. +/// Contains all paths extracted from document +/// and values which are related to them. +struct ParseResult { + std::vector paths; + std::vector values; +}; +} // namespace doris::vectorized diff --git a/be/src/vec/json/simd_json_parser.h b/be/src/vec/json/simd_json_parser.h new file mode 100644 index 00000000000000..dbc67f9baa8655 --- /dev/null +++ b/be/src/vec/json/simd_json_parser.h @@ -0,0 +1,177 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// This file is copied from +// https://github.com/ClickHouse/ClickHouse/blob/master/src/Common/JSONParsers/SimdJSONParser.h +// and modified by Doris + +#pragma once + +#include +#include +#include +#include + +namespace doris::vectorized { + +/// This class can be used as an argument for the template class FunctionJSON. +/// It provides ability to parse JSONs using simdjson library. +struct SimdJSONParser +{ + class Array; + class Object; + /// References an element in a JSON document, representing a JSON null, boolean, string, number, + /// array or object. + class Element + { + public: + ALWAYS_INLINE Element() {} /// NOLINT + ALWAYS_INLINE Element(const simdjson::dom::element & element_) : element(element_) {} /// NOLINT + ALWAYS_INLINE bool isInt64() const { return element.type() == simdjson::dom::element_type::INT64; } + ALWAYS_INLINE bool isUInt64() const { return element.type() == simdjson::dom::element_type::UINT64; } + ALWAYS_INLINE bool isDouble() const { return element.type() == simdjson::dom::element_type::DOUBLE; } + ALWAYS_INLINE bool isString() const { return element.type() == simdjson::dom::element_type::STRING; } + ALWAYS_INLINE bool isArray() const { return element.type() == simdjson::dom::element_type::ARRAY; } + ALWAYS_INLINE bool isObject() const { return element.type() == simdjson::dom::element_type::OBJECT; } + ALWAYS_INLINE bool isBool() const { return element.type() == simdjson::dom::element_type::BOOL; } + ALWAYS_INLINE bool isNull() const { return element.type() == simdjson::dom::element_type::NULL_VALUE; } + ALWAYS_INLINE Int64 getInt64() const { return element.get_int64().value_unsafe(); } + ALWAYS_INLINE UInt64 getUInt64() const { return element.get_uint64().value_unsafe(); } + ALWAYS_INLINE double getDouble() const { return element.get_double().value_unsafe(); } + ALWAYS_INLINE bool getBool() const { return element.get_bool().value_unsafe(); } + ALWAYS_INLINE std::string_view getString() const { return element.get_string().value_unsafe(); } + ALWAYS_INLINE Array getArray() const; + ALWAYS_INLINE Object getObject() const; + ALWAYS_INLINE simdjson::dom::element getElement() const { return element; } + private: + simdjson::dom::element element; + }; + /// References an array in a JSON document. + class Array + { + public: + class Iterator + { + public: + ALWAYS_INLINE Iterator(const simdjson::dom::array::iterator & it_) : it(it_) {} /// NOLINT + ALWAYS_INLINE Element operator*() const { return *it; } + ALWAYS_INLINE Iterator & operator++() { ++it; return *this; } + ALWAYS_INLINE Iterator operator++(int) { auto res = *this; ++it; return res; } /// NOLINT + ALWAYS_INLINE friend bool operator!=(const Iterator & left, const Iterator & right) { return left.it != right.it; } + ALWAYS_INLINE friend bool operator==(const Iterator & left, const Iterator & right) { return !(left != right); } + private: + simdjson::dom::array::iterator it; + }; + ALWAYS_INLINE Array(const simdjson::dom::array & array_) : array(array_) {} /// NOLINT + ALWAYS_INLINE Iterator begin() const { return array.begin(); } + ALWAYS_INLINE Iterator end() const { return array.end(); } + ALWAYS_INLINE size_t size() const { return array.size(); } + ALWAYS_INLINE Element operator[](size_t index) const { assert(index < size()); return array.at(index).value_unsafe(); } + private: + simdjson::dom::array array; + }; + using KeyValuePair = std::pair; + /// References an object in a JSON document. + class Object + { + public: + class Iterator + { + public: + ALWAYS_INLINE Iterator(const simdjson::dom::object::iterator & it_) : it(it_) {} /// NOLINT + ALWAYS_INLINE KeyValuePair operator*() const { const auto & res = *it; return {res.key, res.value}; } + ALWAYS_INLINE Iterator & operator++() { ++it; return *this; } + ALWAYS_INLINE Iterator operator++(int) { auto res = *this; ++it; return res; } /// NOLINT + ALWAYS_INLINE friend bool operator!=(const Iterator & left, const Iterator & right) { return left.it != right.it; } + ALWAYS_INLINE friend bool operator==(const Iterator & left, const Iterator & right) { return !(left != right); } + private: + simdjson::dom::object::iterator it; + }; + ALWAYS_INLINE Object(const simdjson::dom::object & object_) : object(object_) {} /// NOLINT + ALWAYS_INLINE Iterator begin() const { return object.begin(); } + ALWAYS_INLINE Iterator end() const { return object.end(); } + ALWAYS_INLINE size_t size() const { return object.size(); } + bool find(const PathInData & path, Element & result) const { + size_t idx = 0; + auto obj = object; + simdjson::simdjson_result x; + for(const auto& part : path.get_parts()) { + ++idx; + x = obj.at_key(part.key); + if (x.error()) { + return false; + } + if (!x.is_object()) { + break; + } + obj = x.get_object(); + } + if (idx != path.get_parts().size()) { + return false; + } + result = x.value_unsafe(); + return true; + } + bool find(const std::string_view & key, Element & result) const + { + auto x = object.at_key(key); + if (x.error()) + return false; + result = x.value_unsafe(); + return true; + } + /// Optional: Provides access to an object's element by index. + KeyValuePair operator[](size_t index) const + { + assert(index < size()); + auto it = object.begin(); + while (index--) + ++it; + const auto & res = *it; + return {res.key, res.value}; + } + private: + simdjson::dom::object object; + }; + /// Parses a JSON document, returns the reference to its root element if succeeded. + bool parse(const std::string_view & json, Element & result) + { + auto document = parser.parse(json.data(), json.size()); + if (document.error()) + return false; + result = document.value_unsafe(); + return true; + } + /// Optional: Allocates memory to parse JSON documents faster. + void reserve(size_t max_size) + { + if (parser.allocate(max_size) != simdjson::error_code::SUCCESS) { + LOG(FATAL) << "Couldn't allocate " + std::to_string(max_size) + " bytes when parsing JSON"; + } + } +private: + simdjson::dom::parser parser; +}; +inline ALWAYS_INLINE SimdJSONParser::Array SimdJSONParser::Element::getArray() const +{ + return element.get_array().value_unsafe(); +} +inline ALWAYS_INLINE SimdJSONParser::Object SimdJSONParser::Element::getObject() const +{ + return element.get_object().value_unsafe(); +} + +} // namespace doris::vectorized \ No newline at end of file From aed6429ec0583a6f9f12c33abac38753520b6524 Mon Sep 17 00:00:00 2001 From: eldenmoon <15605149486@163.com> Date: Mon, 5 Sep 2022 19:09:38 +0800 Subject: [PATCH 04/30] [feature-dynamic-table](storage-engine) adapt storage engine to support dynamic schema --- be/src/olap/delta_writer.cpp | 2 + be/src/olap/memtable.cpp | 8 +- be/src/olap/rowset/beta_rowset_writer.cpp | 33 ++- be/src/olap/rowset/beta_rowset_writer.h | 14 +- be/src/olap/rowset/rowset_writer_context.h | 6 + .../olap/rowset/segment_v2/segment_writer.cpp | 76 ++++++- .../olap/rowset/segment_v2/segment_writer.h | 10 +- be/src/olap/tablet_schema.h | 4 + be/src/vec/common/object_util.cpp | 89 +++++--- be/src/vec/common/object_util.h | 21 +- be/src/vec/json/json_parser.cpp | 214 ++++++++---------- be/src/vec/json/json_parser.h | 32 ++- be/src/vec/json/parse2column.cpp | 64 +++--- be/src/vec/json/parse2column.h | 9 +- be/src/vec/json/path_in_data.cpp | 6 +- be/src/vec/json/path_in_data.h | 1 + be/src/vec/json/simd_json_parser.h | 160 ++++++++----- be/src/vec/olap/olap_data_convertor.h | 1 + 18 files changed, 453 insertions(+), 297 deletions(-) diff --git a/be/src/olap/delta_writer.cpp b/be/src/olap/delta_writer.cpp index 678d5006a0dda9..1145aaa724dc11 100644 --- a/be/src/olap/delta_writer.cpp +++ b/be/src/olap/delta_writer.cpp @@ -457,6 +457,8 @@ void DeltaWriter::_build_current_tablet_schema(int64_t index_id, if (_tablet_schema->schema_version() > ori_tablet_schema.schema_version()) { _tablet->update_max_version_schema(_tablet_schema); } + + _tablet_schema->set_table_id(ptable_schema_param.table_id()); } void DeltaWriter::_request_slave_tablet_pull_rowset(PNodeInfo node_info) { diff --git a/be/src/olap/memtable.cpp b/be/src/olap/memtable.cpp index 9ec3cb0fda2969..be3509045043b0 100644 --- a/be/src/olap/memtable.cpp +++ b/be/src/olap/memtable.cpp @@ -149,7 +149,11 @@ int MemTable::RowInBlockComparator::operator()(const RowInBlock* left, void MemTable::insert(const vectorized::Block* input_block, const std::vector& row_idxs) { SCOPED_CONSUME_MEM_TRACKER(_insert_mem_tracker_use_hook.get()); - auto target_block = input_block->copy_block(_column_offset); + vectorized::Block target_block = *input_block; + // maybe rollup tablet, dynamic table's tablet need full columns + if (!_tablet_schema->is_dynamic_schema()) { + target_block = input_block->copy_block(_column_offset); + } if (_is_first_insertion) { _is_first_insertion = false; auto cloneBlock = target_block.clone_without_columns(); @@ -163,7 +167,7 @@ void MemTable::insert(const vectorized::Block* input_block, const std::vectoris_dynamic_schema()); size_t input_size = target_block.allocated_bytes() * num_rows / target_block.rows(); _mem_usage += input_size; _insert_mem_tracker->consume(input_size); diff --git a/be/src/olap/rowset/beta_rowset_writer.cpp b/be/src/olap/rowset/beta_rowset_writer.cpp index 6d96b8445bdb65..b26ec67d9f7a5c 100644 --- a/be/src/olap/rowset/beta_rowset_writer.cpp +++ b/be/src/olap/rowset/beta_rowset_writer.cpp @@ -36,6 +36,8 @@ #include "runtime/exec_env.h" #include "runtime/memory/mem_tracker_limiter.h" +#include "vec/common/object_util.h" // LocalSchemaChangeRecorder + namespace doris { using namespace ErrorCode; @@ -98,6 +100,7 @@ Status BetaRowsetWriter::init(const RowsetWriterContext& rowset_writer_context) } _rowset_meta->set_tablet_uid(_context.tablet_uid); _rowset_meta->set_tablet_schema(_context.tablet_schema); + _context.schema_change_recorder = std::make_shared(); return Status::OK(); } @@ -107,7 +110,7 @@ Status BetaRowsetWriter::add_block(const vectorized::Block* block) { return Status::OK(); } if (UNLIKELY(_segment_writer == nullptr)) { - RETURN_NOT_OK(_create_segment_writer(&_segment_writer)); + RETURN_NOT_OK(_create_segment_writer(&_segment_writer, block)); } return _add_block(block, &_segment_writer); } @@ -489,7 +492,7 @@ bool BetaRowsetWriter::_check_and_set_is_doing_segcompaction() { Status BetaRowsetWriter::_segcompaction_if_necessary() { Status status = Status::OK(); if (!config::enable_segcompaction || !config::enable_storage_vectorization || - !_check_and_set_is_doing_segcompaction()) { + _context.tablet_schema->is_dynamic_schema() || !_check_and_set_is_doing_segcompaction()) { return status; } if (_segcompaction_status.load() != OK) { @@ -557,7 +560,7 @@ Status BetaRowsetWriter::_add_block(const vectorized::Block* block, if (UNLIKELY(max_row_add < 1)) { // no space for another signle row, need flush now RETURN_NOT_OK(_flush_segment_writer(segment_writer)); - RETURN_NOT_OK(_create_segment_writer(segment_writer)); + RETURN_NOT_OK(_create_segment_writer(segment_writer, block)); max_row_add = (*segment_writer)->max_row_to_add(row_avg_size_in_bytes); DCHECK(max_row_add > 0); } @@ -621,7 +624,7 @@ Status BetaRowsetWriter::flush_single_memtable(const vectorized::Block* block, i } RETURN_NOT_OK(_segcompaction_if_necessary()); std::unique_ptr writer; - RETURN_NOT_OK(_create_segment_writer(&writer)); + RETURN_NOT_OK(_create_segment_writer(&writer, block)); RETURN_NOT_OK(_add_block(block, &writer)); RETURN_NOT_OK(_flush_segment_writer(&writer, flush_size)); return Status::OK(); @@ -700,6 +703,19 @@ RowsetSharedPtr BetaRowsetWriter::build() { _rowset_meta->set_newest_write_timestamp(UnixSeconds()); } + // schema changed during this load + if (_context.schema_change_recorder->has_extended_columns()) { + DCHECK(_context.tablet_schema->is_dynamic_schema()) + << "Load can change local schema only in dynamic table"; + TabletSchemaSPtr new_schema = std::make_shared(); + new_schema->copy_from(*_context.tablet_schema); + for (auto const& [_, col] : _context.schema_change_recorder->copy_extended_columns()) { + new_schema->append_column(col); + } + new_schema->set_schema_version(_context.schema_change_recorder->schema_version()); + _rowset_meta->set_tablet_schema(new_schema); + } + RowsetSharedPtr rowset; status = RowsetFactory::create_rowset(_context.tablet_schema, _context.rowset_dir, _rowset_meta, &rowset); @@ -801,7 +817,7 @@ RowsetSharedPtr BetaRowsetWriter::build_tmp() { Status BetaRowsetWriter::_do_create_segment_writer( std::unique_ptr* writer, bool is_segcompaction, int64_t begin, - int64_t end) { + int64_t end, const vectorized::Block* block) { std::string path; int32_t segment_id = 0; if (is_segcompaction) { @@ -847,7 +863,7 @@ Status BetaRowsetWriter::_do_create_segment_writer( } } - auto s = (*writer)->init(); + auto s = (*writer)->init(block); if (!s.ok()) { LOG(WARNING) << "failed to init segment writer: " << s.to_string(); writer->reset(nullptr); @@ -857,7 +873,8 @@ Status BetaRowsetWriter::_do_create_segment_writer( } Status BetaRowsetWriter::_create_segment_writer( - std::unique_ptr* writer) { + std::unique_ptr* writer, + const vectorized::Block* block) { size_t total_segment_num = _num_segment - _segcompacted_point + 1 + _num_segcompacted; if (UNLIKELY(total_segment_num > config::max_segment_num_per_rowset)) { LOG(WARNING) << "too many segments in rowset." @@ -868,7 +885,7 @@ Status BetaRowsetWriter::_create_segment_writer( << " _num_segcompacted:" << _num_segcompacted; return Status::Error(); } else { - return _do_create_segment_writer(writer, false, -1, -1); + return _do_create_segment_writer(writer, false, -1, -1, block); } } diff --git a/be/src/olap/rowset/beta_rowset_writer.h b/be/src/olap/rowset/beta_rowset_writer.h index ccef9212ffb60d..2504b179a8215a 100644 --- a/be/src/olap/rowset/beta_rowset_writer.h +++ b/be/src/olap/rowset/beta_rowset_writer.h @@ -32,6 +32,9 @@ class FileWriter; using SegCompactionCandidates = std::vector; using SegCompactionCandidatesSharedPtr = std::shared_ptr; +namespace vectorized::object_util { +class LocalSchemaChangeRecorder; +} class BetaRowsetWriter : public RowsetWriter { public: @@ -80,6 +83,11 @@ class BetaRowsetWriter : public RowsetWriter { int32_t get_atomic_num_segment() const override { return _num_segment.load(); } + // Maybe modified by local schema change + vectorized::object_util::LocalSchemaChangeRecorder* mutable_schema_change_recorder() { + return _context.schema_change_recorder.get(); + } + private: Status _add_block(const vectorized::Block* block, std::unique_ptr* writer); @@ -87,8 +95,10 @@ class BetaRowsetWriter : public RowsetWriter { std::unique_ptr* writer); Status _do_create_segment_writer(std::unique_ptr* writer, - bool is_segcompaction, int64_t begin, int64_t end); - Status _create_segment_writer(std::unique_ptr* writer); + bool is_segcompaction, int64_t begin, int64_t end, + const vectorized::Block* block = nullptr); + Status _create_segment_writer(std::unique_ptr* writer, + const vectorized::Block* block = nullptr); Status _create_segment_writer_for_segcompaction( std::unique_ptr* writer, uint64_t begin, uint64_t end); diff --git a/be/src/olap/rowset/rowset_writer_context.h b/be/src/olap/rowset/rowset_writer_context.h index 8669a072de1b0a..aa42ed19d4408b 100644 --- a/be/src/olap/rowset/rowset_writer_context.h +++ b/be/src/olap/rowset/rowset_writer_context.h @@ -26,6 +26,9 @@ namespace doris { class RowsetWriterContextBuilder; using RowsetWriterContextBuilderSharedPtr = std::shared_ptr; class DataDir; +namespace vectorized::object_util { +class LocalSchemaChangeRecorder; +} struct RowsetWriterContext { RowsetWriterContext() @@ -79,6 +82,9 @@ struct RowsetWriterContext { // If it is directly write from load procedure, else // it could be compaction or schema change etc.. bool is_direct_write = false; + // for tracing local schema change record + std::shared_ptr + schema_change_recorder = nullptr; }; } // namespace doris diff --git a/be/src/olap/rowset/segment_v2/segment_writer.cpp b/be/src/olap/rowset/segment_v2/segment_writer.cpp index 9a90cb314fc705..d2533541a834f7 100644 --- a/be/src/olap/rowset/segment_v2/segment_writer.cpp +++ b/be/src/olap/rowset/segment_v2/segment_writer.cpp @@ -34,6 +34,7 @@ #include "util/crc32c.h" #include "util/faststring.h" #include "util/key_util.h" +#include "vec/common/object_util.h" namespace doris { namespace segment_v2 { @@ -88,22 +89,28 @@ void SegmentWriter::init_column_meta(ColumnMetaPB* meta, uint32_t column_id, } } -Status SegmentWriter::init() { +Status SegmentWriter::init(const vectorized::Block* block) { std::vector column_ids; - for (uint32_t i = 0; i < _tablet_schema->num_columns(); ++i) { + int column_cnt = _tablet_schema->num_columns(); + if (block) { + column_cnt = block->columns(); + } + for (uint32_t i = 0; i < column_cnt; ++i) { column_ids.emplace_back(i); } - return init(column_ids, true); + return init(column_ids, true, block); } -Status SegmentWriter::init(const std::vector& col_ids, bool has_key) { +Status SegmentWriter::init(const std::vector& col_ids, bool has_key, + const vectorized::Block* block) { DCHECK(_column_writers.empty()); DCHECK(_column_ids.empty()); _has_key = has_key; _column_writers.reserve(_tablet_schema->columns().size()); _column_ids.insert(_column_ids.end(), col_ids.begin(), col_ids.end()); - for (auto& cid : col_ids) { - const auto& column = _tablet_schema->column(cid); + _olap_data_convertor = + std::make_unique(); + auto create_column_writer = [&](uint32_t cid, const auto& column) -> auto { ColumnWriterOptions opts; opts.meta = _footer.add_columns(); @@ -182,6 +189,15 @@ Status SegmentWriter::init(const std::vector& col_ids, bool has_key) { RETURN_IF_ERROR(ColumnWriter::create(opts, &column, _file_writer, &writer)); RETURN_IF_ERROR(writer->init()); _column_writers.push_back(std::move(writer)); + + _olap_data_convertor.add_column_data_convertor(column); + return Status::OK(); + }; + + if (block) { + RETURN_IF_ERROR(_create_writers_with_block(block, create_column_writer)); + } else { + RETURN_IF_ERROR(_create_writers(create_column_writer)); } // we don't need the short key index for unique key merge on write table. @@ -200,9 +216,51 @@ Status SegmentWriter::init(const std::vector& col_ids, bool has_key) { new ShortKeyIndexBuilder(_segment_id, _opts.num_rows_per_block)); } } - // init olap data converter - _olap_data_convertor = - std::make_unique(_tablet_schema.get(), _column_ids); + return Status::OK(); +} + +Status SegmentWriter::_create_writers( + std::function create_column_writer) { + _olap_data_convertor->reserve(_column_ids.size()); + for (auto& cid : _column_ids) { + RETURN_IF_ERROR(create_column_writer(cid, _tablet_schema->column(cid))); + } + return Status::OK(); +} + +Status SegmentWriter::_create_writers_with_block( + const vectorized::Block* block, + std::function create_column_writer) { + // generate writers from schema and extended schema info + _olap_data_convertor->reserve(block->columns()); + // new columns added, query column info from Master + vectorized::object_util::FullBaseSchemaView schema_view; + if (block->columns() > _tablet_schema->num_columns()) { + schema_view.table_id = _tablet_schema->table_id(); + RETURN_IF_ERROR( + vectorized::object_util::send_fetch_full_base_schema_view_rpc(&schema_view)); + } + for (size_t i = 0; i < block->columns(); ++i) { + const auto& column_type_name = block->get_by_position(i); + auto idx = _tablet_schema->field_index(column_type_name.name); + if (idx >= 0) { + RETURN_IF_ERROR(create_column_writer(i, _tablet_schema->column(idx))); + } else { + if (schema_view.column_name_to_column.count(column_type_name.name) == 0) { + // expr columns, maybe happend in query like `insert into table1 select function(column1), column2 from table2` + // the first column name may become `function(column1)`, so we use column offset to get columns info + // TODO here we could optimize to col_unique_id in the future + RETURN_IF_ERROR(create_column_writer(i, _tablet_schema->column(i))); + continue; + } + // extended columns + const auto& tcolumn = schema_view.column_name_to_column[column_type_name.name]; + TabletColumn new_column(tcolumn); + RETURN_IF_ERROR(create_column_writer(i, new_column)); + _opts.rowset_ctx->schema_change_recorder->add_extended_columns( + new_column, schema_view.schema_version); + } + } return Status::OK(); } diff --git a/be/src/olap/rowset/segment_v2/segment_writer.h b/be/src/olap/rowset/segment_v2/segment_writer.h index ebdec857f0e71f..4b3f313ec99f6a 100644 --- a/be/src/olap/rowset/segment_v2/segment_writer.h +++ b/be/src/olap/rowset/segment_v2/segment_writer.h @@ -73,10 +73,11 @@ class SegmentWriter { uint32_t max_row_per_segment, const SegmentWriterOptions& opts); ~SegmentWriter(); - Status init(); + Status init(const vectorized::Block* block = nullptr); // for vertical compaction - Status init(const std::vector& col_ids, bool has_key); + Status init(const std::vector& col_ids, bool has_key, + const vectorized::Block* block = nullptr); template Status append_row(const RowType& row); @@ -108,6 +109,11 @@ class SegmentWriter { bool is_unique_key() { return _tablet_schema->keys_type() == UNIQUE_KEYS; } private: + Status _create_writers_with_block( + const vectorized::Block* block, + std::function writer_creator); + Status _create_writers( + std::function writer_creator); DISALLOW_COPY_AND_ASSIGN(SegmentWriter); Status _write_data(); Status _write_ordinal_index(); diff --git a/be/src/olap/tablet_schema.h b/be/src/olap/tablet_schema.h index b208eb384afe29..bb9eff25b7dd44 100644 --- a/be/src/olap/tablet_schema.h +++ b/be/src/olap/tablet_schema.h @@ -228,7 +228,10 @@ class TabletSchema { const std::vector& return_columns, const std::unordered_set* tablet_columns_need_convert_null = nullptr) const; vectorized::Block create_block(bool ignore_dropped_col = true) const; + void set_schema_version(int32_t version) { _schema_version = version; } + void set_table_id(int32_t table_id) { _table_id = table_id; } + int32_t table_id() const { return _table_id; } void build_current_tablet_schema(int64_t index_id, int32_t version, const OlapTableIndexSchema* index, const TabletSchema& out_tablet_schema); @@ -275,6 +278,7 @@ class TabletSchema { int32_t _delete_sign_idx = -1; int32_t _sequence_col_idx = -1; int32_t _schema_version = -1; + int32_t _table_id = -1; bool _disable_auto_compaction = false; int64_t _mem_size = 0; bool _store_row_column = false; diff --git a/be/src/vec/common/object_util.cpp b/be/src/vec/common/object_util.cpp index 90b3027e0da223..6760dec9465f68 100644 --- a/be/src/vec/common/object_util.cpp +++ b/be/src/vec/common/object_util.cpp @@ -79,35 +79,36 @@ Array create_empty_array_field(size_t num_dimensions) { return array; } -Status convert_objects_to_tuples(Block& block) { - for (auto& column : block) { - if (!column.type->is_object()) continue; - auto& column_object = assert_cast(*column.column->assume_mutable()); - column_object.finalize(); - const auto& subcolumns = column_object.get_subcolumns(); - if (!column_object.is_finalized()) - return Status::InvalidArgument("Can't convert object to tuple"); - PathsInData tuple_paths; - DataTypes tuple_types; - Columns tuple_columns; - for (const auto& entry : subcolumns) { - tuple_paths.emplace_back(entry->path); - tuple_types.emplace_back(entry->data.getLeastCommonType()); - tuple_columns.emplace_back(entry->data.get_finalized_column_ptr()); - } - std::tie(column.column, column.type) = - unflatten_tuple(tuple_paths, tuple_types, tuple_columns); - } - return Status::OK(); -} +// Status convert_objects_to_tuples(Block& block) { +// for (auto& column : block) { +// if (!column.type->is_object()) continue; +// auto& column_object = assert_cast(*column.column->assume_mutable()); +// column_object.finalize(); +// const auto& subcolumns = column_object.get_subcolumns(); +// if (!column_object.is_finalized()) +// return Status::InvalidArgument("Can't convert object to tuple"); +// PathsInData tuple_paths; +// DataTypes tuple_types; +// Columns tuple_columns; +// for (const auto& entry : subcolumns) { +// tuple_paths.emplace_back(entry->path); +// tuple_types.emplace_back(entry->data.getLeastCommonType()); +// tuple_columns.emplace_back(entry->data.get_finalized_column_ptr()); +// } +// std::tie(column.column, column.type) = +// unflatten_tuple(tuple_paths, tuple_types, tuple_columns); +// } +// return Status::OK(); +// } +// +// DataTypePtr unflatten_tuple(const PathsInData& paths, const DataTypes& tuple_types) { +// assert(paths.size() == tuple_types.size()); +// Columns tuple_columns; +// tuple_columns.reserve(tuple_types.size()); +// for (const auto& type : tuple_types) tuple_columns.emplace_back(type->create_column()); +// return unflatten_tuple(paths, tuple_types, tuple_columns).second; +// } -DataTypePtr unflatten_tuple(const PathsInData& paths, const DataTypes& tuple_types) { - assert(paths.size() == tuple_types.size()); - Columns tuple_columns; - tuple_columns.reserve(tuple_types.size()); - for (const auto& type : tuple_types) tuple_columns.emplace_back(type->create_column()); - return unflatten_tuple(paths, tuple_types, tuple_columns).second; -} ColumnPtr reduce_number_of_dimensions(ColumnPtr column, size_t dimensions_to_reduce) { while (dimensions_to_reduce--) { const auto* column_array = typeid_cast(column.get()); @@ -727,4 +728,36 @@ void align_block_by_name_and_type(MutableBlock* mblock, const Block* block, size }); } +void LocalSchemaChangeRecorder::add_extended_columns(const TabletColumn& new_column, + int32_t schema_version) { + std::lock_guard lock(_lock); + _schema_version = std::max(_schema_version, schema_version); + auto it = _extended_columns.find(new_column.name()); + if (it != _extended_columns.end()) { + return; + } + _extended_columns.emplace_hint(it, new_column.name(), new_column); +} + +bool LocalSchemaChangeRecorder::has_extended_columns() { + std::lock_guard lock(_lock); + return !_extended_columns.empty(); +} + +std::map LocalSchemaChangeRecorder::copy_extended_columns() { + std::lock_guard lock(_lock); + return _extended_columns; +} + +const TabletColumn& LocalSchemaChangeRecorder::column(const std::string& col_name) { + std::lock_guard lock(_lock); + assert(_extended_columns.find(col_name) != _extended_columns.end()); + return _extended_columns[col_name]; +} + +int32_t LocalSchemaChangeRecorder::schema_version() { + std::lock_guard lock(_lock); + return _schema_version; +} + } // namespace doris::vectorized::object_util diff --git a/be/src/vec/common/object_util.h b/be/src/vec/common/object_util.h index 021fcf3762067a..7bd6b5a632903e 100644 --- a/be/src/vec/common/object_util.h +++ b/be/src/vec/common/object_util.h @@ -29,7 +29,7 @@ #include "olap/tablet_schema.h" namespace doris { -class RowsetLocalSchemaChangeHistory; +class LocalSchemaChangeRecorder; } namespace doris::vectorized::object_util { @@ -86,7 +86,7 @@ void convert_to_tablet_column(const DataTypePtr& data_type, TabletColumn* column // 2. Schema change which is add columns will be performed if the infered schema is // different from the original tablet schema, new columns added to schema change history Status parse_and_expand_dynamic_column(Block& block, const TabletSchema& schema_hints, - RowsetLocalSchemaChangeHistory* history); + LocalSchemaChangeRecorder* history); Status parse_object_column(Block& block, size_t position); @@ -117,7 +117,7 @@ Status cast_column(const ColumnWithTypeAndName& arg, const DataTypePtr& type, Co // 3. col3 in schema which missing in block will be ignored // After schema changed, schame change history will add new columns Status align_block_with_schema(const TabletSchema& schema, int64_t table_id /*for schema change*/, - Block& block, RowsetLocalSchemaChangeHistory* history); + Block& block, LocalSchemaChangeRecorder* history); // record base schema column infos // maybe use col_unique_id as key in the future // but for dynamic table, column name if ok @@ -143,4 +143,19 @@ void align_block_by_name_and_type(MutableBlock* mblock, const Block* block, cons void align_block_by_name_and_type(MutableBlock* mblock, const Block* block, size_t row_begin, size_t length); +// For tracking local schema change during load procedure +class LocalSchemaChangeRecorder { +public: + void add_extended_columns(const TabletColumn& new_column, int32_t schema_version); + bool has_extended_columns(); + std::map copy_extended_columns(); + const TabletColumn& column(const std::string& col_name); + int32_t schema_version(); + +private: + std::mutex _lock; + int32_t _schema_version = -1; + std::map _extended_columns; +}; + } // namespace doris::vectorized::object_util diff --git a/be/src/vec/json/json_parser.cpp b/be/src/vec/json/json_parser.cpp index 2a5f0a6220a011..7d8af8022a4060 100644 --- a/be/src/vec/json/json_parser.cpp +++ b/be/src/vec/json/json_parser.cpp @@ -1,116 +1,100 @@ #include "vec/json/json_parser.h" + #include "vec/json/simd_json_parser.h" namespace doris::vectorized { template -bool JSONDataParser::extract_key( - MutableColumns& columns, StringRef json, - const std::vector& keys, const std::vector& types) { +bool JSONDataParser::extract_key(MutableColumns& columns, StringRef json, + const std::vector& keys, + const std::vector& types) { assert(types.size() == keys.size()); - assert(columns.size() >= keys.size()); - Element document; - if (!parser.parse(json.to_string_view(), document) || !document.isObject()) { - return false; + assert(columns.size() >= keys.size()); + Element document; + if (!parser.parse(json.to_string_view(), document) || !document.isObject()) { + return false; + } + const auto& obj = document.getObject(); + for (size_t x = 0; x < types.size(); ++x) { + Element element; + PathInData key_path(keys[x].to_string_view()); + if (!obj.find(key_path, element) || element.isNull()) { + columns[x]->insert_default(); + continue; } - const auto& obj = document.getObject(); - for (size_t x = 0; x < types.size(); ++x) { - Element element; - PathInData key_path(keys[x].to_string_view()); - if (!obj.find(key_path, element) || element.isNull()) { - columns[x]->insert_default(); - continue; - } - switch (types[x]) { - case ExtractType::ToString: { - if (element.isString()) { - auto str = element.getString(); - columns[x]->insert_data(str.data(), str.size()); - break; - } - auto str = castValueAsString(element); + switch (types[x]) { + case ExtractType::ToString: { + if (element.isString()) { + auto str = element.getString(); columns[x]->insert_data(str.data(), str.size()); break; } - default: - break; + auto str = castValueAsString(element); + columns[x]->insert_data(str.data(), str.size()); + break; } + default: + break; } - return true; + } + return true; } template -std::optional JSONDataParser::parse(const char * begin, size_t length) -{ - std::string_view json{begin, length}; +std::optional JSONDataParser::parse(const char* begin, size_t length) { + std::string_view json {begin, length}; Element document; - if (!parser.parse(json, document)) - return {}; + if (!parser.parse(json, document)) return {}; ParseContext context; traverse(document, context); ParseResult result; result.values = std::move(context.values); result.paths.reserve(context.paths.size()); - for (auto && path : context.paths) - result.paths.emplace_back(std::move(path)); + for (auto&& path : context.paths) result.paths.emplace_back(std::move(path)); return result; } template -void JSONDataParser::traverse(const Element & element, ParseContext & ctx) -{ +void JSONDataParser::traverse(const Element& element, ParseContext& ctx) { // checkStackSize(); - if (element.isObject()) - { + if (element.isObject()) { traverseObject(element.getObject(), ctx); - } - else if (element.isArray()) - { + } else if (element.isArray()) { traverseArray(element.getArray(), ctx); - } - else - { + } else { ctx.paths.push_back(ctx.builder.get_parts()); ctx.values.push_back(getValueAsField(element)); } } template -void JSONDataParser::traverseObject(const JSONObject & object, ParseContext & ctx) -{ +void JSONDataParser::traverseObject(const JSONObject& object, ParseContext& ctx) { ctx.paths.reserve(ctx.paths.size() + object.size()); ctx.values.reserve(ctx.values.size() + object.size()); - for (auto it = object.begin(); it != object.end(); ++it) - { - const auto & [key, value] = *it; + for (auto it = object.begin(); it != object.end(); ++it) { + const auto& [key, value] = *it; ctx.builder.append(key, false); traverse(value, ctx); ctx.builder.pop_back(); } } template -void JSONDataParser::traverseArray(const JSONArray & array, ParseContext & ctx) -{ +void JSONDataParser::traverseArray(const JSONArray& array, ParseContext& ctx) { /// Traverse elements of array and collect an array of fields by each path. ParseArrayContext array_ctx; array_ctx.total_size = array.size(); - for (auto it = array.begin(); it != array.end(); ++it) - { + for (auto it = array.begin(); it != array.end(); ++it) { traverseArrayElement(*it, array_ctx); ++array_ctx.current_size; } - auto && arrays_by_path = array_ctx.arrays_by_path; - if (arrays_by_path.empty()) - { + auto&& arrays_by_path = array_ctx.arrays_by_path; + if (arrays_by_path.empty()) { ctx.paths.push_back(ctx.builder.get_parts()); ctx.values.push_back(Array()); - } - else - { + } else { ctx.paths.reserve(ctx.paths.size() + arrays_by_path.size()); ctx.values.reserve(ctx.values.size() + arrays_by_path.size()); - for (auto it = arrays_by_path.begin(); it != arrays_by_path.end(); ++it) - { - auto && [path, path_array] = it->second; + for (auto it = arrays_by_path.begin(); it != arrays_by_path.end(); ++it) { + auto&& [path, path_array] = it->second; /// Merge prefix path and path of array element. ctx.paths.push_back(ctx.builder.append(path, true).get_parts()); ctx.values.push_back(std::move(path_array)); @@ -119,58 +103,48 @@ void JSONDataParser::traverseArray(const JSONArray & array, ParseCon } } template -void JSONDataParser::traverseArrayElement(const Element & element, ParseArrayContext & ctx) -{ +void JSONDataParser::traverseArrayElement(const Element& element, + ParseArrayContext& ctx) { ParseContext element_ctx; traverse(element, element_ctx); - auto & [_, paths, values] = element_ctx; + auto& [_, paths, values] = element_ctx; size_t size = paths.size(); size_t keys_to_update = ctx.arrays_by_path.size(); - for (size_t i = 0; i < size; ++i) - { - if (values[i].is_null()) - continue; + for (size_t i = 0; i < size; ++i) { + if (values[i].is_null()) continue; UInt128 hash = PathInData::get_parts_hash(paths[i]); auto found = ctx.arrays_by_path.find(hash); - if (found != ctx.arrays_by_path.end()) - { - auto & path_array = found->second.second; + if (found != ctx.arrays_by_path.end()) { + auto& path_array = found->second.second; assert(path_array.size() == ctx.current_size); /// If current element of array is part of Nested, /// collect its size or check it if the size of /// the Nested has been already collected. auto nested_key = getNameOfNested(paths[i], values[i]); - if (!nested_key.empty()) - { - size_t array_size = get(values[i]).size(); - auto & current_nested_sizes = ctx.nested_sizes_by_key[nested_key]; + if (!nested_key.empty()) { + size_t array_size = get(values[i]).size(); + auto& current_nested_sizes = ctx.nested_sizes_by_key[nested_key]; if (current_nested_sizes.size() == ctx.current_size) current_nested_sizes.push_back(array_size); else if (array_size != current_nested_sizes.back()) { - LOG(FATAL) << fmt::format( - "Array sizes mismatched ({} and {})", array_size, current_nested_sizes.back()); + LOG(FATAL) << fmt::format("Array sizes mismatched ({} and {})", array_size, + current_nested_sizes.back()); } } path_array.push_back(std::move(values[i])); --keys_to_update; - } - else - { + } else { /// We found a new key. Add and empty array with current size. Array path_array; path_array.reserve(ctx.total_size); path_array.resize(ctx.current_size); auto nested_key = getNameOfNested(paths[i], values[i]); - if (!nested_key.empty()) - { - size_t array_size = get(values[i]).size(); - auto & current_nested_sizes = ctx.nested_sizes_by_key[nested_key]; - if (current_nested_sizes.empty()) - { + if (!nested_key.empty()) { + size_t array_size = get(values[i]).size(); + auto& current_nested_sizes = ctx.nested_sizes_by_key[nested_key]; + if (current_nested_sizes.empty()) { current_nested_sizes.resize(ctx.current_size); - } - else - { + } else { /// If newly added element is part of the Nested then /// resize its elements to keep correct sizes of Nested arrays. for (size_t j = 0; j < ctx.current_size; ++j) @@ -179,78 +153,68 @@ void JSONDataParser::traverseArrayElement(const Element & element, P if (current_nested_sizes.size() == ctx.current_size) current_nested_sizes.push_back(array_size); else if (array_size != current_nested_sizes.back()) - LOG(FATAL) << fmt::format( - "Array sizes mismatched ({} and {})", array_size, current_nested_sizes.back()); + LOG(FATAL) << fmt::format("Array sizes mismatched ({} and {})", array_size, + current_nested_sizes.back()); } path_array.push_back(std::move(values[i])); - auto & elem = ctx.arrays_by_path[hash]; + auto& elem = ctx.arrays_by_path[hash]; elem.first = std::move(paths[i]); elem.second = std::move(path_array); } } /// If some of the keys are missed in current element, /// add default values for them. - if (keys_to_update) - fillMissedValuesInArrays(ctx); + if (keys_to_update) fillMissedValuesInArrays(ctx); } template -void JSONDataParser::fillMissedValuesInArrays(ParseArrayContext & ctx) -{ - for (auto it = ctx.arrays_by_path.begin(); it != ctx.arrays_by_path.end(); ++it) - { - auto & [path, path_array] = it->second; +void JSONDataParser::fillMissedValuesInArrays(ParseArrayContext& ctx) { + for (auto it = ctx.arrays_by_path.begin(); it != ctx.arrays_by_path.end(); ++it) { + auto& [path, path_array] = it->second; assert(path_array.size() == ctx.current_size || path_array.size() == ctx.current_size + 1); - if (path_array.size() == ctx.current_size) - { + if (path_array.size() == ctx.current_size) { bool inserted = tryInsertDefaultFromNested(ctx, path, path_array); - if (!inserted) - path_array.emplace_back(); + if (!inserted) path_array.emplace_back(); } } } template -bool JSONDataParser::tryInsertDefaultFromNested( - ParseArrayContext & ctx, const PathInData::Parts & path, Array & array) -{ +bool JSONDataParser::tryInsertDefaultFromNested(ParseArrayContext& ctx, + const PathInData::Parts& path, + Array& array) { /// If there is a collected size of current Nested /// then insert array of this size as a default value. - if (path.empty() || array.empty()) - return false; + if (path.empty() || array.empty()) return false; /// Last element is not Null, because otherwise this path wouldn't exist. auto nested_key = getNameOfNested(path, array.back()); - if (nested_key.empty()) - return false; - auto mapped = ctx.nested_sizes_by_key.find(nested_key); - if (mapped == ctx.nested_sizes_by_key.end()) - return false; - auto & current_nested_sizes = mapped->second; - assert(current_nested_sizes.size() == ctx.current_size || current_nested_sizes.size() == ctx.current_size + 1); + if (nested_key.empty()) return false; + auto mapped = ctx.nested_sizes_by_key.find(nested_key); + if (mapped == ctx.nested_sizes_by_key.end()) return false; + auto& current_nested_sizes = mapped->second; + assert(current_nested_sizes.size() == ctx.current_size || + current_nested_sizes.size() == ctx.current_size + 1); /// If all keys of Nested were missed then add a zero length. - if (current_nested_sizes.size() == ctx.current_size) - current_nested_sizes.push_back(0); + if (current_nested_sizes.size() == ctx.current_size) current_nested_sizes.push_back(0); size_t array_size = current_nested_sizes.back(); array.push_back(Array(array_size)); return true; } template -StringRef JSONDataParser::getNameOfNested(const PathInData::Parts & path, const Field & value) -{ - if (value.get_type() != Field::Types::Array || path.empty()) - return {}; +StringRef JSONDataParser::getNameOfNested(const PathInData::Parts& path, + const Field& value) { + if (value.get_type() != Field::Types::Array || path.empty()) return {}; /// Find first key that is marked as nested, /// because we may have tuple of Nested and there could be /// several arrays with the same prefix, but with independent sizes. /// Consider we have array element with type `k2 Tuple(k3 Nested(...), k5 Nested(...))` /// Then subcolumns `k2.k3` and `k2.k5` may have indepented sizes and we should extract /// `k3` and `k5` keys instead of `k2`. - for (const auto & part : path) - if (part.is_nested) - return StringRef(part.key.data(), part.key.size()); + for (const auto& part : path) + if (part.is_nested) return StringRef(part.key.data(), part.key.size()); return {}; } template class JSONDataParser; -} \ No newline at end of file +} // namespace doris::vectorized \ No newline at end of file diff --git a/be/src/vec/json/json_parser.h b/be/src/vec/json/json_parser.h index 000b0583ab2ffc..91566fc10e6e12 100644 --- a/be/src/vec/json/json_parser.h +++ b/be/src/vec/json/json_parser.h @@ -58,17 +58,16 @@ template class JSONDataParser { public: std::optional parse(const char* begin, size_t length); - + // extract keys's element into columns - bool extract_key(MutableColumns& columns, StringRef json, - const std::vector& keys, const std::vector& types); - + bool extract_key(MutableColumns& columns, StringRef json, const std::vector& keys, + const std::vector& types); + private: using Element = typename ParserImpl::Element; using JSONObject = typename ParserImpl::Object; using JSONArray = typename ParserImpl::Array; - struct ParseContext - { + struct ParseContext { PathInDataBuilder builder; std::vector paths; std::vector values; @@ -76,23 +75,22 @@ class JSONDataParser { using PathPartsWithArray = std::pair; using PathToArray = phmap::flat_hash_map; using KeyToSizes = phmap::flat_hash_map, StringRefHash>; - struct ParseArrayContext - { + struct ParseArrayContext { size_t current_size = 0; size_t total_size = 0; PathToArray arrays_by_path; KeyToSizes nested_sizes_by_key; // Arena strings_pool; }; - void traverse(const Element & element, ParseContext & ctx); - void traverseObject(const JSONObject & object, ParseContext & ctx); - void traverseArray(const JSONArray & array, ParseContext & ctx); - void traverseArrayElement(const Element & element, ParseArrayContext & ctx); - static void fillMissedValuesInArrays(ParseArrayContext & ctx); - static bool tryInsertDefaultFromNested( - ParseArrayContext & ctx, const PathInData::Parts & path, Array & array); - static StringRef getNameOfNested(const PathInData::Parts & path, const Field & value); - + void traverse(const Element& element, ParseContext& ctx); + void traverseObject(const JSONObject& object, ParseContext& ctx); + void traverseArray(const JSONArray& array, ParseContext& ctx); + void traverseArrayElement(const Element& element, ParseArrayContext& ctx); + static void fillMissedValuesInArrays(ParseArrayContext& ctx); + static bool tryInsertDefaultFromNested(ParseArrayContext& ctx, const PathInData::Parts& path, + Array& array); + static StringRef getNameOfNested(const PathInData::Parts& path, const Field& value); + ParserImpl parser; }; diff --git a/be/src/vec/json/parse2column.cpp b/be/src/vec/json/parse2column.cpp index 797b05f30e0312..6ba3ad9ed299b9 100644 --- a/be/src/vec/json/parse2column.cpp +++ b/be/src/vec/json/parse2column.cpp @@ -1,12 +1,13 @@ #include -#include -#include -#include -#include #include #include -#include +#include +#include #include +#include +#include +#include + #include namespace doris::vectorized { @@ -21,44 +22,39 @@ namespace doris::vectorized { * and creation/destruction of objects is expensive). */ template -class SimpleObjectPool -{ +class SimpleObjectPool { protected: /// Hold all available objects in stack. std::mutex mutex; std::stack> stack; /// Specialized deleter for std::unique_ptr. /// Returns underlying pointer back to stack thus reclaiming its ownership. - struct Deleter - { - SimpleObjectPool * parent; - Deleter(SimpleObjectPool * parent_ = nullptr) : parent{parent_} {} /// NOLINT - void operator()(T * owning_ptr) const - { - std::lock_guard lock{parent->mutex}; + struct Deleter { + SimpleObjectPool* parent; + Deleter(SimpleObjectPool* parent_ = nullptr) : parent {parent_} {} /// NOLINT + void operator()(T* owning_ptr) const { + std::lock_guard lock {parent->mutex}; parent->stack.emplace(owning_ptr); } }; + public: using Pointer = std::unique_ptr; /// Extracts and returns a pointer from the stack if it's not empty, /// creates a new one by calling provided f() otherwise. template - Pointer get(Factory && f) - { + Pointer get(Factory&& f) { std::unique_lock lock(mutex); - if (stack.empty()) - { + if (stack.empty()) { lock.unlock(); - return { f(), this }; + return {f(), this}; } auto object = stack.top().release(); stack.pop(); return std::unique_ptr(object, Deleter(this)); } /// Like get(), but creates object using default constructor. - Pointer getDefault() - { + Pointer getDefault() { return get([] { return new T; }); } }; @@ -145,9 +141,9 @@ bool try_insert_default_from_nested(const std::shared_ptr& entry, return true; } -template +template Status parse_json_to_variant(IColumn& column, const char* src, size_t length, - JSONDataParser* parser) { + JSONDataParser* parser) { auto& column_object = assert_cast(column); std::optional result; /// Treat empty string as an empty object @@ -158,9 +154,9 @@ Status parse_json_to_variant(IColumn& column, const char* src, size_t length, result = ParseResult {}; } if (!result) { - LOG(INFO) << "failed to parse" << std::string_view(src, length) - << ", length= " << length; - return Status::InvalidArgument(fmt::format("Cannot parse object {}", std::string_view(src, length))); + LOG(INFO) << "failed to parse" << std::string_view(src, length) << ", length= " << length; + return Status::InvalidArgument( + fmt::format("Cannot parse object {}", std::string_view(src, length))); } auto& [paths, values] = *result; assert(paths.size() == values.size()); @@ -172,7 +168,7 @@ Status parse_json_to_variant(IColumn& column, const char* src, size_t length, // TODO support multi dimensions array if (!config::enable_parse_multi_dimession_array && field_info.num_dimensions >= 2) { return Status::InvalidArgument( - "Sorry multi dimensions array is not supported now, we are working on it"); + "Sorry multi dimensions array is not supported now, we are working on it"); } if (is_nothing(field_info.scalar_type)) continue; if (!paths_set.insert(paths[i].get_path()).second) { @@ -202,27 +198,27 @@ Status parse_json_to_variant(IColumn& column, const char* src, size_t length, return Status::OK(); } -bool extract_key(MutableColumns& columns, StringRef json, - const std::vector& keys, const std::vector& types, - JSONDataParser* parser) { +bool extract_key(MutableColumns& columns, StringRef json, const std::vector& keys, + const std::vector& types, JSONDataParser* parser) { return parser->extract_key(columns, json, keys, types); } // exposed interfaces -Status parse_json_to_variant(IColumn& column, const StringRef& json, JSONDataParser* parser) { +Status parse_json_to_variant(IColumn& column, const StringRef& json, + JSONDataParser* parser) { return parse_json_to_variant(column, json.data, json.size, parser); } Status parse_json_to_variant(IColumn& column, const std::vector& jsons) { auto parser = parsers_pool.get([] { return new JSONDataParser(); }); - for (StringRef str: jsons) { + for (StringRef str : jsons) { RETURN_IF_ERROR(parse_json_to_variant(column, str.data, str.size, parser.get())); } return Status::OK(); } bool extract_key(MutableColumns& columns, const std::vector& jsons, - const std::vector& keys, const std::vector& types) { + const std::vector& keys, const std::vector& types) { auto parser = parsers_pool.get([] { return new JSONDataParser(); }); for (StringRef json : jsons) { if (!extract_key(columns, json, keys, types, parser.get())) { @@ -233,7 +229,7 @@ bool extract_key(MutableColumns& columns, const std::vector& jsons, } bool extract_key(MutableColumns& columns, const ColumnString& json_column, - const std::vector& keys, const std::vector& types) { + const std::vector& keys, const std::vector& types) { auto parser = parsers_pool.get([] { return new JSONDataParser(); }); for (size_t x = 0; x < json_column.size(); ++x) { if (!extract_key(columns, json_column.get_data_at(x), keys, types, parser.get())) { diff --git a/be/src/vec/json/parse2column.h b/be/src/vec/json/parse2column.h index 5c8d8d0bce4228..474f42a1497024 100644 --- a/be/src/vec/json/parse2column.h +++ b/be/src/vec/json/parse2column.h @@ -11,13 +11,14 @@ namespace doris::vectorized { Status parse_json_to_variant(IColumn& column, const std::vector& jsons); // parse a single json -Status parse_json_to_variant(IColumn& column, const StringRef& jsons, JSONDataParser* parser); +Status parse_json_to_variant(IColumn& column, const StringRef& jsons, + JSONDataParser* parser); // extract keys columns from json strings into columns bool extract_key(MutableColumns& columns, const std::vector& jsons, - const std::vector& keys, const std::vector& types); + const std::vector& keys, const std::vector& types); // extract keys columns from colunnstring(json format) into columns bool extract_key(MutableColumns& columns, const ColumnString& json_column, - const std::vector& keys, const std::vector& types); -} + const std::vector& keys, const std::vector& types); +} // namespace doris::vectorized diff --git a/be/src/vec/json/path_in_data.cpp b/be/src/vec/json/path_in_data.cpp index e6542fe9e048cc..591beb55c530e6 100644 --- a/be/src/vec/json/path_in_data.cpp +++ b/be/src/vec/json/path_in_data.cpp @@ -19,10 +19,10 @@ // and modified by Doris #include -#include -#include - #include + +#include +#include namespace doris::vectorized { PathInData::PathInData(std::string_view path_) : path(path_) { const char* begin = path.data(); diff --git a/be/src/vec/json/path_in_data.h b/be/src/vec/json/path_in_data.h index 299bb8500c3ebf..5118409e53c187 100644 --- a/be/src/vec/json/path_in_data.h +++ b/be/src/vec/json/path_in_data.h @@ -22,6 +22,7 @@ #include #include + #include "vec/core/field.h" #include "vec/core/types.h" namespace doris::vectorized { diff --git a/be/src/vec/json/simd_json_parser.h b/be/src/vec/json/simd_json_parser.h index dbc67f9baa8655..39918d3f512ca9 100644 --- a/be/src/vec/json/simd_json_parser.h +++ b/be/src/vec/json/simd_json_parser.h @@ -20,95 +20,141 @@ #pragma once -#include #include -#include #include +#include namespace doris::vectorized { /// This class can be used as an argument for the template class FunctionJSON. /// It provides ability to parse JSONs using simdjson library. -struct SimdJSONParser -{ +struct SimdJSONParser { class Array; class Object; /// References an element in a JSON document, representing a JSON null, boolean, string, number, /// array or object. - class Element - { + class Element { public: ALWAYS_INLINE Element() {} /// NOLINT - ALWAYS_INLINE Element(const simdjson::dom::element & element_) : element(element_) {} /// NOLINT - ALWAYS_INLINE bool isInt64() const { return element.type() == simdjson::dom::element_type::INT64; } - ALWAYS_INLINE bool isUInt64() const { return element.type() == simdjson::dom::element_type::UINT64; } - ALWAYS_INLINE bool isDouble() const { return element.type() == simdjson::dom::element_type::DOUBLE; } - ALWAYS_INLINE bool isString() const { return element.type() == simdjson::dom::element_type::STRING; } - ALWAYS_INLINE bool isArray() const { return element.type() == simdjson::dom::element_type::ARRAY; } - ALWAYS_INLINE bool isObject() const { return element.type() == simdjson::dom::element_type::OBJECT; } - ALWAYS_INLINE bool isBool() const { return element.type() == simdjson::dom::element_type::BOOL; } - ALWAYS_INLINE bool isNull() const { return element.type() == simdjson::dom::element_type::NULL_VALUE; } + ALWAYS_INLINE Element(const simdjson::dom::element& element_) + : element(element_) {} /// NOLINT + ALWAYS_INLINE bool isInt64() const { + return element.type() == simdjson::dom::element_type::INT64; + } + ALWAYS_INLINE bool isUInt64() const { + return element.type() == simdjson::dom::element_type::UINT64; + } + ALWAYS_INLINE bool isDouble() const { + return element.type() == simdjson::dom::element_type::DOUBLE; + } + ALWAYS_INLINE bool isString() const { + return element.type() == simdjson::dom::element_type::STRING; + } + ALWAYS_INLINE bool isArray() const { + return element.type() == simdjson::dom::element_type::ARRAY; + } + ALWAYS_INLINE bool isObject() const { + return element.type() == simdjson::dom::element_type::OBJECT; + } + ALWAYS_INLINE bool isBool() const { + return element.type() == simdjson::dom::element_type::BOOL; + } + ALWAYS_INLINE bool isNull() const { + return element.type() == simdjson::dom::element_type::NULL_VALUE; + } ALWAYS_INLINE Int64 getInt64() const { return element.get_int64().value_unsafe(); } ALWAYS_INLINE UInt64 getUInt64() const { return element.get_uint64().value_unsafe(); } ALWAYS_INLINE double getDouble() const { return element.get_double().value_unsafe(); } ALWAYS_INLINE bool getBool() const { return element.get_bool().value_unsafe(); } - ALWAYS_INLINE std::string_view getString() const { return element.get_string().value_unsafe(); } + ALWAYS_INLINE std::string_view getString() const { + return element.get_string().value_unsafe(); + } ALWAYS_INLINE Array getArray() const; ALWAYS_INLINE Object getObject() const; ALWAYS_INLINE simdjson::dom::element getElement() const { return element; } + private: simdjson::dom::element element; }; /// References an array in a JSON document. - class Array - { + class Array { public: - class Iterator - { + class Iterator { public: - ALWAYS_INLINE Iterator(const simdjson::dom::array::iterator & it_) : it(it_) {} /// NOLINT + ALWAYS_INLINE Iterator(const simdjson::dom::array::iterator& it_) + : it(it_) {} /// NOLINT ALWAYS_INLINE Element operator*() const { return *it; } - ALWAYS_INLINE Iterator & operator++() { ++it; return *this; } - ALWAYS_INLINE Iterator operator++(int) { auto res = *this; ++it; return res; } /// NOLINT - ALWAYS_INLINE friend bool operator!=(const Iterator & left, const Iterator & right) { return left.it != right.it; } - ALWAYS_INLINE friend bool operator==(const Iterator & left, const Iterator & right) { return !(left != right); } + ALWAYS_INLINE Iterator& operator++() { + ++it; + return *this; + } + ALWAYS_INLINE Iterator operator++(int) { + auto res = *this; + ++it; + return res; + } /// NOLINT + ALWAYS_INLINE friend bool operator!=(const Iterator& left, const Iterator& right) { + return left.it != right.it; + } + ALWAYS_INLINE friend bool operator==(const Iterator& left, const Iterator& right) { + return !(left != right); + } + private: simdjson::dom::array::iterator it; }; - ALWAYS_INLINE Array(const simdjson::dom::array & array_) : array(array_) {} /// NOLINT + ALWAYS_INLINE Array(const simdjson::dom::array& array_) : array(array_) {} /// NOLINT ALWAYS_INLINE Iterator begin() const { return array.begin(); } ALWAYS_INLINE Iterator end() const { return array.end(); } ALWAYS_INLINE size_t size() const { return array.size(); } - ALWAYS_INLINE Element operator[](size_t index) const { assert(index < size()); return array.at(index).value_unsafe(); } + ALWAYS_INLINE Element operator[](size_t index) const { + assert(index < size()); + return array.at(index).value_unsafe(); + } + private: simdjson::dom::array array; }; using KeyValuePair = std::pair; /// References an object in a JSON document. - class Object - { + class Object { public: - class Iterator - { + class Iterator { public: - ALWAYS_INLINE Iterator(const simdjson::dom::object::iterator & it_) : it(it_) {} /// NOLINT - ALWAYS_INLINE KeyValuePair operator*() const { const auto & res = *it; return {res.key, res.value}; } - ALWAYS_INLINE Iterator & operator++() { ++it; return *this; } - ALWAYS_INLINE Iterator operator++(int) { auto res = *this; ++it; return res; } /// NOLINT - ALWAYS_INLINE friend bool operator!=(const Iterator & left, const Iterator & right) { return left.it != right.it; } - ALWAYS_INLINE friend bool operator==(const Iterator & left, const Iterator & right) { return !(left != right); } + ALWAYS_INLINE Iterator(const simdjson::dom::object::iterator& it_) + : it(it_) {} /// NOLINT + ALWAYS_INLINE KeyValuePair operator*() const { + const auto& res = *it; + return {res.key, res.value}; + } + ALWAYS_INLINE Iterator& operator++() { + ++it; + return *this; + } + ALWAYS_INLINE Iterator operator++(int) { + auto res = *this; + ++it; + return res; + } /// NOLINT + ALWAYS_INLINE friend bool operator!=(const Iterator& left, const Iterator& right) { + return left.it != right.it; + } + ALWAYS_INLINE friend bool operator==(const Iterator& left, const Iterator& right) { + return !(left != right); + } + private: simdjson::dom::object::iterator it; }; - ALWAYS_INLINE Object(const simdjson::dom::object & object_) : object(object_) {} /// NOLINT + ALWAYS_INLINE Object(const simdjson::dom::object& object_) : object(object_) {} /// NOLINT ALWAYS_INLINE Iterator begin() const { return object.begin(); } ALWAYS_INLINE Iterator end() const { return object.end(); } ALWAYS_INLINE size_t size() const { return object.size(); } - bool find(const PathInData & path, Element & result) const { + bool find(const PathInData& path, Element& result) const { size_t idx = 0; auto obj = object; simdjson::simdjson_result x; - for(const auto& part : path.get_parts()) { + for (const auto& part : path.get_parts()) { ++idx; x = obj.at_key(part.key); if (x.error()) { @@ -125,52 +171,46 @@ struct SimdJSONParser result = x.value_unsafe(); return true; } - bool find(const std::string_view & key, Element & result) const - { + bool find(const std::string_view& key, Element& result) const { auto x = object.at_key(key); - if (x.error()) - return false; + if (x.error()) return false; result = x.value_unsafe(); return true; } /// Optional: Provides access to an object's element by index. - KeyValuePair operator[](size_t index) const - { + KeyValuePair operator[](size_t index) const { assert(index < size()); auto it = object.begin(); - while (index--) - ++it; - const auto & res = *it; + while (index--) ++it; + const auto& res = *it; return {res.key, res.value}; } + private: simdjson::dom::object object; }; /// Parses a JSON document, returns the reference to its root element if succeeded. - bool parse(const std::string_view & json, Element & result) - { + bool parse(const std::string_view& json, Element& result) { auto document = parser.parse(json.data(), json.size()); - if (document.error()) - return false; + if (document.error()) return false; result = document.value_unsafe(); return true; } /// Optional: Allocates memory to parse JSON documents faster. - void reserve(size_t max_size) - { + void reserve(size_t max_size) { if (parser.allocate(max_size) != simdjson::error_code::SUCCESS) { - LOG(FATAL) << "Couldn't allocate " + std::to_string(max_size) + " bytes when parsing JSON"; + LOG(FATAL) << "Couldn't allocate " + std::to_string(max_size) + + " bytes when parsing JSON"; } } + private: simdjson::dom::parser parser; }; -inline ALWAYS_INLINE SimdJSONParser::Array SimdJSONParser::Element::getArray() const -{ +inline ALWAYS_INLINE SimdJSONParser::Array SimdJSONParser::Element::getArray() const { return element.get_array().value_unsafe(); } -inline ALWAYS_INLINE SimdJSONParser::Object SimdJSONParser::Element::getObject() const -{ +inline ALWAYS_INLINE SimdJSONParser::Object SimdJSONParser::Element::getObject() const { return element.get_object().value_unsafe(); } diff --git a/be/src/vec/olap/olap_data_convertor.h b/be/src/vec/olap/olap_data_convertor.h index 1b736966979e5a..d6c65cc294f553 100644 --- a/be/src/vec/olap/olap_data_convertor.h +++ b/be/src/vec/olap/olap_data_convertor.h @@ -56,6 +56,7 @@ class OlapBlockDataConvertor { std::pair convert_column_data(size_t cid); void add_column_data_convertor(const TabletColumn& column); + bool empty() const { return _convertors.empty(); } void reserve(size_t size) { _convertors.reserve(size); } private: From 56190cc091882140f322ccdcf87f72b02de10a19 Mon Sep 17 00:00:00 2001 From: eldenmoon <15605149486@163.com> Date: Mon, 5 Sep 2022 19:37:17 +0800 Subject: [PATCH 05/30] [feature-dynamic-table](column) support get_indices_of_non_default_rows and create_with_offsets in Column --- be/src/vec/columns/column.cpp | 25 ++++++++++++++++ be/src/vec/columns/column.h | 22 +++++++++++++- be/src/vec/columns/column_array.cpp | 31 +++++++++++++++++++ be/src/vec/columns/column_array.h | 7 ++++- be/src/vec/columns/column_complex.h | 7 +++++ be/src/vec/columns/column_const.cpp | 19 ++++++++++++ be/src/vec/columns/column_const.h | 4 +++ be/src/vec/columns/column_decimal.cpp | 7 +++++ be/src/vec/columns/column_decimal.h | 6 ++++ be/src/vec/columns/column_dictionary.h | 9 ++++++ be/src/vec/columns/column_dummy.h | 11 +++++++ be/src/vec/columns/column_impl.h | 11 +++++++ be/src/vec/columns/column_nullable.cpp | 6 ++++ be/src/vec/columns/column_nullable.h | 5 ++++ be/src/vec/columns/column_string.cpp | 5 ++++ be/src/vec/columns/column_string.h | 10 ++++++- be/src/vec/columns/column_vector.cpp | 7 +++++ be/src/vec/columns/column_vector.h | 6 ++++ be/src/vec/columns/columns_common.h | 39 ++++++++++++++++++++++++ be/src/vec/columns/predicate_column.h | 8 +++++ be/src/vec/common/object_util.cpp | 41 ++------------------------ be/src/vec/common/object_util.h | 5 ---- 22 files changed, 244 insertions(+), 47 deletions(-) diff --git a/be/src/vec/columns/column.cpp b/be/src/vec/columns/column.cpp index 44521cc98c0625..fc98e3bbcee49e 100644 --- a/be/src/vec/columns/column.cpp +++ b/be/src/vec/columns/column.cpp @@ -81,4 +81,29 @@ bool is_column_const(const IColumn& column) { return check_column(column); } +ColumnPtr IColumn::create_with_offsets(const Offsets & offsets, const Field & default_field, + size_t total_rows, size_t shift) const { + if (offsets.size() + shift != size()) { + LOG(FATAL) << fmt::format( + "Incompatible sizes of offsets ({}), shift ({}) and size of column {}", offsets.size(), shift, size()); + } + auto res = clone_empty(); + res->reserve(total_rows); + ssize_t current_offset = -1; + for (size_t i = 0; i < offsets.size(); ++i) + { + ssize_t offsets_diff = static_cast(offsets[i]) - current_offset; + current_offset = offsets[i]; + if (offsets_diff > 1) { + res->insert_many(default_field, offsets_diff - 1); + } + res->insert_from(*this, i + shift); + } + ssize_t offsets_diff = static_cast(total_rows) - current_offset; + if (offsets_diff > 1) { + res->insert_many(default_field, offsets_diff - 1); + } + return res; +} + } // namespace doris::vectorized diff --git a/be/src/vec/columns/column.h b/be/src/vec/columns/column.h index 5916dd672dd0da..0568bb1bcd736d 100644 --- a/be/src/vec/columns/column.h +++ b/be/src/vec/columns/column.h @@ -398,7 +398,7 @@ class IColumn : public COW { /// Creates new column with values column[indexes[:limit]]. If limit is 0, all indexes are used. /// Indexes must be one of the ColumnUInt. For default implementation, see select_index_impl from ColumnsCommon.h - // virtual Ptr index(const IColumn & indexes, size_t limit) const = 0; + virtual Ptr index(const IColumn & indexes, size_t limit) const = 0; /** Compares (*this)[n] and rhs[m]. Column rhs should have the same type. * Returns negative number, 0, or positive number (*this)[n] is less, equal, greater than rhs[m] respectively. @@ -449,6 +449,26 @@ class IColumn : public COW { LOG(FATAL) << "not support"; } + + /// Appends one field multiple times. Can be optimized in inherited classes. + virtual void insert_many(const Field & field, size_t length) { + for (size_t i = 0; i < length; ++i) + insert(field); + } + /// Returns indices of values in column, that not equal to default value of column. + virtual void get_indices_of_non_default_rows(Offsets & indices, size_t from, size_t limit) const = 0; + + template + void get_indices_of_non_default_rows_impl(Offsets & indices, size_t from, size_t limit) const; + + /// Returns column with @total_size elements. + /// In result column values from current column are at positions from @offsets. + /// Other values are filled by @default_value. + /// @shift means how much rows to skip from the beginning of current column. + /// Used to create full column from sparse. + virtual Ptr create_with_offsets(const Offsets & offsets, const Field & default_field, + size_t total_rows, size_t shift) const; + /** Split column to smaller columns. Each value goes to column index, selected by corresponding element of 'selector'. * Selector must contain values from 0 to num_columns - 1. * For default implementation, see scatter_impl. diff --git a/be/src/vec/columns/column_array.cpp b/be/src/vec/columns/column_array.cpp index 4afa62e36d3a1f..67934ea5de854d 100644 --- a/be/src/vec/columns/column_array.cpp +++ b/be/src/vec/columns/column_array.cpp @@ -46,6 +46,37 @@ extern const int TOO_LARGE_ARRAY_SIZE; */ static constexpr size_t max_array_size_as_field = 1000000; +template +ColumnPtr ColumnArray::index_impl(const PaddedPODArray & indexes, size_t limit) const { + assert(limit <= indexes.size()); + if (limit == 0) + return ColumnArray::create(data->clone_empty()); + /// Convert indexes to UInt64 in case of overflow. + auto nested_indexes_column = ColumnUInt64::create(); + PaddedPODArray & nested_indexes = nested_indexes_column->get_data(); + nested_indexes.reserve(get_offsets().back()); + auto res = ColumnArray::create(data->clone_empty()); + Offsets & res_offsets = res->get_offsets(); + res_offsets.resize(limit); + size_t current_offset = 0; + for (size_t i = 0; i < limit; ++i) + { + for (size_t j = 0; j < size_at(indexes[i]); ++j) + nested_indexes.push_back(offset_at(indexes[i]) + j); + current_offset += size_at(indexes[i]); + res_offsets[i] = current_offset; + } + if (current_offset != 0) + res->data = data->index(*nested_indexes_column, current_offset); + return res; +} + +ColumnPtr ColumnArray::index(const IColumn & indexes, size_t limit) const { + return select_index_impl(*this, indexes, limit); +} + +INSTANTIATE_INDEX_IMPL(ColumnArray) + ColumnArray::ColumnArray(MutableColumnPtr&& nested_column, MutableColumnPtr&& offsets_column) : data(std::move(nested_column)), offsets(std::move(offsets_column)) { const ColumnOffsets* offsets_concrete = typeid_cast(offsets.get()); diff --git a/be/src/vec/columns/column_array.h b/be/src/vec/columns/column_array.h index 1b337d7f457a3e..b7dd75a6df7078 100644 --- a/be/src/vec/columns/column_array.h +++ b/be/src/vec/columns/column_array.h @@ -106,7 +106,7 @@ class ColumnArray final : public COWHelper { ColumnPtr filter(const Filter& filt, ssize_t result_size_hint) const override; ColumnPtr permute(const Permutation& perm, size_t limit) const override; //ColumnPtr index(const IColumn & indexes, size_t limit) const; - //template ColumnPtr index_impl(const PaddedPODArray & indexes, size_t limit) const; + template ColumnPtr index_impl(const PaddedPODArray & indexes, size_t limit) const; [[noreturn]] int compare_at(size_t n, size_t m, const IColumn& rhs_, int nan_direction_hint) const override { LOG(FATAL) << "compare_at not implemented"; @@ -185,6 +185,11 @@ class ColumnArray final : public COWHelper { ->get_number_of_dimensions(); /// Every modern C++ compiler optimizes tail recursion. } + void get_indices_of_non_default_rows(Offsets & indices, size_t from, size_t limit) const { + return get_indices_of_non_default_rows_impl(indices, from, limit); + } + + ColumnPtr index(const IColumn & indexes, size_t limit) const override; private: WrappedPtr data; WrappedPtr offsets; diff --git a/be/src/vec/columns/column_complex.h b/be/src/vec/columns/column_complex.h index bc4857a5870c40..7479131cbcb198 100644 --- a/be/src/vec/columns/column_complex.h +++ b/be/src/vec/columns/column_complex.h @@ -126,6 +126,13 @@ class ColumnComplexType final : public COWHelper> LOG(FATAL) << "ColumnComplexType get_data_type not implemeted"; } + void get_indices_of_non_default_rows(IColumn::Offsets & indices, size_t from, size_t limit) const override { + LOG(FATAL) << "get_indices_of_non_default_rows not implemented"; + } + [[noreturn]] ColumnPtr index(const IColumn & indexes, size_t limit) const override { + LOG(FATAL) << "index not implemented"; + } + void reserve(size_t n) override { data.reserve(n); } void resize(size_t n) override { data.resize(n); } diff --git a/be/src/vec/columns/column_const.cpp b/be/src/vec/columns/column_const.cpp index d2cb9ef7e7cffc..314f522114a0e6 100644 --- a/be/src/vec/columns/column_const.cpp +++ b/be/src/vec/columns/column_const.cpp @@ -163,4 +163,23 @@ void ColumnConst::get_permutation(bool /*reverse*/, size_t /*limit*/, int /*nan_ } } +void ColumnConst::get_indices_of_non_default_rows(Offsets & indices, size_t from, size_t limit) const { + if (!data->is_default_at(0)) { + size_t to = limit && from + limit < size() ? from + limit : size(); + indices.reserve(indices.size() + to - from); + for (size_t i = from; i < to; ++i) + indices.push_back(i); + } +} + +ColumnPtr ColumnConst::index(const IColumn & indexes, size_t limit) const { + if (limit == 0) { + limit = indexes.size(); + } + if (indexes.size() < limit) { + LOG(FATAL) << "Size of indexes is less than required " << std::to_string(limit); + } + return ColumnConst::create(data, limit); +} + } // namespace doris::vectorized diff --git a/be/src/vec/columns/column_const.h b/be/src/vec/columns/column_const.h index 4567f2d82ed396..bd3df0abb731f6 100644 --- a/be/src/vec/columns/column_const.h +++ b/be/src/vec/columns/column_const.h @@ -104,6 +104,10 @@ class ColumnConst final : public COWHelper { void insert_default() override { ++s; } void pop_back(size_t n) override { s -= n; } + + void get_indices_of_non_default_rows(Offsets & indices, size_t from, size_t limit) const override; + + ColumnPtr index(const IColumn & indexes, size_t limit) const override; StringRef serialize_value_into_arena(size_t, Arena& arena, char const*& begin) const override { return data->serialize_value_into_arena(0, arena, begin); diff --git a/be/src/vec/columns/column_decimal.cpp b/be/src/vec/columns/column_decimal.cpp index 13902b54a71c03..00a88a1a988b2f 100644 --- a/be/src/vec/columns/column_decimal.cpp +++ b/be/src/vec/columns/column_decimal.cpp @@ -28,6 +28,8 @@ #include "vec/common/sip_hash.h" #include "vec/common/unaligned.h" #include "vec/core/sort_block.h" +#include "vec/columns/column_impl.h" +#include "vec/columns/columns_common.h" template bool decimal_less(T x, T y, doris::vectorized::UInt32 x_scale, doris::vectorized::UInt32 y_scale); @@ -439,6 +441,11 @@ Decimal128I ColumnDecimal::get_scale_multiplier() const { return common::exp10_i128(scale); } +template +ColumnPtr ColumnDecimal::index(const IColumn & indexes, size_t limit) const { + return select_index_impl(*this, indexes, limit); +} + template class ColumnDecimal; template class ColumnDecimal; template class ColumnDecimal; diff --git a/be/src/vec/columns/column_decimal.h b/be/src/vec/columns/column_decimal.h index d38a102e2eef9b..6179f4dcb96eb6 100644 --- a/be/src/vec/columns/column_decimal.h +++ b/be/src/vec/columns/column_decimal.h @@ -189,6 +189,12 @@ class ColumnDecimal final : public COWHelper ColumnPtr index_impl(const PaddedPODArray& indexes, size_t limit) const; + void get_indices_of_non_default_rows(IColumn::Offsets & indices, size_t from, size_t limit) const override { + return this->template get_indices_of_non_default_rows_impl(indices, from, limit); + } + + ColumnPtr index(const IColumn & indexes, size_t limit) const override; + ColumnPtr replicate(const IColumn::Offsets& offsets) const override; void replicate(const uint32_t* counts, size_t target_size, IColumn& column, size_t begin = 0, diff --git a/be/src/vec/columns/column_dictionary.h b/be/src/vec/columns/column_dictionary.h index 539ea1b133442d..4686260c6f9ded 100644 --- a/be/src/vec/columns/column_dictionary.h +++ b/be/src/vec/columns/column_dictionary.h @@ -22,6 +22,7 @@ #include #include "vec/columns/column.h" +#include "vec/common/pod_array.h" #include "vec/columns/column_string.h" #include "vec/columns/predicate_column.h" #include "vec/common/string_ref.h" @@ -158,6 +159,10 @@ class ColumnDictionary final : public COWHelper> { bool is_fixed_and_contiguous() const override { return true; } + void get_indices_of_non_default_rows(IColumn::Offsets & indices, size_t from, size_t limit) const override { + LOG(FATAL) << "get_indices_of_non_default_rows not supported in ColumnDictionary"; + } + size_t size_of_value_if_fixed() const override { return sizeof(T); } [[noreturn]] StringRef get_raw_data() const override { @@ -191,6 +196,10 @@ class ColumnDictionary final : public COWHelper> { LOG(FATAL) << "append_data_by_selector is not supported in ColumnDictionary!"; } + [[noreturn]] ColumnPtr index(const IColumn & indexes, size_t limit) const override { + LOG(FATAL) << "index not implemented"; + } + Status filter_by_selector(const uint16_t* sel, size_t sel_size, IColumn* col_ptr) override { auto* res_col = reinterpret_cast(col_ptr); StringRef strings[sel_size]; diff --git a/be/src/vec/columns/column_dummy.h b/be/src/vec/columns/column_dummy.h index 9447b0841d7fb5..bd4ff7858c8fbe 100644 --- a/be/src/vec/columns/column_dummy.h +++ b/be/src/vec/columns/column_dummy.h @@ -155,6 +155,17 @@ class IColumnDummy : public IColumn { LOG(FATAL) << "should not call the method in column dummy"; } + void get_indices_of_non_default_rows(Offsets &, size_t, size_t) const override { + LOG(FATAL) << "should not call the method in column dummy"; + } + + ColumnPtr index(const IColumn & indexes, size_t limit) const override { + if (indexes.size() < limit) { + LOG(FATAL) << "Size of indexes is less than required."; + } + return clone_dummy(limit ? limit : s); + } + protected: size_t s; }; diff --git a/be/src/vec/columns/column_impl.h b/be/src/vec/columns/column_impl.h index 215eee711ef498..89e7019e1afcd9 100644 --- a/be/src/vec/columns/column_impl.h +++ b/be/src/vec/columns/column_impl.h @@ -74,4 +74,15 @@ void IColumn::append_data_by_selector_impl(MutablePtr& res, const Selector& sele static_cast(*res).insert_from(*this, selector[i]); } +void IColumn::get_indices_of_non_default_rows_impl(Offsets & indices, + size_t from, size_t limit) const { + size_t to = limit && from + limit < size() ? from + limit : size(); + indices.reserve(indices.size() + to - from); + for (size_t i = from; i < to; ++i) + { + if (!static_cast(*this).is_default_at(i)) + indices.push_back(i); + } +} + } // namespace doris::vectorized diff --git a/be/src/vec/columns/column_nullable.cpp b/be/src/vec/columns/column_nullable.cpp index 7233d2612f2621..9f60f0b05dfab1 100644 --- a/be/src/vec/columns/column_nullable.cpp +++ b/be/src/vec/columns/column_nullable.cpp @@ -620,4 +620,10 @@ ColumnPtr remove_nullable(const ColumnPtr& column) { return column; } +ColumnPtr ColumnNullable::index(const IColumn & indexes, size_t limit) const { + ColumnPtr indexed_data = get_nested_column().index(indexes, limit); + ColumnPtr indexed_null_map = get_null_map_column().index(indexes, limit); + return ColumnNullable::create(indexed_data, indexed_null_map); +} + } // namespace doris::vectorized diff --git a/be/src/vec/columns/column_nullable.h b/be/src/vec/columns/column_nullable.h index 6c4744e79ff652..cc1a88b4bacb1f 100644 --- a/be/src/vec/columns/column_nullable.h +++ b/be/src/vec/columns/column_nullable.h @@ -324,6 +324,11 @@ class ColumnNullable final : public COWHelper { std::pair get_rowset_segment_id() const override { return nested_column->get_rowset_segment_id(); } + void get_indices_of_non_default_rows(Offsets & indices, size_t from, size_t limit) const override { + get_indices_of_non_default_rows_impl(indices, from, limit); + } + + ColumnPtr index(const IColumn & indexes, size_t limit) const override; private: // the two functions will not update `_need_update_has_null` diff --git a/be/src/vec/columns/column_string.cpp b/be/src/vec/columns/column_string.cpp index 0c0447c3417059..7759ac5abfb3ba 100644 --- a/be/src/vec/columns/column_string.cpp +++ b/be/src/vec/columns/column_string.cpp @@ -26,6 +26,7 @@ #include "vec/common/memcmp_small.h" #include "vec/common/unaligned.h" #include "vec/core/sort_block.h" +#include "vec/columns/column_impl.h" namespace doris::vectorized { @@ -520,4 +521,8 @@ void ColumnString::compare_internal(size_t rhs_row_id, const IColumn& rhs, int n } } +ColumnPtr ColumnString::index(const IColumn & indexes, size_t limit) const { + return select_index_impl(*this, indexes, limit); +} + } // namespace doris::vectorized diff --git a/be/src/vec/columns/column_string.h b/be/src/vec/columns/column_string.h index 075125e8c41a10..b7563c55bd1fb8 100644 --- a/be/src/vec/columns/column_string.h +++ b/be/src/vec/columns/column_string.h @@ -482,7 +482,15 @@ class ColumnString final : public COWHelper { return shrinked_column; } - TypeIndex get_data_type() const override { return TypeIndex::String; } + TypeIndex get_data_type() const override { + return TypeIndex::String; + } + + void get_indices_of_non_default_rows(Offsets & indices, size_t from, size_t limit) const override { + return get_indices_of_non_default_rows_impl(indices, from, limit); + } + + ColumnPtr index(const IColumn & indexes, size_t limit) const override; }; } // namespace doris::vectorized diff --git a/be/src/vec/columns/column_vector.cpp b/be/src/vec/columns/column_vector.cpp index 8e4bcfb5df2b64..a059c92791a23f 100644 --- a/be/src/vec/columns/column_vector.cpp +++ b/be/src/vec/columns/column_vector.cpp @@ -36,6 +36,8 @@ #include "vec/common/sip_hash.h" #include "vec/common/unaligned.h" #include "vec/core/sort_block.h" +#include "vec/columns/column_impl.h" +#include "vec/columns/columns_common.h" namespace doris::vectorized { @@ -547,6 +549,11 @@ void ColumnVector::get_extremes(Field& min, Field& max) const { max = NearestFieldType(cur_max); } +template +ColumnPtr ColumnVector::index(const IColumn & indexes, size_t limit) const { + return select_index_impl(*this, indexes, limit); +} + /// Explicit template instantiations - to avoid code bloat in headers. template class ColumnVector; template class ColumnVector; diff --git a/be/src/vec/columns/column_vector.h b/be/src/vec/columns/column_vector.h index d3849eb3c56ca0..0659a209a98a0d 100644 --- a/be/src/vec/columns/column_vector.h +++ b/be/src/vec/columns/column_vector.h @@ -418,4 +418,10 @@ ColumnPtr ColumnVector::index_impl(const PaddedPODArray& indexes, size_ return res; } +void get_indices_of_non_default_rows(IColumn::Offsets & indices, size_t from, size_t limit) const override { + return this->template get_indices_of_non_default_rows_impl(indices, from, limit); +} + +ColumnPtr index(const IColumn & indexes, size_t limit) const override; + } // namespace doris::vectorized diff --git a/be/src/vec/columns/columns_common.h b/be/src/vec/columns/columns_common.h index 7308816005c95b..93e36a5d895287 100644 --- a/be/src/vec/columns/columns_common.h +++ b/be/src/vec/columns/columns_common.h @@ -51,4 +51,43 @@ void filter_arrays_impl_only_data(const PaddedPODArray& src_elems, PaddedPODArray& res_elems, const IColumn::Filter& filt, ssize_t result_size_hint); +namespace detail { +template +const PaddedPODArray* get_indexes_data(const IColumn& indexes); +} + +/// Check limit <= indexes->size() and call column.index_impl(const PaddedPodArray & indexes, UInt64 limit). +template +ColumnPtr select_index_impl(const Column& column, const IColumn& indexes, size_t limit) { + if (limit == 0) limit = indexes.size(); + + if (indexes.size() < limit) { + LOG(FATAL) << "Size of indexes is less than required."; + } + + if (auto* data_uint8 = detail::get_indexes_data(indexes)) + return column.template index_impl(*data_uint8, limit); + else if (auto* data_uint16 = detail::get_indexes_data(indexes)) + return column.template index_impl(*data_uint16, limit); + else if (auto* data_uint32 = detail::get_indexes_data(indexes)) + return column.template index_impl(*data_uint32, limit); + else if (auto* data_uint64 = detail::get_indexes_data(indexes)) + return column.template index_impl(*data_uint64, limit); + else { + LOG(FATAL) << "Indexes column for IColumn::select must be ColumnUInt, got" + << indexes.get_name(); + return nullptr; + } +} + +#define INSTANTIATE_INDEX_IMPL(Column) \ + template ColumnPtr Column::index_impl(const PaddedPODArray& indexes, \ + size_t limit) const; \ + template ColumnPtr Column::index_impl(const PaddedPODArray& indexes, \ + size_t limit) const; \ + template ColumnPtr Column::index_impl(const PaddedPODArray& indexes, \ + size_t limit) const; \ + template ColumnPtr Column::index_impl(const PaddedPODArray& indexes, \ + size_t limit) const; + } // namespace doris::vectorized diff --git a/be/src/vec/columns/predicate_column.h b/be/src/vec/columns/predicate_column.h index 16b832cc334bca..88b893c35ea949 100644 --- a/be/src/vec/columns/predicate_column.h +++ b/be/src/vec/columns/predicate_column.h @@ -186,6 +186,14 @@ class PredicateColumnType final : public COWHelperis_nullable()) { - const auto& real_type = static_cast(*data_type); - column->set_is_nullable(true); - convert_to_tablet_column(real_type.get_nested_type(), column); - return; - } - column->set_index_length(-1); - column->set_is_key(false); - column->set_type(get_field_type(data_type.get())); - if (data_type->get_type_id() == TypeIndex::Array) { - TabletColumn children; - convert_to_tablet_column( - assert_cast(data_type.get())->get_nested_type(), &children); - column->add_sub_column(children); - return; - } - if (data_type->get_type_id() == TypeIndex::Tuple) { - auto tuple_type = assert_cast(data_type.get()); - DCHECK_EQ(tuple_type->get_elements().size(), tuple_type->get_element_names().size()); - for (size_t i = 0; i < tuple_type->get_elements().size(); ++i) { - TabletColumn children; - convert_to_tablet_column(tuple_type->get_element(i), &children); - children.set_name(tuple_type->get_name_by_position(i)); - column->add_sub_column(children); - } - return; - } - if (data_type->get_type_id() == TypeIndex::String) { - return; - } - if (WhichDataType(*data_type).is_simple()) { - column->set_length(data_type->get_size_of_value_in_memory()); - return; - } -} - -Status parse_object_column(ColumnObject& dest, const IColumn& src, bool need_finalize, - const int* row_begin, const int* row_end) { +Status parse_object_column(ColumnObject& dest, const IColumn& src, + bool need_finalize, const int* row_begin, const int* row_end) { assert(src.is_column_string()); const ColumnString* parsing_column {nullptr}; if (!src.is_nullable()) { diff --git a/be/src/vec/common/object_util.h b/be/src/vec/common/object_util.h index 7bd6b5a632903e..d0f466821b0c32 100644 --- a/be/src/vec/common/object_util.h +++ b/be/src/vec/common/object_util.h @@ -73,11 +73,6 @@ std::pair unflatten_tuple(const PathsInData& paths, // None nested type FieldType get_field_type(const IDataType* data_type); -// NOTICE: output column only used for generating none key anounymous column writer -// eg. We use this to generate variant type column which we converted to tuple for -// convenience - -void convert_to_tablet_column(const DataTypePtr& data_type, TabletColumn* column); // NOTICE: the last column must be dynamic column // 1. The dynamic column will be parsed to ColumnObject and the parsed column will From 903150acf7ff2b214a57a71be3cbd23df9964520 Mon Sep 17 00:00:00 2001 From: Kang Date: Mon, 23 May 2022 11:58:12 +0800 Subject: [PATCH 06/30] [feature-dynamic-table](syntax) support dynamic table syntax --- be/src/olap/tablet_meta.cpp | 5 + be/src/olap/tablet_schema.cpp | 2 + be/src/olap/tablet_schema.h | 2 + be/src/vec/columns/column.cpp | 10 +- be/src/vec/columns/column.h | 17 +- be/src/vec/columns/column_array.cpp | 17 +- be/src/vec/columns/column_array.h | 8 +- be/src/vec/columns/column_complex.h | 5 +- be/src/vec/columns/column_const.cpp | 8 +- be/src/vec/columns/column_const.h | 7 +- be/src/vec/columns/column_decimal.cpp | 4 +- be/src/vec/columns/column_decimal.h | 5 +- be/src/vec/columns/column_dictionary.h | 9 +- be/src/vec/columns/column_dummy.h | 4 +- be/src/vec/columns/column_impl.h | 6 +- be/src/vec/columns/column_nullable.cpp | 2 +- be/src/vec/columns/column_nullable.h | 2 +- be/src/vec/columns/column_string.cpp | 5 + be/src/vec/columns/column_string.h | 9 +- be/src/vec/columns/column_vector.cpp | 4 +- be/src/vec/columns/column_vector.h | 5 +- be/src/vec/columns/columns_common.h | 10 +- be/src/vec/columns/predicate_column.h | 5 +- be/src/vec/common/object_util.cpp | 4 +- .../java/org/apache/doris/catalog/Type.java | 1 + fe/fe-core/src/main/cup/sql_parser.cup | 28 +- .../org/apache/doris/alter/RollupJobV2.java | 3 +- .../apache/doris/alter/SchemaChangeJobV2.java | 3 +- .../doris/analysis/CreateTableStmt.java | 14 +- .../org/apache/doris/backup/RestoreJob.java | 3 +- .../org/apache/doris/catalog/OlapTable.java | 16 + .../apache/doris/catalog/PrimitiveType.java | 1174 +++++++++++++++++ .../apache/doris/catalog/TableProperty.java | 12 + .../org/apache/doris/catalog/VariantType.java | 7 +- .../doris/common/util/PropertyAnalyzer.java | 1 + .../doris/datasource/InternalCatalog.java | 27 +- .../apache/doris/master/ReportHandler.java | 2 +- .../apache/doris/task/CreateReplicaTask.java | 7 +- .../org/apache/doris/task/AgentTaskTest.java | 2 +- gensrc/proto/olap_file.proto | 1 + gensrc/thrift/AgentService.thrift | 1 + 41 files changed, 1372 insertions(+), 85 deletions(-) create mode 100644 fe/fe-core/src/main/java/org/apache/doris/catalog/PrimitiveType.java diff --git a/be/src/olap/tablet_meta.cpp b/be/src/olap/tablet_meta.cpp index 25bbf438037023..61bb4bcf56f17d 100644 --- a/be/src/olap/tablet_meta.cpp +++ b/be/src/olap/tablet_meta.cpp @@ -228,6 +228,11 @@ TabletMeta::TabletMeta(int64_t table_id, int64_t partition_id, int64_t tablet_id if (tablet_schema.__isset.disable_auto_compaction) { schema->set_disable_auto_compaction(tablet_schema.disable_auto_compaction); } + + if (tablet_schema.__isset.is_dynamic_schema) { + schema->set_is_dynamic_schema(tablet_schema.is_dynamic_schema); + } + if (tablet_schema.__isset.delete_sign_idx) { schema->set_delete_sign_idx(tablet_schema.delete_sign_idx); } diff --git a/be/src/olap/tablet_schema.cpp b/be/src/olap/tablet_schema.cpp index 423d25eb5e212a..7ceee74f2aa613 100644 --- a/be/src/olap/tablet_schema.cpp +++ b/be/src/olap/tablet_schema.cpp @@ -655,6 +655,7 @@ void TabletSchema::init_from_pb(const TabletSchemaPB& schema) { _is_in_memory = schema.is_in_memory(); _disable_auto_compaction = schema.disable_auto_compaction(); _store_row_column = schema.store_row_column(); + _is_dynamic_schema = schema.is_dynamic_schema(); _delete_sign_idx = schema.delete_sign_idx(); _sequence_col_idx = schema.sequence_col_idx(); _sort_type = schema.sort_type(); @@ -791,6 +792,7 @@ void TabletSchema::to_schema_pb(TabletSchemaPB* tablet_schema_pb) const { tablet_schema_pb->set_sort_col_num(_sort_col_num); tablet_schema_pb->set_schema_version(_schema_version); tablet_schema_pb->set_compression_type(_compression_type); + tablet_schema_pb->set_is_dynamic_schema(_is_dynamic_schema); } size_t TabletSchema::row_size() const { diff --git a/be/src/olap/tablet_schema.h b/be/src/olap/tablet_schema.h index bb9eff25b7dd44..ff53949541684d 100644 --- a/be/src/olap/tablet_schema.h +++ b/be/src/olap/tablet_schema.h @@ -208,6 +208,7 @@ class TabletSchema { bool disable_auto_compaction() const { return _disable_auto_compaction; } void set_store_row_column(bool store_row_column) { _store_row_column = store_row_column; } bool store_row_column() const { return _store_row_column; } + bool is_dynamic_schema() const { return _is_dynamic_schema; } int32_t delete_sign_idx() const { return _delete_sign_idx; } void set_delete_sign_idx(int32_t delete_sign_idx) { _delete_sign_idx = delete_sign_idx; } bool has_sequence_col() const { return _sequence_col_idx != -1; } @@ -275,6 +276,7 @@ class TabletSchema { bool _has_bf_fpp = false; double _bf_fpp = 0; bool _is_in_memory = false; + bool _is_dynamic_schema = false; int32_t _delete_sign_idx = -1; int32_t _sequence_col_idx = -1; int32_t _schema_version = -1; diff --git a/be/src/vec/columns/column.cpp b/be/src/vec/columns/column.cpp index fc98e3bbcee49e..61e4a687bd44b5 100644 --- a/be/src/vec/columns/column.cpp +++ b/be/src/vec/columns/column.cpp @@ -81,17 +81,17 @@ bool is_column_const(const IColumn& column) { return check_column(column); } -ColumnPtr IColumn::create_with_offsets(const Offsets & offsets, const Field & default_field, - size_t total_rows, size_t shift) const { +ColumnPtr IColumn::create_with_offsets(const Offsets& offsets, const Field& default_field, + size_t total_rows, size_t shift) const { if (offsets.size() + shift != size()) { LOG(FATAL) << fmt::format( - "Incompatible sizes of offsets ({}), shift ({}) and size of column {}", offsets.size(), shift, size()); + "Incompatible sizes of offsets ({}), shift ({}) and size of column {}", + offsets.size(), shift, size()); } auto res = clone_empty(); res->reserve(total_rows); ssize_t current_offset = -1; - for (size_t i = 0; i < offsets.size(); ++i) - { + for (size_t i = 0; i < offsets.size(); ++i) { ssize_t offsets_diff = static_cast(offsets[i]) - current_offset; current_offset = offsets[i]; if (offsets_diff > 1) { diff --git a/be/src/vec/columns/column.h b/be/src/vec/columns/column.h index 0568bb1bcd736d..92d0bfb5f95bfa 100644 --- a/be/src/vec/columns/column.h +++ b/be/src/vec/columns/column.h @@ -398,7 +398,7 @@ class IColumn : public COW { /// Creates new column with values column[indexes[:limit]]. If limit is 0, all indexes are used. /// Indexes must be one of the ColumnUInt. For default implementation, see select_index_impl from ColumnsCommon.h - virtual Ptr index(const IColumn & indexes, size_t limit) const = 0; + virtual Ptr index(const IColumn& indexes, size_t limit) const = 0; /** Compares (*this)[n] and rhs[m]. Column rhs should have the same type. * Returns negative number, 0, or positive number (*this)[n] is less, equal, greater than rhs[m] respectively. @@ -449,25 +449,24 @@ class IColumn : public COW { LOG(FATAL) << "not support"; } - /// Appends one field multiple times. Can be optimized in inherited classes. - virtual void insert_many(const Field & field, size_t length) { - for (size_t i = 0; i < length; ++i) - insert(field); + virtual void insert_many(const Field& field, size_t length) { + for (size_t i = 0; i < length; ++i) insert(field); } /// Returns indices of values in column, that not equal to default value of column. - virtual void get_indices_of_non_default_rows(Offsets & indices, size_t from, size_t limit) const = 0; + virtual void get_indices_of_non_default_rows(Offsets& indices, size_t from, + size_t limit) const = 0; template - void get_indices_of_non_default_rows_impl(Offsets & indices, size_t from, size_t limit) const; + void get_indices_of_non_default_rows_impl(Offsets& indices, size_t from, size_t limit) const; /// Returns column with @total_size elements. /// In result column values from current column are at positions from @offsets. /// Other values are filled by @default_value. /// @shift means how much rows to skip from the beginning of current column. /// Used to create full column from sparse. - virtual Ptr create_with_offsets(const Offsets & offsets, const Field & default_field, - size_t total_rows, size_t shift) const; + virtual Ptr create_with_offsets(const Offsets& offsets, const Field& default_field, + size_t total_rows, size_t shift) const; /** Split column to smaller columns. Each value goes to column index, selected by corresponding element of 'selector'. * Selector must contain values from 0 to num_columns - 1. diff --git a/be/src/vec/columns/column_array.cpp b/be/src/vec/columns/column_array.cpp index 67934ea5de854d..584241bbb58df8 100644 --- a/be/src/vec/columns/column_array.cpp +++ b/be/src/vec/columns/column_array.cpp @@ -47,31 +47,28 @@ extern const int TOO_LARGE_ARRAY_SIZE; static constexpr size_t max_array_size_as_field = 1000000; template -ColumnPtr ColumnArray::index_impl(const PaddedPODArray & indexes, size_t limit) const { +ColumnPtr ColumnArray::index_impl(const PaddedPODArray& indexes, size_t limit) const { assert(limit <= indexes.size()); - if (limit == 0) - return ColumnArray::create(data->clone_empty()); + if (limit == 0) return ColumnArray::create(data->clone_empty()); /// Convert indexes to UInt64 in case of overflow. auto nested_indexes_column = ColumnUInt64::create(); - PaddedPODArray & nested_indexes = nested_indexes_column->get_data(); + PaddedPODArray& nested_indexes = nested_indexes_column->get_data(); nested_indexes.reserve(get_offsets().back()); auto res = ColumnArray::create(data->clone_empty()); - Offsets & res_offsets = res->get_offsets(); + Offsets& res_offsets = res->get_offsets(); res_offsets.resize(limit); size_t current_offset = 0; - for (size_t i = 0; i < limit; ++i) - { + for (size_t i = 0; i < limit; ++i) { for (size_t j = 0; j < size_at(indexes[i]); ++j) nested_indexes.push_back(offset_at(indexes[i]) + j); current_offset += size_at(indexes[i]); res_offsets[i] = current_offset; } - if (current_offset != 0) - res->data = data->index(*nested_indexes_column, current_offset); + if (current_offset != 0) res->data = data->index(*nested_indexes_column, current_offset); return res; } -ColumnPtr ColumnArray::index(const IColumn & indexes, size_t limit) const { +ColumnPtr ColumnArray::index(const IColumn& indexes, size_t limit) const { return select_index_impl(*this, indexes, limit); } diff --git a/be/src/vec/columns/column_array.h b/be/src/vec/columns/column_array.h index b7dd75a6df7078..7db50235878852 100644 --- a/be/src/vec/columns/column_array.h +++ b/be/src/vec/columns/column_array.h @@ -106,7 +106,8 @@ class ColumnArray final : public COWHelper { ColumnPtr filter(const Filter& filt, ssize_t result_size_hint) const override; ColumnPtr permute(const Permutation& perm, size_t limit) const override; //ColumnPtr index(const IColumn & indexes, size_t limit) const; - template ColumnPtr index_impl(const PaddedPODArray & indexes, size_t limit) const; + template + ColumnPtr index_impl(const PaddedPODArray& indexes, size_t limit) const; [[noreturn]] int compare_at(size_t n, size_t m, const IColumn& rhs_, int nan_direction_hint) const override { LOG(FATAL) << "compare_at not implemented"; @@ -185,11 +186,12 @@ class ColumnArray final : public COWHelper { ->get_number_of_dimensions(); /// Every modern C++ compiler optimizes tail recursion. } - void get_indices_of_non_default_rows(Offsets & indices, size_t from, size_t limit) const { + void get_indices_of_non_default_rows(Offsets& indices, size_t from, size_t limit) const { return get_indices_of_non_default_rows_impl(indices, from, limit); } - ColumnPtr index(const IColumn & indexes, size_t limit) const override; + ColumnPtr index(const IColumn& indexes, size_t limit) const override; + private: WrappedPtr data; WrappedPtr offsets; diff --git a/be/src/vec/columns/column_complex.h b/be/src/vec/columns/column_complex.h index 7479131cbcb198..0b30cf45806f55 100644 --- a/be/src/vec/columns/column_complex.h +++ b/be/src/vec/columns/column_complex.h @@ -126,10 +126,11 @@ class ColumnComplexType final : public COWHelper> LOG(FATAL) << "ColumnComplexType get_data_type not implemeted"; } - void get_indices_of_non_default_rows(IColumn::Offsets & indices, size_t from, size_t limit) const override { + void get_indices_of_non_default_rows(IColumn::Offsets& indices, size_t from, + size_t limit) const override { LOG(FATAL) << "get_indices_of_non_default_rows not implemented"; } - [[noreturn]] ColumnPtr index(const IColumn & indexes, size_t limit) const override { + [[noreturn]] ColumnPtr index(const IColumn& indexes, size_t limit) const override { LOG(FATAL) << "index not implemented"; } diff --git a/be/src/vec/columns/column_const.cpp b/be/src/vec/columns/column_const.cpp index 314f522114a0e6..5a0cb18844e387 100644 --- a/be/src/vec/columns/column_const.cpp +++ b/be/src/vec/columns/column_const.cpp @@ -163,16 +163,16 @@ void ColumnConst::get_permutation(bool /*reverse*/, size_t /*limit*/, int /*nan_ } } -void ColumnConst::get_indices_of_non_default_rows(Offsets & indices, size_t from, size_t limit) const { +void ColumnConst::get_indices_of_non_default_rows(Offsets& indices, size_t from, + size_t limit) const { if (!data->is_default_at(0)) { size_t to = limit && from + limit < size() ? from + limit : size(); indices.reserve(indices.size() + to - from); - for (size_t i = from; i < to; ++i) - indices.push_back(i); + for (size_t i = from; i < to; ++i) indices.push_back(i); } } -ColumnPtr ColumnConst::index(const IColumn & indexes, size_t limit) const { +ColumnPtr ColumnConst::index(const IColumn& indexes, size_t limit) const { if (limit == 0) { limit = indexes.size(); } diff --git a/be/src/vec/columns/column_const.h b/be/src/vec/columns/column_const.h index bd3df0abb731f6..59e5a9e94526a3 100644 --- a/be/src/vec/columns/column_const.h +++ b/be/src/vec/columns/column_const.h @@ -104,10 +104,11 @@ class ColumnConst final : public COWHelper { void insert_default() override { ++s; } void pop_back(size_t n) override { s -= n; } - - void get_indices_of_non_default_rows(Offsets & indices, size_t from, size_t limit) const override; - ColumnPtr index(const IColumn & indexes, size_t limit) const override; + void get_indices_of_non_default_rows(Offsets& indices, size_t from, + size_t limit) const override; + + ColumnPtr index(const IColumn& indexes, size_t limit) const override; StringRef serialize_value_into_arena(size_t, Arena& arena, char const*& begin) const override { return data->serialize_value_into_arena(0, arena, begin); diff --git a/be/src/vec/columns/column_decimal.cpp b/be/src/vec/columns/column_decimal.cpp index 00a88a1a988b2f..65e4d57ffc4c10 100644 --- a/be/src/vec/columns/column_decimal.cpp +++ b/be/src/vec/columns/column_decimal.cpp @@ -22,6 +22,8 @@ #include "common/config.h" #include "util/simd/bits.h" +#include "vec/columns/column_impl.h" +#include "vec/columns/columns_common.h" #include "vec/common/arena.h" #include "vec/common/assert_cast.h" #include "vec/common/exception.h" @@ -442,7 +444,7 @@ Decimal128I ColumnDecimal::get_scale_multiplier() const { } template -ColumnPtr ColumnDecimal::index(const IColumn & indexes, size_t limit) const { +ColumnPtr ColumnDecimal::index(const IColumn& indexes, size_t limit) const { return select_index_impl(*this, indexes, limit); } diff --git a/be/src/vec/columns/column_decimal.h b/be/src/vec/columns/column_decimal.h index 6179f4dcb96eb6..7a5f4e4221ccd9 100644 --- a/be/src/vec/columns/column_decimal.h +++ b/be/src/vec/columns/column_decimal.h @@ -189,11 +189,12 @@ class ColumnDecimal final : public COWHelper ColumnPtr index_impl(const PaddedPODArray& indexes, size_t limit) const; - void get_indices_of_non_default_rows(IColumn::Offsets & indices, size_t from, size_t limit) const override { + void get_indices_of_non_default_rows(IColumn::Offsets& indices, size_t from, + size_t limit) const override { return this->template get_indices_of_non_default_rows_impl(indices, from, limit); } - ColumnPtr index(const IColumn & indexes, size_t limit) const override; + ColumnPtr index(const IColumn& indexes, size_t limit) const override; ColumnPtr replicate(const IColumn::Offsets& offsets) const override; diff --git a/be/src/vec/columns/column_dictionary.h b/be/src/vec/columns/column_dictionary.h index 4686260c6f9ded..4a770c1bf7ef32 100644 --- a/be/src/vec/columns/column_dictionary.h +++ b/be/src/vec/columns/column_dictionary.h @@ -22,10 +22,10 @@ #include #include "vec/columns/column.h" -#include "vec/common/pod_array.h" #include "vec/columns/column_string.h" #include "vec/columns/predicate_column.h" #include "vec/common/string_ref.h" +#include "vec/common/pod_array.h" #include "vec/core/types.h" namespace doris::vectorized { @@ -159,7 +159,8 @@ class ColumnDictionary final : public COWHelper> { bool is_fixed_and_contiguous() const override { return true; } - void get_indices_of_non_default_rows(IColumn::Offsets & indices, size_t from, size_t limit) const override { + void get_indices_of_non_default_rows(IColumn::Offsets& indices, size_t from, + size_t limit) const override { LOG(FATAL) << "get_indices_of_non_default_rows not supported in ColumnDictionary"; } @@ -191,12 +192,16 @@ class ColumnDictionary final : public COWHelper> { LOG(FATAL) << "scatter not supported in ColumnDictionary"; } +<<<<<<< HEAD void append_data_by_selector(MutableColumnPtr& res, const IColumn::Selector& selector) const override { LOG(FATAL) << "append_data_by_selector is not supported in ColumnDictionary!"; } [[noreturn]] ColumnPtr index(const IColumn & indexes, size_t limit) const override { +======= + [[noreturn]] ColumnPtr index(const IColumn& indexes, size_t limit) const override { +>>>>>>> 2d251009b8 ([feature-dynamic-table](syntax) support dynamic table syntax) LOG(FATAL) << "index not implemented"; } diff --git a/be/src/vec/columns/column_dummy.h b/be/src/vec/columns/column_dummy.h index bd4ff7858c8fbe..69a75f479bae44 100644 --- a/be/src/vec/columns/column_dummy.h +++ b/be/src/vec/columns/column_dummy.h @@ -155,11 +155,11 @@ class IColumnDummy : public IColumn { LOG(FATAL) << "should not call the method in column dummy"; } - void get_indices_of_non_default_rows(Offsets &, size_t, size_t) const override { + void get_indices_of_non_default_rows(Offsets&, size_t, size_t) const override { LOG(FATAL) << "should not call the method in column dummy"; } - ColumnPtr index(const IColumn & indexes, size_t limit) const override { + ColumnPtr index(const IColumn& indexes, size_t limit) const override { if (indexes.size() < limit) { LOG(FATAL) << "Size of indexes is less than required."; } diff --git a/be/src/vec/columns/column_impl.h b/be/src/vec/columns/column_impl.h index 89e7019e1afcd9..4f068aa64603fb 100644 --- a/be/src/vec/columns/column_impl.h +++ b/be/src/vec/columns/column_impl.h @@ -78,10 +78,8 @@ void IColumn::get_indices_of_non_default_rows_impl(Offsets & indices, size_t from, size_t limit) const { size_t to = limit && from + limit < size() ? from + limit : size(); indices.reserve(indices.size() + to - from); - for (size_t i = from; i < to; ++i) - { - if (!static_cast(*this).is_default_at(i)) - indices.push_back(i); + for (size_t i = from; i < to; ++i) { + if (!static_cast(*this).is_default_at(i)) indices.push_back(i); } } diff --git a/be/src/vec/columns/column_nullable.cpp b/be/src/vec/columns/column_nullable.cpp index 9f60f0b05dfab1..5ec9f43571d8fb 100644 --- a/be/src/vec/columns/column_nullable.cpp +++ b/be/src/vec/columns/column_nullable.cpp @@ -620,7 +620,7 @@ ColumnPtr remove_nullable(const ColumnPtr& column) { return column; } -ColumnPtr ColumnNullable::index(const IColumn & indexes, size_t limit) const { +ColumnPtr ColumnNullable::index(const IColumn& indexes, size_t limit) const { ColumnPtr indexed_data = get_nested_column().index(indexes, limit); ColumnPtr indexed_null_map = get_null_map_column().index(indexes, limit); return ColumnNullable::create(indexed_data, indexed_null_map); diff --git a/be/src/vec/columns/column_nullable.h b/be/src/vec/columns/column_nullable.h index cc1a88b4bacb1f..b8afb7b49e890b 100644 --- a/be/src/vec/columns/column_nullable.h +++ b/be/src/vec/columns/column_nullable.h @@ -328,7 +328,7 @@ class ColumnNullable final : public COWHelper { get_indices_of_non_default_rows_impl(indices, from, limit); } - ColumnPtr index(const IColumn & indexes, size_t limit) const override; + ColumnPtr index(const IColumn& indexes, size_t limit) const override; private: // the two functions will not update `_need_update_has_null` diff --git a/be/src/vec/columns/column_string.cpp b/be/src/vec/columns/column_string.cpp index 7759ac5abfb3ba..da15f5a70a5071 100644 --- a/be/src/vec/columns/column_string.cpp +++ b/be/src/vec/columns/column_string.cpp @@ -20,6 +20,7 @@ #include "vec/columns/column_string.h" +#include "vec/columns/column_impl.h" #include "vec/columns/columns_common.h" #include "vec/common/arena.h" #include "vec/common/assert_cast.h" @@ -497,6 +498,7 @@ void ColumnString::protect() { get_offsets().protect(); } +<<<<<<< HEAD void ColumnString::compare_internal(size_t rhs_row_id, const IColumn& rhs, int nan_direction_hint, int direction, std::vector& cmp_res, uint8* __restrict filter) const { @@ -522,6 +524,9 @@ void ColumnString::compare_internal(size_t rhs_row_id, const IColumn& rhs, int n } ColumnPtr ColumnString::index(const IColumn & indexes, size_t limit) const { +======= +ColumnPtr ColumnString::index(const IColumn& indexes, size_t limit) const { +>>>>>>> 2d251009b8 ([feature-dynamic-table](syntax) support dynamic table syntax) return select_index_impl(*this, indexes, limit); } diff --git a/be/src/vec/columns/column_string.h b/be/src/vec/columns/column_string.h index b7563c55bd1fb8..6298b9477d37f8 100644 --- a/be/src/vec/columns/column_string.h +++ b/be/src/vec/columns/column_string.h @@ -482,15 +482,14 @@ class ColumnString final : public COWHelper { return shrinked_column; } - TypeIndex get_data_type() const override { - return TypeIndex::String; - } + TypeIndex get_data_type() const override { return TypeIndex::String; } - void get_indices_of_non_default_rows(Offsets & indices, size_t from, size_t limit) const override { + void get_indices_of_non_default_rows(Offsets& indices, size_t from, + size_t limit) const override { return get_indices_of_non_default_rows_impl(indices, from, limit); } - ColumnPtr index(const IColumn & indexes, size_t limit) const override; + ColumnPtr index(const IColumn& indexes, size_t limit) const override; }; } // namespace doris::vectorized diff --git a/be/src/vec/columns/column_vector.cpp b/be/src/vec/columns/column_vector.cpp index a059c92791a23f..173066e52d06ac 100644 --- a/be/src/vec/columns/column_vector.cpp +++ b/be/src/vec/columns/column_vector.cpp @@ -28,6 +28,8 @@ #include "util/simd/bits.h" #include "util/stack_util.h" +#include "vec/columns/column_impl.h" +#include "vec/columns/columns_common.h" #include "vec/common/arena.h" #include "vec/common/assert_cast.h" #include "vec/common/bit_cast.h" @@ -550,7 +552,7 @@ void ColumnVector::get_extremes(Field& min, Field& max) const { } template -ColumnPtr ColumnVector::index(const IColumn & indexes, size_t limit) const { +ColumnPtr ColumnVector::index(const IColumn& indexes, size_t limit) const { return select_index_impl(*this, indexes, limit); } diff --git a/be/src/vec/columns/column_vector.h b/be/src/vec/columns/column_vector.h index 0659a209a98a0d..a341b2b13014f4 100644 --- a/be/src/vec/columns/column_vector.h +++ b/be/src/vec/columns/column_vector.h @@ -418,10 +418,11 @@ ColumnPtr ColumnVector::index_impl(const PaddedPODArray& indexes, size_ return res; } -void get_indices_of_non_default_rows(IColumn::Offsets & indices, size_t from, size_t limit) const override { +void get_indices_of_non_default_rows(IColumn::Offsets& indices, size_t from, + size_t limit) const override { return this->template get_indices_of_non_default_rows_impl(indices, from, limit); } -ColumnPtr index(const IColumn & indexes, size_t limit) const override; +ColumnPtr index(const IColumn& indexes, size_t limit) const override; } // namespace doris::vectorized diff --git a/be/src/vec/columns/columns_common.h b/be/src/vec/columns/columns_common.h index 93e36a5d895287..cd321199e0de83 100644 --- a/be/src/vec/columns/columns_common.h +++ b/be/src/vec/columns/columns_common.h @@ -80,14 +80,14 @@ ColumnPtr select_index_impl(const Column& column, const IColumn& indexes, size_t } } -#define INSTANTIATE_INDEX_IMPL(Column) \ +#define INSTANTIATE_INDEX_IMPL(Column) \ template ColumnPtr Column::index_impl(const PaddedPODArray& indexes, \ - size_t limit) const; \ + size_t limit) const; \ template ColumnPtr Column::index_impl(const PaddedPODArray& indexes, \ - size_t limit) const; \ + size_t limit) const; \ template ColumnPtr Column::index_impl(const PaddedPODArray& indexes, \ - size_t limit) const; \ + size_t limit) const; \ template ColumnPtr Column::index_impl(const PaddedPODArray& indexes, \ - size_t limit) const; + size_t limit) const; } // namespace doris::vectorized diff --git a/be/src/vec/columns/predicate_column.h b/be/src/vec/columns/predicate_column.h index 88b893c35ea949..e102c459e05085 100644 --- a/be/src/vec/columns/predicate_column.h +++ b/be/src/vec/columns/predicate_column.h @@ -186,11 +186,12 @@ class PredicateColumnType final : public COWHelper integerTypes; diff --git a/fe/fe-core/src/main/cup/sql_parser.cup b/fe/fe-core/src/main/cup/sql_parser.cup index e3383d04afaf51..97784ab613d555 100644 --- a/fe/fe-core/src/main/cup/sql_parser.cup +++ b/fe/fe-core/src/main/cup/sql_parser.cup @@ -1811,6 +1811,19 @@ create_stmt ::= RESULT = new CreateTableStmt(ifNotExists, isExternal, name, columns, engineName, keys, partition, distribution, tblProperties, extProperties, tableComment, index); :} + | KW_CREATE opt_external:isExternal KW_TABLE opt_if_not_exists:ifNotExists table_name:name + LPAREN column_definition_list:columns COMMA DOTDOTDOT RPAREN opt_engine:engineName + opt_keys:keys + opt_comment:tableComment + opt_partition:partition + opt_distribution:distribution + opt_rollup:index + opt_properties:tblProperties + opt_ext_properties:extProperties + {: + RESULT = new CreateTableStmt(ifNotExists, isExternal, name, columns, null, engineName, keys, partition, + distribution, tblProperties, extProperties, tableComment, index, true); + :} | KW_CREATE opt_external:isExternal KW_TABLE opt_if_not_exists:ifNotExists table_name:name LPAREN column_definition_list:columns COMMA index_definition_list:indexes RPAREN opt_engine:engineName opt_keys:keys @@ -1822,7 +1835,20 @@ create_stmt ::= opt_ext_properties:extProperties {: RESULT = new CreateTableStmt(ifNotExists, isExternal, name, columns, indexes, engineName, keys, partition, - distribution, tblProperties, extProperties, tableComment, index); + distribution, tblProperties, extProperties, tableComment, index, false); + :} + | KW_CREATE opt_external:isExternal KW_TABLE opt_if_not_exists:ifNotExists table_name:name + LPAREN column_definition_list:columns COMMA index_definition_list:indexes COMMA DOTDOTDOT RPAREN opt_engine:engineName + opt_keys:keys + opt_comment:tableComment + opt_partition:partition + opt_distribution:distribution + opt_rollup:index + opt_properties:tblProperties + opt_ext_properties:extProperties + {: + RESULT = new CreateTableStmt(ifNotExists, isExternal, name, columns, indexes, engineName, keys, partition, + distribution, tblProperties, extProperties, tableComment, index, true); :} | KW_CREATE opt_external:isExternal KW_TABLE opt_if_not_exists:ifNotExists table_name:name KW_ENGINE EQUAL ident:engineName properties:properties opt_comment:tableComment diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/RollupJobV2.java b/fe/fe-core/src/main/java/org/apache/doris/alter/RollupJobV2.java index b47052c6010ad7..f95425e2f6d1fc 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/alter/RollupJobV2.java +++ b/fe/fe-core/src/main/java/org/apache/doris/alter/RollupJobV2.java @@ -249,7 +249,8 @@ protected void runPendingJob() throws AlterCancelException { tbl.getCompressionType(), tbl.getEnableUniqueKeyMergeOnWrite(), tbl.getStoragePolicy(), tbl.disableAutoCompaction(), - tbl.storeRowColumn()); + tbl.storeRowColumn(), + tbl.isDynamicSchema()); createReplicaTask.setBaseTablet(tabletIdMap.get(rollupTabletId), baseSchemaHash); if (this.storageFormat != null) { createReplicaTask.setStorageFormat(this.storageFormat); diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeJobV2.java b/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeJobV2.java index 6fc5eec06eae90..2af14cea2cb26d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeJobV2.java +++ b/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeJobV2.java @@ -296,7 +296,8 @@ protected void runPendingJob() throws AlterCancelException { tbl.getCompressionType(), tbl.getEnableUniqueKeyMergeOnWrite(), tbl.getStoragePolicy(), tbl.disableAutoCompaction(), - tbl.storeRowColumn()); + tbl.storeRowColumn(), + tbl.isDynamicSchema()); createReplicaTask.setBaseTablet(partitionIndexTabletMap.get(partitionId, shadowIdxId) .get(shadowTabletId), originSchemaHash); diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateTableStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateTableStmt.java index 5e39b4352a6c8b..49d9a37ee11a07 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateTableStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateTableStmt.java @@ -42,6 +42,7 @@ import com.google.common.base.Strings; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import com.google.common.collect.Sets; import org.apache.commons.collections.CollectionUtils; import org.apache.logging.log4j.LogManager; @@ -140,7 +141,7 @@ public CreateTableStmt(boolean ifNotExists, Map extProperties, String comment) { this(ifNotExists, isExternal, tableName, columnDefinitions, null, engineName, keysDesc, partitionDesc, - distributionDesc, properties, extProperties, comment, null); + distributionDesc, properties, extProperties, comment, null, false); } public CreateTableStmt(boolean ifNotExists, @@ -155,7 +156,7 @@ public CreateTableStmt(boolean ifNotExists, Map extProperties, String comment, List ops) { this(ifNotExists, isExternal, tableName, columnDefinitions, null, engineName, keysDesc, partitionDesc, - distributionDesc, properties, extProperties, comment, ops); + distributionDesc, properties, extProperties, comment, ops, false); } public CreateTableStmt(boolean ifNotExists, @@ -169,7 +170,8 @@ public CreateTableStmt(boolean ifNotExists, DistributionDesc distributionDesc, Map properties, Map extProperties, - String comment, List rollupAlterClauseList) { + String comment, List rollupAlterClauseList, + boolean isDynamicSchema) { this.tableName = tableName; if (columnDefinitions == null) { this.columnDefs = Lists.newArrayList(); @@ -186,6 +188,12 @@ public CreateTableStmt(boolean ifNotExists, this.keysDesc = keysDesc; this.partitionDesc = partitionDesc; this.distributionDesc = distributionDesc; + if (isDynamicSchema) { + if (properties == null) { + properties = Maps.newHashMap(); + } + properties.put(PropertyAnalyzer.PROPERTIES_DYNAMIC_SCHEMA, "true"); + } this.properties = properties; this.extProperties = extProperties; this.isExternal = isExternal; diff --git a/fe/fe-core/src/main/java/org/apache/doris/backup/RestoreJob.java b/fe/fe-core/src/main/java/org/apache/doris/backup/RestoreJob.java index 8b894fc9202caa..d374487216637a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/backup/RestoreJob.java +++ b/fe/fe-core/src/main/java/org/apache/doris/backup/RestoreJob.java @@ -1006,7 +1006,8 @@ private void createReplicas(Database db, AgentBatchTask batchTask, OlapTable loc localTbl.getCompressionType(), localTbl.getEnableUniqueKeyMergeOnWrite(), localTbl.getStoragePolicy(), localTbl.disableAutoCompaction(), - localTbl.storeRowColumn()); + localTbl.storeRowColumn(), + localTbl.isDynamicSchema()); task.setInRestoreMode(true); batchTask.addTask(task); diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java index 13c7ae42180960..b6bfa3edb84498 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java @@ -1731,6 +1731,22 @@ public Boolean storeRowColumn() { return false; } + public Boolean isDynamicSchema() { + if (tableProperty != null) { + return tableProperty.isDynamicSchema(); + } + return false; + } + + public void setIsDynamicSchema(boolean isDynamicSchema) { + if (tableProperty == null) { + tableProperty = new TableProperty(new HashMap<>()); + } + tableProperty.modifyTableProperties( + PropertyAnalyzer.PROPERTIES_DYNAMIC_SCHEMA, Boolean.valueOf(isDynamicSchema).toString()); + tableProperty.buildDynamicSchema(); + } + public int getBaseSchemaVersion() { MaterializedIndexMeta baseIndexMeta = indexIdToMeta.get(baseIndexId); return baseIndexMeta.getSchemaVersion(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/PrimitiveType.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/PrimitiveType.java new file mode 100644 index 00000000000000..3bebc9651cd0ec --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/PrimitiveType.java @@ -0,0 +1,1174 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.doris.catalog; + +import org.apache.doris.common.Config; +import org.apache.doris.mysql.MysqlColType; +import org.apache.doris.thrift.TPrimitiveType; + +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.ImmutableSetMultimap; +import com.google.common.collect.Lists; + +import java.util.ArrayList; +import java.util.List; + +public enum PrimitiveType { + INVALID_TYPE("INVALID_TYPE", -1, TPrimitiveType.INVALID_TYPE), + // NULL_TYPE - used only in LiteralPredicate and NullLiteral to make NULLs compatible + // with all other types. + NULL_TYPE("NULL_TYPE", 1, TPrimitiveType.NULL_TYPE), + BOOLEAN("BOOLEAN", 1, TPrimitiveType.BOOLEAN), + TINYINT("TINYINT", 1, TPrimitiveType.TINYINT), + SMALLINT("SMALLINT", 2, TPrimitiveType.SMALLINT), + INT("INT", 4, TPrimitiveType.INT), + BIGINT("BIGINT", 8, TPrimitiveType.BIGINT), + LARGEINT("LARGEINT", 16, TPrimitiveType.LARGEINT), + FLOAT("FLOAT", 4, TPrimitiveType.FLOAT), + DOUBLE("DOUBLE", 8, TPrimitiveType.DOUBLE), + DATE("DATE", 16, TPrimitiveType.DATE), + DATETIME("DATETIME", 16, TPrimitiveType.DATETIME), + // Fixed length char array. + CHAR("CHAR", 16, TPrimitiveType.CHAR), + // 8-byte pointer and 4-byte length indicator (12 bytes total). + // Aligning to 8 bytes so 16 total. + VARCHAR("VARCHAR", 16, TPrimitiveType.VARCHAR), + + DECIMALV2("DECIMALV2", 16, TPrimitiveType.DECIMALV2), + DECIMAL32("DECIMAL32", 4, TPrimitiveType.DECIMAL32), + DECIMAL64("DECIMAL64", 8, TPrimitiveType.DECIMAL64), + DECIMAL128("DECIMAL128", 16, TPrimitiveType.DECIMAL128), + TIME("TIME", 8, TPrimitiveType.TIME), + // these following types are stored as object binary in BE. + HLL("HLL", 16, TPrimitiveType.HLL), + BITMAP("BITMAP", 16, TPrimitiveType.OBJECT), + QUANTILE_STATE("QUANTILE_STATE", 16, TPrimitiveType.QUANTILE_STATE), + DATEV2("DATEV2", 4, TPrimitiveType.DATEV2), + DATETIMEV2("DATETIMEV2", 8, TPrimitiveType.DATETIMEV2), + TIMEV2("TIMEV2", 8, TPrimitiveType.TIMEV2), + + // sizeof(CollectionValue) + ARRAY("ARRAY", 32, TPrimitiveType.ARRAY), + MAP("MAP", 24, TPrimitiveType.MAP), + STRUCT("STRUCT", 24, TPrimitiveType.STRUCT), + VARIANT("VARIANT", 24, TPrimitiveType.VARIANT), + STRING("STRING", 16, TPrimitiveType.STRING), + // Unsupported scalar types. + BINARY("BINARY", -1, TPrimitiveType.BINARY), + ALL("ALL", -1, TPrimitiveType.INVALID_TYPE); + + + private static final int DATE_INDEX_LEN = 3; + private static final int DATEV2_INDEX_LEN = 4; + private static final int DATETIME_INDEX_LEN = 8; + private static final int VARCHAR_INDEX_LEN = 20; + private static final int STRING_INDEX_LEN = 20; + private static final int DECIMAL_INDEX_LEN = 12; + + public static ImmutableSet typeWithPrecision; + + static { + ImmutableSet.Builder builder = ImmutableSet.builder(); + builder.add(DECIMAL32); + builder.add(DECIMAL64); + builder.add(DECIMAL128); + builder.add(DATETIMEV2); + typeWithPrecision = builder.build(); + } + + private static ImmutableSetMultimap implicitCastMap; + + static { + ImmutableSetMultimap.Builder builder = ImmutableSetMultimap.builder(); + // Nulltype + builder.put(NULL_TYPE, BOOLEAN); + builder.put(NULL_TYPE, TINYINT); + builder.put(NULL_TYPE, SMALLINT); + builder.put(NULL_TYPE, INT); + builder.put(NULL_TYPE, BIGINT); + builder.put(NULL_TYPE, LARGEINT); + builder.put(NULL_TYPE, FLOAT); + builder.put(NULL_TYPE, DOUBLE); + builder.put(NULL_TYPE, DATE); + builder.put(NULL_TYPE, DATETIME); + builder.put(NULL_TYPE, DATEV2); + builder.put(NULL_TYPE, DATETIMEV2); + builder.put(NULL_TYPE, DECIMALV2); + builder.put(NULL_TYPE, DECIMAL32); + builder.put(NULL_TYPE, DECIMAL64); + builder.put(NULL_TYPE, DECIMAL128); + builder.put(NULL_TYPE, CHAR); + builder.put(NULL_TYPE, VARCHAR); + builder.put(NULL_TYPE, STRING); + builder.put(NULL_TYPE, BITMAP); //TODO(weixiang):why null type can cast to bitmap? + builder.put(NULL_TYPE, TIME); + builder.put(NULL_TYPE, TIMEV2); + // Boolean + builder.put(BOOLEAN, BOOLEAN); + builder.put(BOOLEAN, TINYINT); + builder.put(BOOLEAN, SMALLINT); + builder.put(BOOLEAN, INT); + builder.put(BOOLEAN, BIGINT); + builder.put(BOOLEAN, LARGEINT); + builder.put(BOOLEAN, FLOAT); + builder.put(BOOLEAN, DOUBLE); + builder.put(BOOLEAN, DATE); + builder.put(BOOLEAN, DATETIME); + builder.put(BOOLEAN, DATEV2); + builder.put(BOOLEAN, DATETIMEV2); + builder.put(BOOLEAN, DECIMALV2); + builder.put(BOOLEAN, DECIMAL32); + builder.put(BOOLEAN, DECIMAL64); + builder.put(BOOLEAN, DECIMAL128); + builder.put(BOOLEAN, VARCHAR); + builder.put(BOOLEAN, STRING); + // Tinyint + builder.put(TINYINT, BOOLEAN); + builder.put(TINYINT, TINYINT); + builder.put(TINYINT, SMALLINT); + builder.put(TINYINT, INT); + builder.put(TINYINT, BIGINT); + builder.put(TINYINT, LARGEINT); + builder.put(TINYINT, FLOAT); + builder.put(TINYINT, DOUBLE); + builder.put(TINYINT, DATE); + builder.put(TINYINT, DATETIME); + builder.put(TINYINT, DATEV2); + builder.put(TINYINT, DATETIMEV2); + builder.put(TINYINT, DECIMALV2); + builder.put(TINYINT, DECIMAL32); + builder.put(TINYINT, DECIMAL64); + builder.put(TINYINT, DECIMAL128); + builder.put(TINYINT, VARCHAR); + builder.put(TINYINT, STRING); + // Smallint + builder.put(SMALLINT, BOOLEAN); + builder.put(SMALLINT, TINYINT); + builder.put(SMALLINT, SMALLINT); + builder.put(SMALLINT, INT); + builder.put(SMALLINT, BIGINT); + builder.put(SMALLINT, LARGEINT); + builder.put(SMALLINT, FLOAT); + builder.put(SMALLINT, DOUBLE); + builder.put(SMALLINT, DATE); + builder.put(SMALLINT, DATETIME); + builder.put(SMALLINT, DATEV2); + builder.put(SMALLINT, DATETIMEV2); + builder.put(SMALLINT, DECIMALV2); + builder.put(SMALLINT, DECIMAL32); + builder.put(SMALLINT, DECIMAL64); + builder.put(SMALLINT, DECIMAL128); + builder.put(SMALLINT, VARCHAR); + builder.put(SMALLINT, STRING); + // Int + builder.put(INT, BOOLEAN); + builder.put(INT, TINYINT); + builder.put(INT, SMALLINT); + builder.put(INT, INT); + builder.put(INT, BIGINT); + builder.put(INT, LARGEINT); + builder.put(INT, FLOAT); + builder.put(INT, DOUBLE); + builder.put(INT, DATE); + builder.put(INT, DATETIME); + builder.put(INT, DATEV2); + builder.put(INT, DATETIMEV2); + builder.put(INT, DECIMALV2); + builder.put(INT, DECIMAL32); + builder.put(INT, DECIMAL64); + builder.put(INT, DECIMAL128); + builder.put(INT, VARCHAR); + builder.put(INT, STRING); + // Bigint + builder.put(BIGINT, BOOLEAN); + builder.put(BIGINT, TINYINT); + builder.put(BIGINT, SMALLINT); + builder.put(BIGINT, INT); + builder.put(BIGINT, BIGINT); + builder.put(BIGINT, LARGEINT); + builder.put(BIGINT, FLOAT); + builder.put(BIGINT, DOUBLE); + builder.put(BIGINT, DATE); + builder.put(BIGINT, DATETIME); + builder.put(BIGINT, DATEV2); + builder.put(BIGINT, DATETIMEV2); + builder.put(BIGINT, DECIMALV2); + builder.put(BIGINT, DECIMAL32); + builder.put(BIGINT, DECIMAL64); + builder.put(BIGINT, DECIMAL128); + builder.put(BIGINT, VARCHAR); + builder.put(BIGINT, STRING); + // Largeint + builder.put(LARGEINT, BOOLEAN); + builder.put(LARGEINT, TINYINT); + builder.put(LARGEINT, SMALLINT); + builder.put(LARGEINT, INT); + builder.put(LARGEINT, BIGINT); + builder.put(LARGEINT, LARGEINT); + builder.put(LARGEINT, FLOAT); + builder.put(LARGEINT, DOUBLE); + builder.put(LARGEINT, DATE); + builder.put(LARGEINT, DATETIME); + builder.put(LARGEINT, DATEV2); + builder.put(LARGEINT, DATETIMEV2); + builder.put(LARGEINT, DECIMALV2); + builder.put(LARGEINT, DECIMAL32); + builder.put(LARGEINT, DECIMAL64); + builder.put(LARGEINT, DECIMAL128); + builder.put(LARGEINT, VARCHAR); + builder.put(LARGEINT, STRING); + // Float + builder.put(FLOAT, BOOLEAN); + builder.put(FLOAT, TINYINT); + builder.put(FLOAT, SMALLINT); + builder.put(FLOAT, INT); + builder.put(FLOAT, BIGINT); + builder.put(FLOAT, LARGEINT); + builder.put(FLOAT, FLOAT); + builder.put(FLOAT, DOUBLE); + builder.put(FLOAT, DATE); + builder.put(FLOAT, DATETIME); + builder.put(FLOAT, DATEV2); + builder.put(FLOAT, DATETIMEV2); + builder.put(FLOAT, DECIMALV2); + builder.put(FLOAT, DECIMAL32); + builder.put(FLOAT, DECIMAL64); + builder.put(FLOAT, DECIMAL128); + builder.put(FLOAT, VARCHAR); + builder.put(FLOAT, STRING); + // Double + builder.put(DOUBLE, BOOLEAN); + builder.put(DOUBLE, TINYINT); + builder.put(DOUBLE, SMALLINT); + builder.put(DOUBLE, INT); + builder.put(DOUBLE, BIGINT); + builder.put(DOUBLE, LARGEINT); + builder.put(DOUBLE, FLOAT); + builder.put(DOUBLE, DOUBLE); + builder.put(DOUBLE, DATE); + builder.put(DOUBLE, DATETIME); + builder.put(DOUBLE, DATEV2); + builder.put(DOUBLE, DATETIMEV2); + builder.put(DOUBLE, DECIMALV2); + builder.put(DOUBLE, DECIMAL32); + builder.put(DOUBLE, DECIMAL64); + builder.put(DOUBLE, DECIMAL128); + builder.put(DOUBLE, VARCHAR); + builder.put(DOUBLE, STRING); + // Date + builder.put(DATE, BOOLEAN); + builder.put(DATE, TINYINT); + builder.put(DATE, SMALLINT); + builder.put(DATE, INT); + builder.put(DATE, BIGINT); + builder.put(DATE, LARGEINT); + builder.put(DATE, FLOAT); + builder.put(DATE, DOUBLE); + builder.put(DATE, DATE); + builder.put(DATE, DATETIME); + builder.put(DATE, DATEV2); + builder.put(DATE, DATETIMEV2); + builder.put(DATE, DECIMALV2); + builder.put(DATE, DECIMAL32); + builder.put(DATE, DECIMAL64); + builder.put(DATE, DECIMAL128); + builder.put(DATE, VARCHAR); + builder.put(DATE, STRING); + // Datetime + builder.put(DATETIME, BOOLEAN); + builder.put(DATETIME, TINYINT); + builder.put(DATETIME, SMALLINT); + builder.put(DATETIME, INT); + builder.put(DATETIME, BIGINT); + builder.put(DATETIME, LARGEINT); + builder.put(DATETIME, FLOAT); + builder.put(DATETIME, DOUBLE); + builder.put(DATETIME, DATE); + builder.put(DATETIME, DATETIME); + builder.put(DATETIME, DATEV2); + builder.put(DATETIME, DATETIMEV2); + builder.put(DATETIME, DECIMALV2); + builder.put(DATETIME, DECIMAL32); + builder.put(DATETIME, DECIMAL64); + builder.put(DATETIME, DECIMAL128); + builder.put(DATETIME, VARCHAR); + builder.put(DATETIME, STRING); + // DateV2 + builder.put(DATEV2, BOOLEAN); + builder.put(DATEV2, TINYINT); + builder.put(DATEV2, SMALLINT); + builder.put(DATEV2, INT); + builder.put(DATEV2, BIGINT); + builder.put(DATEV2, LARGEINT); + builder.put(DATEV2, FLOAT); + builder.put(DATEV2, DOUBLE); + builder.put(DATEV2, DATE); + builder.put(DATEV2, DATETIME); + builder.put(DATEV2, DATEV2); + builder.put(DATEV2, DATETIMEV2); + builder.put(DATEV2, DECIMALV2); + builder.put(DATEV2, DECIMAL32); + builder.put(DATEV2, DECIMAL64); + builder.put(DATEV2, DECIMAL128); + builder.put(DATEV2, VARCHAR); + builder.put(DATEV2, STRING); + // DatetimeV2 + builder.put(DATETIMEV2, BOOLEAN); + builder.put(DATETIMEV2, TINYINT); + builder.put(DATETIMEV2, SMALLINT); + builder.put(DATETIMEV2, INT); + builder.put(DATETIMEV2, BIGINT); + builder.put(DATETIMEV2, LARGEINT); + builder.put(DATETIMEV2, FLOAT); + builder.put(DATETIMEV2, DOUBLE); + builder.put(DATETIMEV2, DATE); + builder.put(DATETIMEV2, DATETIME); + builder.put(DATETIMEV2, DATEV2); + builder.put(DATETIMEV2, DATETIMEV2); + builder.put(DATETIMEV2, DECIMALV2); + builder.put(DATETIMEV2, DECIMAL32); + builder.put(DATETIMEV2, DECIMAL64); + builder.put(DATETIMEV2, DECIMAL128); + builder.put(DATETIMEV2, VARCHAR); + builder.put(DATETIMEV2, STRING); + // Char + builder.put(CHAR, BOOLEAN); + builder.put(CHAR, TINYINT); + builder.put(CHAR, SMALLINT); + builder.put(CHAR, CHAR); + builder.put(CHAR, INT); + builder.put(CHAR, BIGINT); + builder.put(CHAR, LARGEINT); + builder.put(CHAR, FLOAT); + builder.put(CHAR, DOUBLE); + builder.put(CHAR, DATE); + builder.put(CHAR, DATETIME); + builder.put(CHAR, DATEV2); + builder.put(CHAR, DATETIMEV2); + builder.put(CHAR, DECIMALV2); + builder.put(CHAR, DECIMAL32); + builder.put(CHAR, DECIMAL64); + builder.put(CHAR, DECIMAL128); + builder.put(CHAR, VARCHAR); + builder.put(CHAR, STRING); + // Varchar + builder.put(VARCHAR, BOOLEAN); + builder.put(VARCHAR, TINYINT); + builder.put(VARCHAR, SMALLINT); + builder.put(VARCHAR, INT); + builder.put(VARCHAR, BIGINT); + builder.put(VARCHAR, LARGEINT); + builder.put(VARCHAR, FLOAT); + builder.put(VARCHAR, DOUBLE); + builder.put(VARCHAR, DATE); + builder.put(VARCHAR, DATETIME); + builder.put(VARCHAR, DATEV2); + builder.put(VARCHAR, DATETIMEV2); + builder.put(VARCHAR, DECIMALV2); + builder.put(VARCHAR, DECIMAL32); + builder.put(VARCHAR, DECIMAL64); + builder.put(VARCHAR, DECIMAL128); + builder.put(VARCHAR, VARCHAR); + builder.put(VARCHAR, STRING); + + // Varchar + builder.put(STRING, BOOLEAN); + builder.put(STRING, TINYINT); + builder.put(STRING, SMALLINT); + builder.put(STRING, INT); + builder.put(STRING, BIGINT); + builder.put(STRING, LARGEINT); + builder.put(STRING, FLOAT); + builder.put(STRING, DOUBLE); + builder.put(STRING, DATE); + builder.put(STRING, DATETIME); + builder.put(STRING, DATEV2); + builder.put(STRING, DATETIMEV2); + builder.put(STRING, DECIMALV2); + builder.put(STRING, DECIMAL32); + builder.put(STRING, DECIMAL64); + builder.put(STRING, DECIMAL128); + builder.put(STRING, VARCHAR); + builder.put(STRING, STRING); + + // DecimalV2 + builder.put(DECIMALV2, BOOLEAN); + builder.put(DECIMALV2, TINYINT); + builder.put(DECIMALV2, SMALLINT); + builder.put(DECIMALV2, INT); + builder.put(DECIMALV2, BIGINT); + builder.put(DECIMALV2, LARGEINT); + builder.put(DECIMALV2, FLOAT); + builder.put(DECIMALV2, DOUBLE); + builder.put(DECIMALV2, DECIMALV2); + builder.put(DECIMALV2, DECIMAL32); + builder.put(DECIMALV2, DECIMAL64); + builder.put(DECIMALV2, DECIMAL128); + builder.put(DECIMALV2, VARCHAR); + builder.put(DECIMALV2, STRING); + + builder.put(DECIMAL32, BOOLEAN); + builder.put(DECIMAL32, TINYINT); + builder.put(DECIMAL32, SMALLINT); + builder.put(DECIMAL32, INT); + builder.put(DECIMAL32, BIGINT); + builder.put(DECIMAL32, LARGEINT); + builder.put(DECIMAL32, FLOAT); + builder.put(DECIMAL32, DOUBLE); + builder.put(DECIMAL32, DECIMALV2); + builder.put(DECIMAL32, DECIMAL32); + builder.put(DECIMAL32, DECIMAL64); + builder.put(DECIMAL32, DECIMAL128); + builder.put(DECIMAL32, VARCHAR); + builder.put(DECIMAL32, STRING); + + builder.put(DECIMAL64, BOOLEAN); + builder.put(DECIMAL64, TINYINT); + builder.put(DECIMAL64, SMALLINT); + builder.put(DECIMAL64, INT); + builder.put(DECIMAL64, BIGINT); + builder.put(DECIMAL64, LARGEINT); + builder.put(DECIMAL64, FLOAT); + builder.put(DECIMAL64, DOUBLE); + builder.put(DECIMAL64, DECIMALV2); + builder.put(DECIMAL64, DECIMAL32); + builder.put(DECIMAL64, DECIMAL64); + builder.put(DECIMAL64, DECIMAL128); + builder.put(DECIMAL64, VARCHAR); + builder.put(DECIMAL64, STRING); + + builder.put(DECIMAL128, BOOLEAN); + builder.put(DECIMAL128, TINYINT); + builder.put(DECIMAL128, SMALLINT); + builder.put(DECIMAL128, INT); + builder.put(DECIMAL128, BIGINT); + builder.put(DECIMAL128, LARGEINT); + builder.put(DECIMAL128, FLOAT); + builder.put(DECIMAL128, DOUBLE); + builder.put(DECIMAL128, DECIMALV2); + builder.put(DECIMAL128, DECIMAL32); + builder.put(DECIMAL128, DECIMAL64); + builder.put(DECIMAL128, DECIMAL128); + builder.put(DECIMAL128, VARCHAR); + builder.put(DECIMAL128, STRING); + + // HLL + builder.put(HLL, HLL); + + // BITMAP + builder.put(BITMAP, BITMAP); + + // QUANTILE_STATE + builder.put(QUANTILE_STATE, QUANTILE_STATE); + + // TIME + builder.put(TIME, TIME); + builder.put(TIME, TIMEV2); + builder.put(TIME, DOUBLE); + + //TIMEV2 + builder.put(TIMEV2, TIME); + builder.put(TIMEV2, TIMEV2); + builder.put(TIMEV2, DOUBLE); + + implicitCastMap = builder.build(); + } + + private static ArrayList integerTypes; + private static ArrayList numericTypes; + private static ArrayList supportedTypes; + + static { + integerTypes = Lists.newArrayList(); + integerTypes.add(TINYINT); + integerTypes.add(SMALLINT); + integerTypes.add(INT); + integerTypes.add(BIGINT); + integerTypes.add(LARGEINT); + + numericTypes = Lists.newArrayList(); + numericTypes.add(TINYINT); + numericTypes.add(SMALLINT); + numericTypes.add(INT); + numericTypes.add(BIGINT); + numericTypes.add(LARGEINT); + numericTypes.add(FLOAT); + numericTypes.add(DOUBLE); + numericTypes.add(DECIMALV2); + numericTypes.add(DECIMAL32); + numericTypes.add(DECIMAL64); + numericTypes.add(DECIMAL128); + + supportedTypes = Lists.newArrayList(); + supportedTypes.add(NULL_TYPE); + supportedTypes.add(BOOLEAN); + supportedTypes.add(TINYINT); + supportedTypes.add(SMALLINT); + supportedTypes.add(INT); + supportedTypes.add(BIGINT); + supportedTypes.add(LARGEINT); + supportedTypes.add(FLOAT); + supportedTypes.add(DOUBLE); + supportedTypes.add(VARCHAR); + supportedTypes.add(STRING); + supportedTypes.add(HLL); + supportedTypes.add(CHAR); + supportedTypes.add(DATE); + supportedTypes.add(DATETIME); + supportedTypes.add(TIME); + supportedTypes.add(DATEV2); + supportedTypes.add(DATETIMEV2); + supportedTypes.add(TIMEV2); + supportedTypes.add(DECIMALV2); + supportedTypes.add(DECIMAL32); + supportedTypes.add(DECIMAL64); + supportedTypes.add(DECIMAL128); + supportedTypes.add(BITMAP); + supportedTypes.add(ARRAY); + supportedTypes.add(MAP); + supportedTypes.add(VARIANT); + supportedTypes.add(QUANTILE_STATE); + } + + public static ArrayList getIntegerTypes() { + return integerTypes; + } + + public static ArrayList getNumericTypes() { + return numericTypes; + } + + public static ArrayList getSupportedTypes() { + return supportedTypes; + } + + // Check whether 'type' can cast to 'target' + public static boolean isImplicitCast(PrimitiveType type, PrimitiveType target) { + return implicitCastMap.get(type).contains(target); + } + + /** + * Matrix that records "smallest" assignment-compatible type of two types + * (INVALID_TYPE if no such type exists, ie, if the input types are fundamentally + * incompatible). A value of any of the two types could be assigned to a slot + * of the assignment-compatible type without loss of precision. + *

+ * We chose not to follow MySQL's type casting behavior as described here: + * http://dev.mysql.com/doc/refman/5.0/en/type-conversion.html + * for the following reasons: + * conservative casting in arithmetic exprs: TINYINT + TINYINT -> BIGINT + * comparison of many types as double: INT < FLOAT -> comparison as DOUBLE + * special cases when dealing with dates and timestamps + */ + private static PrimitiveType[][] compatibilityMatrix; + + static { + compatibilityMatrix = new PrimitiveType[PrimitiveType.values().length][PrimitiveType.values().length]; + + // NULL_TYPE is compatible with any type and results in the non-null type. + compatibilityMatrix[NULL_TYPE.ordinal()][NULL_TYPE.ordinal()] = NULL_TYPE; + compatibilityMatrix[NULL_TYPE.ordinal()][BOOLEAN.ordinal()] = BOOLEAN; + compatibilityMatrix[NULL_TYPE.ordinal()][TINYINT.ordinal()] = TINYINT; + compatibilityMatrix[NULL_TYPE.ordinal()][SMALLINT.ordinal()] = SMALLINT; + compatibilityMatrix[NULL_TYPE.ordinal()][INT.ordinal()] = INT; + compatibilityMatrix[NULL_TYPE.ordinal()][BIGINT.ordinal()] = BIGINT; + compatibilityMatrix[NULL_TYPE.ordinal()][LARGEINT.ordinal()] = LARGEINT; + compatibilityMatrix[NULL_TYPE.ordinal()][FLOAT.ordinal()] = FLOAT; + compatibilityMatrix[NULL_TYPE.ordinal()][DOUBLE.ordinal()] = DOUBLE; + compatibilityMatrix[NULL_TYPE.ordinal()][DATE.ordinal()] = DATE; + compatibilityMatrix[NULL_TYPE.ordinal()][DATETIME.ordinal()] = DATETIME; + compatibilityMatrix[NULL_TYPE.ordinal()][DATEV2.ordinal()] = DATEV2; + compatibilityMatrix[NULL_TYPE.ordinal()][DATETIMEV2.ordinal()] = DATETIMEV2; + compatibilityMatrix[NULL_TYPE.ordinal()][CHAR.ordinal()] = CHAR; + compatibilityMatrix[NULL_TYPE.ordinal()][VARCHAR.ordinal()] = VARCHAR; + compatibilityMatrix[NULL_TYPE.ordinal()][STRING.ordinal()] = STRING; + compatibilityMatrix[NULL_TYPE.ordinal()][DECIMALV2.ordinal()] = DECIMALV2; + compatibilityMatrix[NULL_TYPE.ordinal()][DECIMAL32.ordinal()] = DECIMAL32; + compatibilityMatrix[NULL_TYPE.ordinal()][DECIMAL64.ordinal()] = DECIMAL64; + compatibilityMatrix[NULL_TYPE.ordinal()][DECIMAL128.ordinal()] = DECIMAL128; + compatibilityMatrix[NULL_TYPE.ordinal()][TIME.ordinal()] = TIME; + compatibilityMatrix[NULL_TYPE.ordinal()][TIMEV2.ordinal()] = TIMEV2; + compatibilityMatrix[NULL_TYPE.ordinal()][BITMAP.ordinal()] = BITMAP; + compatibilityMatrix[NULL_TYPE.ordinal()][QUANTILE_STATE.ordinal()] = QUANTILE_STATE; + + compatibilityMatrix[BOOLEAN.ordinal()][BOOLEAN.ordinal()] = BOOLEAN; + compatibilityMatrix[BOOLEAN.ordinal()][TINYINT.ordinal()] = TINYINT; + compatibilityMatrix[BOOLEAN.ordinal()][SMALLINT.ordinal()] = SMALLINT; + compatibilityMatrix[BOOLEAN.ordinal()][INT.ordinal()] = INT; + compatibilityMatrix[BOOLEAN.ordinal()][BIGINT.ordinal()] = BIGINT; + compatibilityMatrix[BOOLEAN.ordinal()][LARGEINT.ordinal()] = LARGEINT; + compatibilityMatrix[BOOLEAN.ordinal()][FLOAT.ordinal()] = FLOAT; + compatibilityMatrix[BOOLEAN.ordinal()][DOUBLE.ordinal()] = DOUBLE; + compatibilityMatrix[BOOLEAN.ordinal()][DATE.ordinal()] = INVALID_TYPE; + compatibilityMatrix[BOOLEAN.ordinal()][DATETIME.ordinal()] = INVALID_TYPE; + compatibilityMatrix[BOOLEAN.ordinal()][DATEV2.ordinal()] = INVALID_TYPE; + compatibilityMatrix[BOOLEAN.ordinal()][DATETIMEV2.ordinal()] = INVALID_TYPE; + compatibilityMatrix[BOOLEAN.ordinal()][CHAR.ordinal()] = INVALID_TYPE; + compatibilityMatrix[BOOLEAN.ordinal()][VARCHAR.ordinal()] = INVALID_TYPE; + compatibilityMatrix[BOOLEAN.ordinal()][STRING.ordinal()] = INVALID_TYPE; + compatibilityMatrix[BOOLEAN.ordinal()][DECIMALV2.ordinal()] = DECIMALV2; + compatibilityMatrix[BOOLEAN.ordinal()][DECIMAL32.ordinal()] = DECIMAL32; + compatibilityMatrix[BOOLEAN.ordinal()][DECIMAL64.ordinal()] = DECIMAL64; + compatibilityMatrix[BOOLEAN.ordinal()][DECIMAL128.ordinal()] = DECIMAL128; + compatibilityMatrix[BOOLEAN.ordinal()][TIME.ordinal()] = TIME; + compatibilityMatrix[BOOLEAN.ordinal()][TIMEV2.ordinal()] = TIMEV2; + + compatibilityMatrix[TINYINT.ordinal()][TINYINT.ordinal()] = TINYINT; + compatibilityMatrix[TINYINT.ordinal()][SMALLINT.ordinal()] = SMALLINT; + compatibilityMatrix[TINYINT.ordinal()][INT.ordinal()] = INT; + compatibilityMatrix[TINYINT.ordinal()][BIGINT.ordinal()] = BIGINT; + compatibilityMatrix[TINYINT.ordinal()][LARGEINT.ordinal()] = LARGEINT; + compatibilityMatrix[TINYINT.ordinal()][FLOAT.ordinal()] = FLOAT; + compatibilityMatrix[TINYINT.ordinal()][DOUBLE.ordinal()] = DOUBLE; + compatibilityMatrix[TINYINT.ordinal()][DATE.ordinal()] = INVALID_TYPE; + compatibilityMatrix[TINYINT.ordinal()][DATETIME.ordinal()] = INVALID_TYPE; + compatibilityMatrix[TINYINT.ordinal()][DATEV2.ordinal()] = INVALID_TYPE; + compatibilityMatrix[TINYINT.ordinal()][DATETIMEV2.ordinal()] = INVALID_TYPE; + compatibilityMatrix[TINYINT.ordinal()][CHAR.ordinal()] = INVALID_TYPE; + compatibilityMatrix[TINYINT.ordinal()][VARCHAR.ordinal()] = INVALID_TYPE; + compatibilityMatrix[TINYINT.ordinal()][STRING.ordinal()] = INVALID_TYPE; + compatibilityMatrix[TINYINT.ordinal()][DECIMALV2.ordinal()] = DECIMALV2; + compatibilityMatrix[TINYINT.ordinal()][DECIMAL32.ordinal()] = DECIMAL32; + compatibilityMatrix[TINYINT.ordinal()][DECIMAL64.ordinal()] = DECIMAL64; + compatibilityMatrix[TINYINT.ordinal()][DECIMAL128.ordinal()] = DECIMAL128; + compatibilityMatrix[TINYINT.ordinal()][TIME.ordinal()] = TIME; + compatibilityMatrix[TINYINT.ordinal()][TIMEV2.ordinal()] = TIMEV2; + + compatibilityMatrix[SMALLINT.ordinal()][SMALLINT.ordinal()] = SMALLINT; + compatibilityMatrix[SMALLINT.ordinal()][INT.ordinal()] = INT; + compatibilityMatrix[SMALLINT.ordinal()][BIGINT.ordinal()] = BIGINT; + compatibilityMatrix[SMALLINT.ordinal()][LARGEINT.ordinal()] = LARGEINT; + compatibilityMatrix[SMALLINT.ordinal()][FLOAT.ordinal()] = FLOAT; + compatibilityMatrix[SMALLINT.ordinal()][DOUBLE.ordinal()] = DOUBLE; + compatibilityMatrix[SMALLINT.ordinal()][DATE.ordinal()] = INVALID_TYPE; + compatibilityMatrix[SMALLINT.ordinal()][DATETIME.ordinal()] = INVALID_TYPE; + compatibilityMatrix[SMALLINT.ordinal()][DATEV2.ordinal()] = INVALID_TYPE; + compatibilityMatrix[SMALLINT.ordinal()][DATETIMEV2.ordinal()] = INVALID_TYPE; + compatibilityMatrix[SMALLINT.ordinal()][CHAR.ordinal()] = INVALID_TYPE; + compatibilityMatrix[SMALLINT.ordinal()][VARCHAR.ordinal()] = INVALID_TYPE; + compatibilityMatrix[SMALLINT.ordinal()][STRING.ordinal()] = INVALID_TYPE; + compatibilityMatrix[SMALLINT.ordinal()][DECIMALV2.ordinal()] = DECIMALV2; + compatibilityMatrix[SMALLINT.ordinal()][DECIMAL32.ordinal()] = DECIMAL32; + compatibilityMatrix[SMALLINT.ordinal()][DECIMAL64.ordinal()] = DECIMAL64; + compatibilityMatrix[SMALLINT.ordinal()][DECIMAL128.ordinal()] = DECIMAL128; + compatibilityMatrix[SMALLINT.ordinal()][TIME.ordinal()] = TIME; + compatibilityMatrix[SMALLINT.ordinal()][TIMEV2.ordinal()] = TIMEV2; + + compatibilityMatrix[INT.ordinal()][INT.ordinal()] = INT; + compatibilityMatrix[INT.ordinal()][BIGINT.ordinal()] = BIGINT; + compatibilityMatrix[INT.ordinal()][LARGEINT.ordinal()] = LARGEINT; + compatibilityMatrix[INT.ordinal()][FLOAT.ordinal()] = FLOAT; + compatibilityMatrix[INT.ordinal()][DOUBLE.ordinal()] = DOUBLE; + compatibilityMatrix[INT.ordinal()][DATE.ordinal()] = INVALID_TYPE; + compatibilityMatrix[INT.ordinal()][DATETIME.ordinal()] = INVALID_TYPE; + compatibilityMatrix[INT.ordinal()][DATEV2.ordinal()] = INVALID_TYPE; + compatibilityMatrix[INT.ordinal()][DATETIMEV2.ordinal()] = INVALID_TYPE; + compatibilityMatrix[INT.ordinal()][CHAR.ordinal()] = INVALID_TYPE; + compatibilityMatrix[INT.ordinal()][VARCHAR.ordinal()] = INVALID_TYPE; + compatibilityMatrix[INT.ordinal()][STRING.ordinal()] = INVALID_TYPE; + compatibilityMatrix[INT.ordinal()][DECIMALV2.ordinal()] = DECIMALV2; + compatibilityMatrix[INT.ordinal()][DECIMAL32.ordinal()] = DECIMAL32; + compatibilityMatrix[INT.ordinal()][DECIMAL64.ordinal()] = DECIMAL64; + compatibilityMatrix[INT.ordinal()][DECIMAL128.ordinal()] = DECIMAL128; + compatibilityMatrix[INT.ordinal()][TIME.ordinal()] = TIME; + compatibilityMatrix[INT.ordinal()][TIMEV2.ordinal()] = TIMEV2; + + compatibilityMatrix[BIGINT.ordinal()][BIGINT.ordinal()] = BIGINT; + compatibilityMatrix[BIGINT.ordinal()][LARGEINT.ordinal()] = LARGEINT; + compatibilityMatrix[BIGINT.ordinal()][FLOAT.ordinal()] = DOUBLE; + compatibilityMatrix[BIGINT.ordinal()][DOUBLE.ordinal()] = DOUBLE; + compatibilityMatrix[BIGINT.ordinal()][DATE.ordinal()] = INVALID_TYPE; + compatibilityMatrix[BIGINT.ordinal()][DATETIME.ordinal()] = INVALID_TYPE; + compatibilityMatrix[BIGINT.ordinal()][DATEV2.ordinal()] = INVALID_TYPE; + compatibilityMatrix[BIGINT.ordinal()][DATETIMEV2.ordinal()] = INVALID_TYPE; + compatibilityMatrix[BIGINT.ordinal()][CHAR.ordinal()] = INVALID_TYPE; + compatibilityMatrix[BIGINT.ordinal()][VARCHAR.ordinal()] = INVALID_TYPE; + compatibilityMatrix[BIGINT.ordinal()][STRING.ordinal()] = INVALID_TYPE; + compatibilityMatrix[BIGINT.ordinal()][DECIMALV2.ordinal()] = DECIMALV2; + compatibilityMatrix[BIGINT.ordinal()][DECIMAL32.ordinal()] = DECIMAL32; + compatibilityMatrix[BIGINT.ordinal()][DECIMAL64.ordinal()] = DECIMAL64; + compatibilityMatrix[BIGINT.ordinal()][DECIMAL128.ordinal()] = DECIMAL128; + compatibilityMatrix[BIGINT.ordinal()][TIME.ordinal()] = TIME; + compatibilityMatrix[BIGINT.ordinal()][TIMEV2.ordinal()] = TIMEV2; + + compatibilityMatrix[LARGEINT.ordinal()][LARGEINT.ordinal()] = LARGEINT; + compatibilityMatrix[LARGEINT.ordinal()][FLOAT.ordinal()] = DOUBLE; + compatibilityMatrix[LARGEINT.ordinal()][DOUBLE.ordinal()] = DOUBLE; + compatibilityMatrix[LARGEINT.ordinal()][DATE.ordinal()] = INVALID_TYPE; + compatibilityMatrix[LARGEINT.ordinal()][DATETIME.ordinal()] = INVALID_TYPE; + compatibilityMatrix[LARGEINT.ordinal()][DATEV2.ordinal()] = INVALID_TYPE; + compatibilityMatrix[LARGEINT.ordinal()][DATETIMEV2.ordinal()] = INVALID_TYPE; + compatibilityMatrix[LARGEINT.ordinal()][CHAR.ordinal()] = INVALID_TYPE; + compatibilityMatrix[LARGEINT.ordinal()][VARCHAR.ordinal()] = INVALID_TYPE; + compatibilityMatrix[LARGEINT.ordinal()][STRING.ordinal()] = INVALID_TYPE; + compatibilityMatrix[LARGEINT.ordinal()][DECIMALV2.ordinal()] = DECIMALV2; + compatibilityMatrix[LARGEINT.ordinal()][DECIMAL32.ordinal()] = DECIMAL32; + compatibilityMatrix[LARGEINT.ordinal()][DECIMAL64.ordinal()] = DECIMAL64; + compatibilityMatrix[LARGEINT.ordinal()][DECIMAL128.ordinal()] = DECIMAL128; + compatibilityMatrix[LARGEINT.ordinal()][TIME.ordinal()] = TIME; + compatibilityMatrix[LARGEINT.ordinal()][TIMEV2.ordinal()] = TIMEV2; + + compatibilityMatrix[FLOAT.ordinal()][FLOAT.ordinal()] = FLOAT; + compatibilityMatrix[FLOAT.ordinal()][DOUBLE.ordinal()] = DOUBLE; + compatibilityMatrix[FLOAT.ordinal()][DATE.ordinal()] = INVALID_TYPE; + compatibilityMatrix[FLOAT.ordinal()][DATETIME.ordinal()] = INVALID_TYPE; + compatibilityMatrix[FLOAT.ordinal()][DATEV2.ordinal()] = INVALID_TYPE; + compatibilityMatrix[FLOAT.ordinal()][DATETIMEV2.ordinal()] = INVALID_TYPE; + compatibilityMatrix[FLOAT.ordinal()][CHAR.ordinal()] = INVALID_TYPE; + compatibilityMatrix[FLOAT.ordinal()][VARCHAR.ordinal()] = INVALID_TYPE; + compatibilityMatrix[FLOAT.ordinal()][STRING.ordinal()] = INVALID_TYPE; + compatibilityMatrix[FLOAT.ordinal()][DECIMALV2.ordinal()] = DECIMALV2; + compatibilityMatrix[FLOAT.ordinal()][DECIMAL32.ordinal()] = DECIMAL32; + compatibilityMatrix[FLOAT.ordinal()][DECIMAL64.ordinal()] = DECIMAL64; + compatibilityMatrix[FLOAT.ordinal()][DECIMAL128.ordinal()] = DECIMAL128; + compatibilityMatrix[FLOAT.ordinal()][TIME.ordinal()] = TIME; + compatibilityMatrix[FLOAT.ordinal()][TIMEV2.ordinal()] = TIMEV2; + + compatibilityMatrix[DOUBLE.ordinal()][DOUBLE.ordinal()] = DOUBLE; + compatibilityMatrix[DOUBLE.ordinal()][DATE.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DOUBLE.ordinal()][DATETIME.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DOUBLE.ordinal()][DATEV2.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DOUBLE.ordinal()][DATETIMEV2.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DOUBLE.ordinal()][CHAR.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DOUBLE.ordinal()][VARCHAR.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DOUBLE.ordinal()][STRING.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DOUBLE.ordinal()][DECIMALV2.ordinal()] = DECIMALV2; + compatibilityMatrix[DOUBLE.ordinal()][DECIMAL32.ordinal()] = DECIMAL32; + compatibilityMatrix[DOUBLE.ordinal()][DECIMAL64.ordinal()] = DECIMAL64; + compatibilityMatrix[DOUBLE.ordinal()][DECIMAL128.ordinal()] = DECIMAL128; + compatibilityMatrix[DOUBLE.ordinal()][TIME.ordinal()] = TIME; + compatibilityMatrix[DOUBLE.ordinal()][TIMEV2.ordinal()] = TIMEV2; + + compatibilityMatrix[DATE.ordinal()][DATE.ordinal()] = DATE; + compatibilityMatrix[DATE.ordinal()][DATETIME.ordinal()] = DATETIME; + compatibilityMatrix[DATE.ordinal()][DATEV2.ordinal()] = DATEV2; + compatibilityMatrix[DATE.ordinal()][DATETIMEV2.ordinal()] = DATETIMEV2; + compatibilityMatrix[DATE.ordinal()][CHAR.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DATE.ordinal()][VARCHAR.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DATE.ordinal()][STRING.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DATE.ordinal()][DECIMALV2.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DATE.ordinal()][DECIMAL32.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DATE.ordinal()][DECIMAL64.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DATE.ordinal()][DECIMAL128.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DATE.ordinal()][TIME.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DATE.ordinal()][TIMEV2.ordinal()] = INVALID_TYPE; + + compatibilityMatrix[DATEV2.ordinal()][DATE.ordinal()] = DATEV2; + compatibilityMatrix[DATEV2.ordinal()][DATETIME.ordinal()] = DATETIMEV2; + compatibilityMatrix[DATEV2.ordinal()][DATEV2.ordinal()] = DATEV2; + compatibilityMatrix[DATEV2.ordinal()][DATETIMEV2.ordinal()] = DATETIMEV2; + compatibilityMatrix[DATEV2.ordinal()][CHAR.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DATEV2.ordinal()][VARCHAR.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DATEV2.ordinal()][STRING.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DATEV2.ordinal()][DECIMALV2.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DATEV2.ordinal()][DECIMAL32.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DATEV2.ordinal()][DECIMAL64.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DATEV2.ordinal()][DECIMAL128.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DATEV2.ordinal()][TIME.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DATEV2.ordinal()][TIMEV2.ordinal()] = INVALID_TYPE; + + compatibilityMatrix[DATETIME.ordinal()][DATETIME.ordinal()] = DATETIME; + compatibilityMatrix[DATETIME.ordinal()][DATETIMEV2.ordinal()] = DATETIMEV2; + compatibilityMatrix[DATETIME.ordinal()][CHAR.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DATETIME.ordinal()][VARCHAR.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DATETIME.ordinal()][STRING.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DATETIME.ordinal()][DECIMALV2.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DATETIME.ordinal()][DECIMAL32.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DATETIME.ordinal()][DECIMAL64.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DATETIME.ordinal()][DECIMAL128.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DATETIME.ordinal()][TIME.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DATETIME.ordinal()][TIMEV2.ordinal()] = INVALID_TYPE; + + compatibilityMatrix[DATETIMEV2.ordinal()][DATETIME.ordinal()] = DATETIMEV2; + compatibilityMatrix[DATETIMEV2.ordinal()][DATETIMEV2.ordinal()] = DATETIMEV2; + compatibilityMatrix[DATETIMEV2.ordinal()][CHAR.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DATETIMEV2.ordinal()][VARCHAR.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DATETIMEV2.ordinal()][STRING.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DATETIMEV2.ordinal()][DECIMALV2.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DATETIMEV2.ordinal()][DECIMAL32.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DATETIMEV2.ordinal()][DECIMAL64.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DATETIMEV2.ordinal()][DECIMAL128.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DATETIMEV2.ordinal()][TIME.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DATETIMEV2.ordinal()][TIMEV2.ordinal()] = INVALID_TYPE; + + compatibilityMatrix[CHAR.ordinal()][CHAR.ordinal()] = CHAR; + compatibilityMatrix[CHAR.ordinal()][VARCHAR.ordinal()] = VARCHAR; + compatibilityMatrix[CHAR.ordinal()][STRING.ordinal()] = STRING; + compatibilityMatrix[CHAR.ordinal()][DECIMALV2.ordinal()] = INVALID_TYPE; + compatibilityMatrix[CHAR.ordinal()][DECIMAL32.ordinal()] = INVALID_TYPE; + compatibilityMatrix[CHAR.ordinal()][DECIMAL64.ordinal()] = INVALID_TYPE; + compatibilityMatrix[CHAR.ordinal()][DECIMAL128.ordinal()] = INVALID_TYPE; + compatibilityMatrix[CHAR.ordinal()][TIME.ordinal()] = INVALID_TYPE; + compatibilityMatrix[CHAR.ordinal()][TIMEV2.ordinal()] = INVALID_TYPE; + + compatibilityMatrix[VARCHAR.ordinal()][VARCHAR.ordinal()] = VARCHAR; + compatibilityMatrix[VARCHAR.ordinal()][STRING.ordinal()] = STRING; + compatibilityMatrix[VARCHAR.ordinal()][DECIMALV2.ordinal()] = INVALID_TYPE; + compatibilityMatrix[VARCHAR.ordinal()][DECIMAL32.ordinal()] = INVALID_TYPE; + compatibilityMatrix[VARCHAR.ordinal()][DECIMAL64.ordinal()] = INVALID_TYPE; + compatibilityMatrix[VARCHAR.ordinal()][DECIMAL128.ordinal()] = INVALID_TYPE; + compatibilityMatrix[VARCHAR.ordinal()][TIME.ordinal()] = INVALID_TYPE; + compatibilityMatrix[VARCHAR.ordinal()][TIMEV2.ordinal()] = INVALID_TYPE; + + compatibilityMatrix[STRING.ordinal()][STRING.ordinal()] = STRING; + compatibilityMatrix[STRING.ordinal()][DECIMALV2.ordinal()] = INVALID_TYPE; + compatibilityMatrix[STRING.ordinal()][DECIMAL32.ordinal()] = INVALID_TYPE; + compatibilityMatrix[STRING.ordinal()][DECIMAL64.ordinal()] = INVALID_TYPE; + compatibilityMatrix[STRING.ordinal()][DECIMAL128.ordinal()] = INVALID_TYPE; + compatibilityMatrix[STRING.ordinal()][TIME.ordinal()] = INVALID_TYPE; + compatibilityMatrix[STRING.ordinal()][TIMEV2.ordinal()] = INVALID_TYPE; + + compatibilityMatrix[DECIMALV2.ordinal()][DECIMALV2.ordinal()] = DECIMALV2; + compatibilityMatrix[DECIMALV2.ordinal()][DECIMAL32.ordinal()] = DECIMALV2; + compatibilityMatrix[DECIMALV2.ordinal()][DECIMAL64.ordinal()] = DECIMALV2; + compatibilityMatrix[DECIMALV2.ordinal()][DECIMAL128.ordinal()] = DECIMAL128; + compatibilityMatrix[DECIMALV2.ordinal()][TIME.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DECIMALV2.ordinal()][TIMEV2.ordinal()] = INVALID_TYPE; + + compatibilityMatrix[DECIMAL32.ordinal()][DECIMALV2.ordinal()] = DECIMALV2; + compatibilityMatrix[DECIMAL32.ordinal()][DECIMAL32.ordinal()] = DECIMAL32; + compatibilityMatrix[DECIMAL32.ordinal()][DECIMAL64.ordinal()] = DECIMAL64; + compatibilityMatrix[DECIMAL32.ordinal()][DECIMAL128.ordinal()] = DECIMAL128; + compatibilityMatrix[DECIMAL32.ordinal()][TIME.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DECIMAL32.ordinal()][TIMEV2.ordinal()] = INVALID_TYPE; + + compatibilityMatrix[DECIMAL64.ordinal()][DECIMALV2.ordinal()] = DECIMALV2; + compatibilityMatrix[DECIMAL64.ordinal()][DECIMAL32.ordinal()] = DECIMAL64; + compatibilityMatrix[DECIMAL64.ordinal()][DECIMAL64.ordinal()] = DECIMAL64; + compatibilityMatrix[DECIMAL64.ordinal()][DECIMAL128.ordinal()] = DECIMAL128; + compatibilityMatrix[DECIMAL64.ordinal()][TIME.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DECIMAL64.ordinal()][TIMEV2.ordinal()] = INVALID_TYPE; + + compatibilityMatrix[DECIMAL128.ordinal()][DECIMALV2.ordinal()] = DECIMAL128; + compatibilityMatrix[DECIMAL128.ordinal()][DECIMAL32.ordinal()] = DECIMAL128; + compatibilityMatrix[DECIMAL128.ordinal()][DECIMAL64.ordinal()] = DECIMAL128; + compatibilityMatrix[DECIMAL128.ordinal()][DECIMAL128.ordinal()] = DECIMAL128; + compatibilityMatrix[DECIMAL128.ordinal()][TIME.ordinal()] = INVALID_TYPE; + compatibilityMatrix[DECIMAL128.ordinal()][TIMEV2.ordinal()] = INVALID_TYPE; + + compatibilityMatrix[HLL.ordinal()][HLL.ordinal()] = HLL; + compatibilityMatrix[HLL.ordinal()][TIME.ordinal()] = INVALID_TYPE; + compatibilityMatrix[HLL.ordinal()][TIMEV2.ordinal()] = INVALID_TYPE; + + compatibilityMatrix[BITMAP.ordinal()][BITMAP.ordinal()] = BITMAP; + + compatibilityMatrix[TIME.ordinal()][TIME.ordinal()] = TIME; + compatibilityMatrix[TIME.ordinal()][TIMEV2.ordinal()] = TIMEV2; + + compatibilityMatrix[TIMEV2.ordinal()][TIME.ordinal()] = TIMEV2; + compatibilityMatrix[TIMEV2.ordinal()][TIMEV2.ordinal()] = TIMEV2; + + compatibilityMatrix[QUANTILE_STATE.ordinal()][QUANTILE_STATE.ordinal()] = QUANTILE_STATE; + } + + static { + // NULL_TYPE is compatible with any type and results in the non-null type. + compatibilityMatrix[NULL_TYPE.ordinal()][NULL_TYPE.ordinal()] = NULL_TYPE; + compatibilityMatrix[NULL_TYPE.ordinal()][BOOLEAN.ordinal()] = BOOLEAN; + compatibilityMatrix[NULL_TYPE.ordinal()][TINYINT.ordinal()] = TINYINT; + compatibilityMatrix[NULL_TYPE.ordinal()][SMALLINT.ordinal()] = SMALLINT; + compatibilityMatrix[NULL_TYPE.ordinal()][INT.ordinal()] = INT; + } + + private final String description; + private final int slotSize; // size of tuple slot for this type + private final TPrimitiveType thriftType; + private boolean isTimeType = false; + + private PrimitiveType(String description, int slotSize, TPrimitiveType thriftType) { + this.description = description; + this.slotSize = slotSize; + this.thriftType = thriftType; + } + + public void setTimeType() { + isTimeType = true; + } + + /** + * @return + */ + public boolean isTimeType() { + return isTimeType; + } + + public static PrimitiveType fromThrift(TPrimitiveType tPrimitiveType) { + switch (tPrimitiveType) { + case NULL_TYPE: + return NULL_TYPE; + case BOOLEAN: + return BOOLEAN; + case TINYINT: + return TINYINT; + case SMALLINT: + return SMALLINT; + case INT: + return INT; + case BIGINT: + return BIGINT; + case LARGEINT: + return LARGEINT; + case FLOAT: + return FLOAT; + case DOUBLE: + return DOUBLE; + case DATE: + return DATE; + case DATETIME: + return DATETIME; + case DATEV2: + return DATEV2; + case DATETIMEV2: + return DATETIMEV2; + case BINARY: + return BINARY; + case DECIMALV2: + return DECIMALV2; + case DECIMAL32: + return DECIMAL32; + case DECIMAL64: + return DECIMAL64; + case DECIMAL128: + return DECIMAL128; + case TIME: + return TIME; + case TIMEV2: + return TIMEV2; + case VARCHAR: + return VARCHAR; + case STRING: + return STRING; + case CHAR: + return CHAR; + case HLL: + return HLL; + case OBJECT: + return BITMAP; + case QUANTILE_STATE: + return QUANTILE_STATE; + case ARRAY: + return ARRAY; + case MAP: + return MAP; + case STRUCT: + return STRUCT; + case VARIANT: + return VARIANT; + case ALL: + return ALL; + default: + return INVALID_TYPE; + } + } + + public static List toThrift(PrimitiveType[] types) { + List result = Lists.newArrayList(); + for (PrimitiveType t : types) { + result.add(t.toThrift()); + } + return result; + } + + public static int getMaxSlotSize() { + return ARRAY.slotSize; + } + + /** + * Return type t such that values from both t1 and t2 can be assigned to t + * without loss of precision. Returns INVALID_TYPE if there is no such type + * or if any of t1 and t2 is INVALID_TYPE. + */ + public static PrimitiveType getAssignmentCompatibleType(PrimitiveType t1, PrimitiveType t2) { + if (!t1.isValid() || !t2.isValid()) { + return INVALID_TYPE; + } + + PrimitiveType smallerType = (t1.ordinal() < t2.ordinal() ? t1 : t2); + PrimitiveType largerType = (t1.ordinal() > t2.ordinal() ? t1 : t2); + PrimitiveType result = compatibilityMatrix[smallerType.ordinal()][largerType.ordinal()]; + Preconditions.checkNotNull(result); + return result; + } + + /** + * Returns if it is compatible to implicitly cast from t1 to t2 (casting from + * t1 to t2 results in no loss of precision. + */ + public static boolean isImplicitlyCastable(PrimitiveType t1, PrimitiveType t2) { + return getAssignmentCompatibleType(t1, t2) == t2; + } + + @Override + public String toString() { + return description; + } + + public TPrimitiveType toThrift() { + return thriftType; + } + + public int getSlotSize() { + return slotSize; + } + + public boolean isFixedPointType() { + return this == TINYINT + || this == SMALLINT + || this == INT + || this == BIGINT + || this == LARGEINT; + } + + public boolean isFloatingPointType() { + return this == FLOAT || this == DOUBLE; + } + + + public boolean isDecimalV2Type() { + return this == DECIMALV2; + } + + public boolean isDecimalV3Type() { + return this == DECIMAL32 || this == DECIMAL64 || this == DECIMAL128; + } + + public boolean isNumericType() { + return isFixedPointType() || isFloatingPointType() || isDecimalV2Type() || isDecimalV3Type(); + } + + public boolean isVariantType() { + return this == VARIANT; + } + + public boolean isValid() { + return this != INVALID_TYPE; + } + + public boolean isNull() { + return this == NULL_TYPE; + } + + public boolean isDateType() { + return (this == DATE || this == DATETIME || this == DATEV2 || this == DATETIMEV2); + } + + public boolean isDateV2Type() { + return (this == DATEV2 || this == DATETIMEV2); + } + + public boolean isArrayType() { + return this == ARRAY; + } + + public boolean isStringType() { + return (this == VARCHAR || this == CHAR || this == HLL || this == STRING); + } + + public boolean isCharFamily() { + return (this == VARCHAR || this == CHAR || this == STRING); + } + + public boolean isIntegerType() { + return (this == TINYINT || this == SMALLINT + || this == INT || this == BIGINT); + } + + // TODO(zhaochun): Add Mysql Type to it's private field + public MysqlColType toMysqlType() { + switch (this) { + // MySQL use Tinyint(1) to represent boolean + case BOOLEAN: + case TINYINT: + return MysqlColType.MYSQL_TYPE_TINY; + case SMALLINT: + return MysqlColType.MYSQL_TYPE_SHORT; + case INT: + return MysqlColType.MYSQL_TYPE_LONG; + case BIGINT: + return MysqlColType.MYSQL_TYPE_LONGLONG; + case FLOAT: + return MysqlColType.MYSQL_TYPE_FLOAT; + case DOUBLE: + return MysqlColType.MYSQL_TYPE_DOUBLE; + case TIME: + case TIMEV2: + return MysqlColType.MYSQL_TYPE_TIME; + case DATE: + case DATEV2: + return MysqlColType.MYSQL_TYPE_DATE; + case DATETIME: + case DATETIMEV2: { + if (isTimeType) { + return MysqlColType.MYSQL_TYPE_TIME; + } else { + return MysqlColType.MYSQL_TYPE_DATETIME; + } + } + case DECIMALV2: + case DECIMAL32: + case DECIMAL64: + case DECIMAL128: + return MysqlColType.MYSQL_TYPE_NEWDECIMAL; + case STRING: + return MysqlColType.MYSQL_TYPE_BLOB; + default: + return MysqlColType.MYSQL_TYPE_STRING; + } + } + + public int getOlapColumnIndexSize() { + switch (this) { + case DATE: + return DATE_INDEX_LEN; + case DATEV2: + return DATEV2_INDEX_LEN; + case DATETIME: + case DATETIMEV2: + return DATETIME_INDEX_LEN; + case VARCHAR: + return VARCHAR_INDEX_LEN; + case CHAR: + // char index size is length + return -1; + case STRING: + return STRING_INDEX_LEN; + case DECIMALV2: + return DECIMAL_INDEX_LEN; + case DECIMAL32: + return 4; + case DECIMAL64: + return 8; + case DECIMAL128: + return 16; + default: + return this.getSlotSize(); + } + } + + public static PrimitiveType getDatePrimitiveType(PrimitiveType type) { + switch (type) { + case DATE: + return Config.enable_date_conversion ? DATEV2 : DATE; + case DATETIME: + return Config.enable_date_conversion ? DATETIMEV2 : DATETIME; + default: + return type; + } + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/TableProperty.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/TableProperty.java index a122e004ff98d8..3eaf136fbc7131 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/TableProperty.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/TableProperty.java @@ -60,6 +60,7 @@ public class TableProperty implements Writable { private boolean isInMemory = false; private String storagePolicy = ""; + private boolean isDynamicSchema = false; /* * the default storage format of this table. @@ -188,6 +189,12 @@ public String getStoragePolicy() { return storagePolicy; } + public TableProperty buildDynamicSchema() { + isDynamicSchema = Boolean.parseBoolean( + properties.getOrDefault(PropertyAnalyzer.PROPERTIES_DYNAMIC_SCHEMA, "false")); + return this; + } + public TableProperty buildDataSortInfo() { HashMap dataSortInfoProperties = new HashMap<>(); for (Map.Entry entry : properties.entrySet()) { @@ -266,6 +273,10 @@ public String getEstimatePartitionSize() { return properties.getOrDefault(PropertyAnalyzer.PROPERTIES_ESTIMATE_PARTITION_SIZE, ""); } + public boolean isDynamicSchema() { + return isDynamicSchema; + } + public TStorageFormat getStorageFormat() { // Force convert all V1 table to V2 table if (TStorageFormat.V1 == storageFormat) { @@ -327,6 +338,7 @@ public static TableProperty read(DataInput in) throws IOException { TableProperty tableProperty = GsonUtils.GSON.fromJson(Text.readString(in), TableProperty.class) .executeBuildDynamicProperty() .buildInMemory() + .buildDynamicSchema() .buildStorageFormat() .buildDataSortInfo() .buildCompressionType() diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/VariantType.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/VariantType.java index 5d901876498126..e9363dd0141914 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/VariantType.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/VariantType.java @@ -17,12 +17,11 @@ package org.apache.doris.catalog; -import org.apache.doris.common.Config; import org.apache.doris.thrift.TTypeDesc; import org.apache.doris.thrift.TTypeNode; import org.apache.doris.thrift.TTypeNodeType; -public class VariantType extends Type { +public class VariantType extends Type { public VariantType() { } @@ -63,6 +62,7 @@ public PrimitiveType getPrimitiveType() { public boolean supportsTablePartitioning() { return false; } + @Override public int getSlotSize() { return PrimitiveType.VARIANT.getSlotSize(); @@ -70,8 +70,9 @@ public int getSlotSize() { @Override public boolean isSupported() { - return Config.enable_complex_type_support; + return true; } + @Override public boolean matchesType(Type t) { return t.isVariantType() || t.isStringType(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/util/PropertyAnalyzer.java b/fe/fe-core/src/main/java/org/apache/doris/common/util/PropertyAnalyzer.java index 80e48dadcb0655..64a4ad1af11702 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/common/util/PropertyAnalyzer.java +++ b/fe/fe-core/src/main/java/org/apache/doris/common/util/PropertyAnalyzer.java @@ -95,6 +95,7 @@ public class PropertyAnalyzer { // _auto_bucket can only set in create table stmt rewrite bucket and can not be changed public static final String PROPERTIES_AUTO_BUCKET = "_auto_bucket"; public static final String PROPERTIES_ESTIMATE_PARTITION_SIZE = "estimate_partition_size"; + public static final String PROPERTIES_DYNAMIC_SCHEMA = "dynamic_schema"; public static final String PROPERTIES_TABLET_TYPE = "tablet_type"; diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java index eeceedf788b27f..7c839de8ca1cca 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java +++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java @@ -277,6 +277,16 @@ public Database getDbNullable(long dbId) { return idToDb.get(dbId); } + public TableName getTableNameByTableId(Long tableId) { + for (Database db : fullNameToDb.values()) { + Table table = db.getTableNullable(tableId); + if (table != null) { + return new TableName("", db.getFullName(), table.getName()); + } + } + return null; + } + @Override public Map getProperties() { return Maps.newHashMap(); @@ -1443,7 +1453,7 @@ public void addPartition(Database db, String tableName, AddPartitionClause addPa olapTable.getCopiedIndexes(), singlePartitionDesc.isInMemory(), olapTable.getStorageFormat(), singlePartitionDesc.getTabletType(), olapTable.getCompressionType(), olapTable.getDataSortInfo(), olapTable.getEnableUniqueKeyMergeOnWrite(), olapTable.getStoragePolicy(), idGeneratorBuffer, - olapTable.disableAutoCompaction(), olapTable.storeRowColumn()); + olapTable.disableAutoCompaction(), olapTable.storeRowColumn(), olapTable.isDynamicSchema()); // check again table = db.getOlapTableOrDdlException(tableName); @@ -1676,7 +1686,7 @@ private Partition createPartitionWithIndices(String clusterName, long dbId, long boolean isInMemory, TStorageFormat storageFormat, TTabletType tabletType, TCompressionType compressionType, DataSortInfo dataSortInfo, boolean enableUniqueKeyMergeOnWrite, String storagePolicy, IdGeneratorBuffer idGeneratorBuffer, boolean disableAutoCompaction, - boolean storeRowColumn) throws DdlException { + boolean storeRowColumn, boolean isDynamicSchema) throws DdlException { // create base index first. Preconditions.checkArgument(baseIndexId != -1); MaterializedIndex baseIndex = new MaterializedIndex(baseIndexId, IndexState.NORMAL); @@ -1738,7 +1748,7 @@ private Partition createPartitionWithIndices(String clusterName, long dbId, long tabletId, replicaId, shortKeyColumnCount, schemaHash, version, keysType, storageType, storageMedium, schema, bfColumns, bfFpp, countDownLatch, indexes, isInMemory, tabletType, dataSortInfo, compressionType, enableUniqueKeyMergeOnWrite, storagePolicy, - disableAutoCompaction, storeRowColumn); + disableAutoCompaction, storeRowColumn, isDynamicSchema); task.setStorageFormat(storageFormat); batchTask.addTask(task); @@ -1965,6 +1975,11 @@ private void createOlapTable(Database db, CreateTableStmt stmt) throws UserExcep } olapTable.setStoreRowColumn(storeRowColumn); + // set dynamic schema + boolean isDynamicSchema = PropertyAnalyzer.analyzeBooleanProp(properties, + PropertyAnalyzer.PROPERTIES_DYNAMIC_SCHEMA, false); + olapTable.setIsDynamicSchema(isDynamicSchema); + // set storage policy String storagePolicy = PropertyAnalyzer.analyzeStoragePolicy(properties); Env.getCurrentEnv().getPolicyMgr().checkStoragePolicyExist(storagePolicy); @@ -2137,7 +2152,7 @@ private void createOlapTable(Database db, CreateTableStmt stmt) throws UserExcep partitionInfo.getReplicaAllocation(partitionId), versionInfo, bfColumns, bfFpp, tabletIdSet, olapTable.getCopiedIndexes(), isInMemory, storageFormat, tabletType, compressionType, olapTable.getDataSortInfo(), olapTable.getEnableUniqueKeyMergeOnWrite(), storagePolicy, - idGeneratorBuffer, olapTable.disableAutoCompaction(), storeRowColumn); + idGeneratorBuffer, olapTable.disableAutoCompaction(), storeRowColumn, isDynamicSchema); olapTable.addPartition(partition); } else if (partitionInfo.getType() == PartitionType.RANGE || partitionInfo.getType() == PartitionType.LIST) { @@ -2196,7 +2211,7 @@ private void createOlapTable(Database db, CreateTableStmt stmt) throws UserExcep tabletIdSet, olapTable.getCopiedIndexes(), isInMemory, storageFormat, partitionInfo.getTabletType(entry.getValue()), compressionType, olapTable.getDataSortInfo(), olapTable.getEnableUniqueKeyMergeOnWrite(), storagePolicy, - idGeneratorBuffer, olapTable.disableAutoCompaction(), storeRowColumn); + idGeneratorBuffer, olapTable.disableAutoCompaction(), storeRowColumn, isDynamicSchema); olapTable.addPartition(partition); } } else { @@ -2601,7 +2616,7 @@ public void truncateTable(TruncateTableStmt truncateTableStmt) throws DdlExcepti copiedTbl.getPartitionInfo().getTabletType(oldPartitionId), copiedTbl.getCompressionType(), copiedTbl.getDataSortInfo(), copiedTbl.getEnableUniqueKeyMergeOnWrite(), olapTable.getStoragePolicy(), idGeneratorBuffer, olapTable.disableAutoCompaction(), - olapTable.storeRowColumn()); + olapTable.storeRowColumn(), olapTable.isDynamicSchema()); newPartitions.add(newPartition); } } catch (DdlException e) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/master/ReportHandler.java b/fe/fe-core/src/main/java/org/apache/doris/master/ReportHandler.java index d45d787ed0549d..5ed52287c4d6ce 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/master/ReportHandler.java +++ b/fe/fe-core/src/main/java/org/apache/doris/master/ReportHandler.java @@ -773,7 +773,7 @@ private static void deleteFromMeta(ListMultimap tabletDeleteFromMeta olapTable.getCompressionType(), olapTable.getEnableUniqueKeyMergeOnWrite(), olapTable.getStoragePolicy(), olapTable.disableAutoCompaction(), - olapTable.storeRowColumn()); + olapTable.storeRowColumn(), olapTable.isDynamicSchema()); createReplicaTask.setIsRecoverTask(true); createReplicaBatchTask.addTask(createReplicaTask); diff --git a/fe/fe-core/src/main/java/org/apache/doris/task/CreateReplicaTask.java b/fe/fe-core/src/main/java/org/apache/doris/task/CreateReplicaTask.java index fcb139fd8f7d0b..ddf7d79d892ad3 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/task/CreateReplicaTask.java +++ b/fe/fe-core/src/main/java/org/apache/doris/task/CreateReplicaTask.java @@ -73,6 +73,8 @@ public class CreateReplicaTask extends AgentTask { private boolean isInMemory; + private boolean isDynamicSchema; + private TTabletType tabletType; // used for synchronous process @@ -112,7 +114,8 @@ public CreateReplicaTask(long backendId, long dbId, long tableId, long partition TCompressionType compressionType, boolean enableUniqueKeyMergeOnWrite, String storagePolicy, boolean disableAutoCompaction, - boolean storeRowColumn) { + boolean storeRowColumn, + boolean isDynamicSchema) { super(null, backendId, TTaskType.CREATE, dbId, tableId, partitionId, indexId, tabletId); this.replicaId = replicaId; @@ -135,6 +138,7 @@ public CreateReplicaTask(long backendId, long dbId, long tableId, long partition this.latch = latch; this.isInMemory = isInMemory; + this.isDynamicSchema = isDynamicSchema; this.tabletType = tabletType; this.dataSortInfo = dataSortInfo; this.enableUniqueKeyMergeOnWrite = (keysType == KeysType.UNIQUE_KEYS && enableUniqueKeyMergeOnWrite); @@ -247,6 +251,7 @@ public TCreateTabletReq toThrift() { tSchema.setIsInMemory(isInMemory); tSchema.setDisableAutoCompaction(disableAutoCompaction); tSchema.setStoreRowColumn(storeRowColumn); + tSchema.setIsDynamicSchema(isDynamicSchema); createTabletReq.setTabletSchema(tSchema); createTabletReq.setVersion(version); diff --git a/fe/fe-core/src/test/java/org/apache/doris/task/AgentTaskTest.java b/fe/fe-core/src/test/java/org/apache/doris/task/AgentTaskTest.java index 5ff129b34b8f1d..fc03ee92896ab3 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/task/AgentTaskTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/task/AgentTaskTest.java @@ -107,7 +107,7 @@ public void setUp() throws AnalysisException { createReplicaTask = new CreateReplicaTask(backendId1, dbId, tableId, partitionId, indexId1, tabletId1, replicaId1, shortKeyNum, schemaHash1, version, KeysType.AGG_KEYS, storageType, TStorageMedium.SSD, columns, null, 0, latch, null, false, TTabletType.TABLET_TYPE_DISK, null, - TCompressionType.LZ4F, false, "", false, false); + TCompressionType.LZ4F, false, "", false, false, false); // drop dropTask = new DropReplicaTask(backendId1, tabletId1, replicaId1, schemaHash1, false); diff --git a/gensrc/proto/olap_file.proto b/gensrc/proto/olap_file.proto index 4e65af4f065a29..16b7cf497d5fce 100644 --- a/gensrc/proto/olap_file.proto +++ b/gensrc/proto/olap_file.proto @@ -229,6 +229,7 @@ message TabletSchemaPB { optional bool disable_auto_compaction = 15 [default=false]; repeated TabletIndexPB index = 16; optional bool store_row_column = 17 [default=false]; // store tuplerow oriented column + optional bool is_dynamic_schema = 18 [default=false]; } enum TabletStatePB { diff --git a/gensrc/thrift/AgentService.thrift b/gensrc/thrift/AgentService.thrift index 4c8b61cf5a200f..831f6c3b9433eb 100644 --- a/gensrc/thrift/AgentService.thrift +++ b/gensrc/thrift/AgentService.thrift @@ -40,6 +40,7 @@ struct TTabletSchema { 12: optional i32 sort_col_num 13: optional bool disable_auto_compaction 14: optional bool store_row_column = false + 15: optional bool is_dynamic_schema = false } // this enum stands for different storage format in src_backends From eb0172402edfde56a18382432c74ba5c3660f42f Mon Sep 17 00:00:00 2001 From: eldenmoon <15605149486@163.com> Date: Mon, 5 Sep 2022 21:21:17 +0800 Subject: [PATCH 07/30] [feature-dynamic-table](syntax) support column which contains '.' like 'a.b.c' --- .../src/main/java/org/apache/doris/common/FeNameFormat.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/FeNameFormat.java b/fe/fe-core/src/main/java/org/apache/doris/common/FeNameFormat.java index b806cfe2711682..6cbce15cf748cb 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/common/FeNameFormat.java +++ b/fe/fe-core/src/main/java/org/apache/doris/common/FeNameFormat.java @@ -28,7 +28,7 @@ public class FeNameFormat { private static final String LABEL_REGEX = "^[-_A-Za-z0-9]{1,128}$"; private static final String COMMON_NAME_REGEX = "^[a-zA-Z][a-zA-Z0-9_]{0,63}$"; private static final String COMMON_TABLE_NAME_REGEX = "^[a-zA-Z][a-zA-Z0-9_]*$"; - private static final String COLUMN_NAME_REGEX = "^[_a-zA-Z@0-9][a-zA-Z0-9_]{0,255}$"; + private static final String COLUMN_NAME_REGEX = "^[_a-zA-Z@0-9][.a-zA-Z0-9_]{0,255}$"; public static final String FORBIDDEN_PARTITION_NAME = "placeholder_"; From 5239393338af9e4e69de31a90011a4770d37a4bd Mon Sep 17 00:00:00 2001 From: eldenmoon <15605149486@163.com> Date: Tue, 6 Sep 2022 11:38:27 +0800 Subject: [PATCH 08/30] [feature-dynamic-table](schemachange) support addColumns rpc and adapt code for ArrayType --- .../org/apache/doris/analysis/ColumnDef.java | 10 +- .../org/apache/doris/analysis/TypeDef.java | 24 +++ .../main/java/org/apache/doris/load/Load.java | 45 ++++- .../doris/planner/StreamLoadPlanner.java | 1 + .../doris/service/FrontendServiceImpl.java | 169 ++++++++++++++++++ gensrc/thrift/FrontendService.thrift | 21 +++ 6 files changed, 259 insertions(+), 11 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ColumnDef.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ColumnDef.java index 5d9fd884aaefa2..c589e9fd9f0c54 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ColumnDef.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ColumnDef.java @@ -98,6 +98,8 @@ public DefaultValue(boolean isSet, String value, String exprName) { public static DefaultValue HLL_EMPTY_DEFAULT_VALUE = new DefaultValue(true, ZERO); // default "value", "0" means empty bitmap public static DefaultValue BITMAP_EMPTY_DEFAULT_VALUE = new DefaultValue(true, ZERO); + // default "value", "[]" means empty array + public static DefaultValue ARRAY_EMPTY_DEFAULT_VALUE = new DefaultValue(true, "[]"); public boolean isCurrentTimeStamp() { return "CURRENT_TIMESTAMP".equals(value) && NOW.equals(defaultValueExprDef.getExprName()); @@ -290,8 +292,10 @@ public void analyze(boolean isOlap) throws AnalysisException { throw new AnalysisException("Array can only be used in the non-key column of" + " the duplicate table at present."); } - if (defaultValue.isSet && defaultValue != DefaultValue.NULL_DEFAULT_VALUE) { - throw new AnalysisException("Array type column default value only support null"); + if (defaultValue.isSet && defaultValue != DefaultValue.null_default_value + && !defaultValue.value.equals(DefaultValue.ARRAY_EMPTY_DEFAULT_VALUE.value)) { + throw new AnalysisException("Array type column default value only support null or " + + DefaultValue.ARRAY_EMPTY_DEFAULT_VALUE.value); } } if (isKey() && type.getPrimitiveType() == PrimitiveType.STRING && isOlap) { @@ -337,7 +341,7 @@ public void analyze(boolean isOlap) throws AnalysisException { throw new AnalysisException("Can not set null default value to non nullable column: " + name); } - if (defaultValue.isSet && defaultValue.value != null) { + if (type.isScalarType() && defaultValue.isSet && defaultValue.value != null) { validateDefaultValue(type, defaultValue.value, defaultValue.defaultValueExprDef); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/TypeDef.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/TypeDef.java index c89c6592074547..c75259050d833e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/TypeDef.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/TypeDef.java @@ -28,6 +28,10 @@ import org.apache.doris.catalog.StructType; import org.apache.doris.catalog.Type; import org.apache.doris.common.AnalysisException; +import org.apache.doris.thrift.TColumnDesc; +import org.apache.doris.thrift.TPrimitiveType; + +import com.google.common.base.Preconditions; import java.util.ArrayList; import java.util.HashSet; @@ -68,6 +72,26 @@ public static TypeDef createChar(int len) { return new TypeDef(ScalarType.createChar(len)); } + public static Type createType(TColumnDesc tColumnDesc) { + TPrimitiveType tPrimitiveType = tColumnDesc.getColumnType(); + PrimitiveType ptype = PrimitiveType.fromThrift(tPrimitiveType); + if (ptype.isArrayType()) { + // just support array for now + Preconditions.checkState(tColumnDesc.getChildren().size() == 1); + return new ArrayType(createType(tColumnDesc.getChildren().get(0)), + tColumnDesc.getChildren().get(0).isIsAllowNull()); + } + // scarlar type + int columnLength = tColumnDesc.getColumnLength(); + int columnPrecision = tColumnDesc.getColumnPrecision(); + int columnScale = tColumnDesc.getColumnScale(); + return ScalarType.createType(ptype, columnLength, columnPrecision, columnScale); + } + + public static TypeDef createTypeDef(TColumnDesc tcolumnDef) { + return new TypeDef(createType(tcolumnDef)); + } + @Override public void analyze(Analyzer analyzer) throws AnalysisException { if (isAnalyzed) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/Load.java b/fe/fe-core/src/main/java/org/apache/doris/load/Load.java index 3dda0456c1ffca..1da53d1c6de62b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/load/Load.java +++ b/fe/fe-core/src/main/java/org/apache/doris/load/Load.java @@ -720,20 +720,49 @@ private static void initColumns(Table tbl, List columnExprs, slotDesc.setIsNullable(tblColumn.isAllowNull()); } } else { - // columns default be varchar type - slotDesc.setType(ScalarType.createType(PrimitiveType.VARCHAR)); - slotDesc.setColumn(new Column(realColName, PrimitiveType.VARCHAR)); - // ISSUE A: src slot should be nullable even if the column is not nullable. - // because src slot is what we read from file, not represent to real column value. - // If column is not nullable, error will be thrown when filling the dest slot, - // which is not nullable. - slotDesc.setIsNullable(true); + if (useVectorizedLoad && formatType == TFileFormatType.FORMAT_JSON + && tbl instanceof OlapTable && ((OlapTable) tbl).isDynamicSchema()) { + slotDesc.setType(tblColumn.getType()); + slotDesc.setColumn(new Column(realColName, tblColumn.getType())); + slotDesc.setIsNullable(tblColumn.isAllowNull()); + } else { + // columns default be varchar type + slotDesc.setType(ScalarType.createType(PrimitiveType.VARCHAR)); + slotDesc.setColumn(new Column(realColName, PrimitiveType.VARCHAR)); + // ISSUE A: src slot should be nullable even if the column is not nullable. + // because src slot is what we read from file, not represent to real column value. + // If column is not nullable, error will be thrown when filling the dest slot, + // which is not nullable. + slotDesc.setIsNullable(true); + } } slotDesc.setIsMaterialized(true); srcSlotIds.add(slotDesc.getId().asInt()); slotDescByName.put(realColName, slotDesc); } } + + // add a implict container column "__dynamic__" for dynamic columns + if (tbl instanceof OlapTable && ((OlapTable) tbl).isDynamicSchema()) { + if (!useVectorizedLoad) { + throw new UserException("Dynamic table need vectorized load, for table " + tbl.getName()); + } + analyzer.getDescTbl().addReferencedTable(tbl); + SlotDescriptor slotDesc = analyzer.getDescTbl().addSlotDescriptor(srcTupleDesc); + String name = Column.DYNAMIC_COLUMN_NAME; + Column col = new Column(name, Type.VARIANT, false, null, false, "", + "stream load auto dynamic column"); + slotDesc.setType(Type.VARIANT); + slotDesc.setColumn(col); + // alaways nullable + slotDesc.setIsNullable(true); + slotDesc.setIsMaterialized(true); + params.addToSrcSlotIds(slotDesc.getId().asInt()); + slotDescByName.put(name, slotDesc); + LOG.debug("add dynamic column to srcTupleDesc with name:{} id:{}", name, slotDesc.getId().asInt()); + } + LOG.debug("plan srcTupleDesc {}", srcTupleDesc.toString()); + /* * The extension column of the materialized view is added to the expression evaluation of load * To avoid nested expressions. eg : column(a, tmp_c, c = expr(tmp_c)) , diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/StreamLoadPlanner.java b/fe/fe-core/src/main/java/org/apache/doris/planner/StreamLoadPlanner.java index b8a0074d26454b..ff17c4ac870f09 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/StreamLoadPlanner.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/StreamLoadPlanner.java @@ -36,6 +36,7 @@ import org.apache.doris.catalog.PartitionInfo; import org.apache.doris.catalog.PartitionItem; import org.apache.doris.catalog.PartitionType; +import org.apache.doris.catalog.Type; import org.apache.doris.common.AnalysisException; import org.apache.doris.common.Config; import org.apache.doris.common.DdlException; diff --git a/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java b/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java index 19dde33b652a03..fb30ef9abf4de2 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java +++ b/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java @@ -18,13 +18,19 @@ package org.apache.doris.service; import org.apache.doris.alter.DecommissionType; +import org.apache.doris.alter.SchemaChangeHandler; +import org.apache.doris.analysis.AddColumnsClause; +import org.apache.doris.analysis.ColumnDef; import org.apache.doris.analysis.SetType; +import org.apache.doris.analysis.TableName; +import org.apache.doris.analysis.TypeDef; import org.apache.doris.analysis.UserIdentity; import org.apache.doris.catalog.Column; import org.apache.doris.catalog.Database; import org.apache.doris.catalog.DatabaseIf; import org.apache.doris.catalog.Env; import org.apache.doris.catalog.HMSResource; +import org.apache.doris.catalog.Index; import org.apache.doris.catalog.OlapTable; import org.apache.doris.catalog.Table; import org.apache.doris.catalog.TableIf; @@ -64,6 +70,9 @@ import org.apache.doris.task.StreamLoadTask; import org.apache.doris.thrift.FrontendService; import org.apache.doris.thrift.FrontendServiceVersion; +import org.apache.doris.thrift.TAddColumnsRequest; +import org.apache.doris.thrift.TAddColumnsResult; +import org.apache.doris.thrift.TColumn; import org.apache.doris.thrift.TCell; import org.apache.doris.thrift.TColumnDef; import org.apache.doris.thrift.TColumnDesc; @@ -140,12 +149,17 @@ import java.time.Instant; import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import java.util.function.IntSupplier; // Frontend service used to serve all request for this frontend through // thrift protocol @@ -214,6 +228,161 @@ public TGetDbsResult getDbNames(TGetDbsParams params) throws TException { return result; } + private static ColumnDef initColumnfromThrift(TColumnDesc tColumnDesc, String comment) { + TypeDef typeDef = TypeDef.createTypeDef(tColumnDesc); + boolean isAllowNull = tColumnDesc.isIsAllowNull(); + ColumnDef.DefaultValue defaultVal = ColumnDef.DefaultValue.NOT_SET; + // Dynamic table's Array default value should be '[]' + if (typeDef.getType().isArrayType()) { + defaultVal = ColumnDef.DefaultValue.ARRAY_EMPTY_DEFAULT_VALUE; + } + return new ColumnDef(tColumnDesc.getColumnName(), typeDef, false, null, isAllowNull, defaultVal, + comment, true); + } + + @Override + public TAddColumnsResult addColumns(TAddColumnsRequest request) throws TException { + String clientAddr = getClientAddrAsString(); + LOG.debug("schema change clientAddr: {}, request: {}", clientAddr, request); + + TStatus status = new TStatus(TStatusCode.OK); + List allColumns = new ArrayList(); + + Env env = Env.getCurrentEnv(); + InternalCatalog catalog = env.getInternalCatalog(); + int schemaVersion = 0; + try { + if (!env.isMaster()) { + status.setStatusCode(TStatusCode.ILLEGAL_STATE); + status.addToErrorMsgs("retry rpc request to master."); + TAddColumnsResult result = new TAddColumnsResult(status, request.getTableId(), allColumns, 0); + LOG.debug("result: {}", result); + return result; + } + TableName tableName = new TableName("", request.getDbName(), request.getTableName()); + if (request.getTableId() > 0) { + tableName = catalog.getTableNameByTableId(request.getTableId()); + } + if (tableName == null) { + throw new MetaNotFoundException("table_id " + request.getTableId() + " does not exist"); + } + + Database db = catalog.getDbNullable(tableName.getDb()); + if (db == null) { + throw new MetaNotFoundException("db " + tableName.getDb() + " does not exist"); + } + + List addColumns = request.getAddColumns(); + boolean queryMode = false; + if (addColumns == null || addColumns.size() == 0) { + queryMode = true; + } + + // rpc only olap table + OlapTable olapTable = (OlapTable) db.getTableOrMetaException(tableName.getTbl(), TableType.OLAP); + olapTable.writeLockOrMetaException(); + + try { + List columnDefs = new ArrayList(); + + // prepare columnDefs + for (TColumnDef tColumnDef : addColumns) { + if (request.isTypeConflictFree()) { + // ignore column with same name + boolean hasSameNameColumn = false; + for (Column column : olapTable.getBaseSchema()) { + if (column.getName().equals(tColumnDef.getColumnDesc().getColumnName())) { + hasSameNameColumn = true; + } + } + // ignore this column + if (hasSameNameColumn) { + continue; + } + } + String comment = tColumnDef.getComment(); + if (comment == null || comment.length() == 0) { + Instant ins = Instant.ofEpochSecond(1568568760); + ZonedDateTime zdt = ins.atZone(ZoneId.systemDefault()); + comment = "auto change " + zdt.toString(); + } + + TColumnDesc tColumnDesc = tColumnDef.getColumnDesc(); + ColumnDef columnDef = initColumnfromThrift(tColumnDesc, comment); + columnDefs.add(columnDef); + } + + if (!queryMode && !columnDefs.isEmpty()) { + //3.create AddColumnsClause + AddColumnsClause addColumnsClause = new AddColumnsClause(columnDefs, null, null); + addColumnsClause.analyze(null); + + // index id -> index schema + Map> indexSchemaMap = new HashMap<>(); + //index id -> index col_unique_id supplier + Map colUniqueIdSupplierMap = new HashMap<>(); + for (Map.Entry> entry : olapTable.getIndexIdToSchema(true).entrySet()) { + indexSchemaMap.put(entry.getKey(), new LinkedList<>(entry.getValue())); + IntSupplier colUniqueIdSupplier = null; + if (olapTable.getEnableLightSchemaChange()) { + colUniqueIdSupplier = new IntSupplier() { + public int pendingMaxColUniqueId = olapTable + .getIndexMetaByIndexId(entry.getKey()).getMaxColUniqueId(); + @Override + public int getAsInt() { + pendingMaxColUniqueId++; + return pendingMaxColUniqueId; + } + }; + } + colUniqueIdSupplierMap.put(entry.getKey(), colUniqueIdSupplier); + } + //4. call schame change function, only for dynamic table feature. + SchemaChangeHandler schemaChangeHandler = new SchemaChangeHandler(); + + boolean lightSchemaChange = schemaChangeHandler.processAddColumns( + addColumnsClause, olapTable, indexSchemaMap, true, colUniqueIdSupplierMap); + if (lightSchemaChange) { + //for schema change add column optimize, direct modify table meta. + List newIndexes = olapTable.getCopiedIndexes(); + long jobId = Env.getCurrentEnv().getNextId(); + Env.getCurrentEnv().getSchemaChangeHandler().modifyTableAddOrDropColumns( + db, olapTable, indexSchemaMap, newIndexes, jobId, false); + } else { + throw new MetaNotFoundException("table_id " + + request.getTableId() + " cannot light schema change through rpc."); + } + } + + //5. build all columns + for (Column column : olapTable.getBaseSchema()) { + allColumns.add(column.toThrift()); + } + schemaVersion = olapTable.getBaseSchemaVersion(); + } catch (Exception e) { + LOG.warn("got exception add columns: ", e); + status.setStatusCode(TStatusCode.INTERNAL_ERROR); + status.addToErrorMsgs(e.getMessage()); + } finally { + olapTable.writeUnlock(); + } + } catch (MetaNotFoundException e) { + status.setStatusCode(TStatusCode.NOT_FOUND); + status.addToErrorMsgs(e.getMessage()); + } catch (UserException e) { + status.setStatusCode(TStatusCode.INVALID_ARGUMENT); + status.addToErrorMsgs(e.getMessage()); + } catch (Exception e) { + LOG.warn("got exception add columns: ", e); + status.setStatusCode(TStatusCode.INTERNAL_ERROR); + status.addToErrorMsgs(e.getMessage()); + } + + TAddColumnsResult result = new TAddColumnsResult(status, request.getTableId(), allColumns, schemaVersion); + LOG.debug("result: {}", result); + return result; + } + @Override public TGetTablesResult getTableNames(TGetTablesParams params) throws TException { LOG.debug("get table name request: {}", params); diff --git a/gensrc/thrift/FrontendService.thrift b/gensrc/thrift/FrontendService.thrift index 457e78020db64f..21c7adb89d27d3 100644 --- a/gensrc/thrift/FrontendService.thrift +++ b/gensrc/thrift/FrontendService.thrift @@ -50,6 +50,7 @@ struct TColumnDesc { 5: optional i32 columnScale 6: optional bool isAllowNull 7: optional string columnKey + 8: optional list children } // A column definition; used by CREATE TABLE and DESCRIBE statements. A column @@ -716,6 +717,23 @@ struct TFetchSchemaTableDataResult { 2: optional list data_batch; } +// Only support base table add columns +struct TAddColumnsRequest { + 1: required i64 table_id + 2: required list addColumns + 3: optional string table_name + 4: optional string db_name + 5: optional bool type_conflict_free +} + +// Only support base table add columns +struct TAddColumnsResult { + 1: required Status.TStatus status + 2: required i64 table_id + 3: required list allColumns + 4: required i32 schema_version +} + service FrontendService { TGetDbsResult getDbNames(1: TGetDbsParams params) TGetTablesResult getTableNames(1: TGetTablesParams params) @@ -750,6 +768,9 @@ service FrontendService { TFrontendPingFrontendResult ping(1: TFrontendPingFrontendRequest request) + TAddColumnsResult addColumns(1: TAddColumnsRequest request) + + AgentService.TGetStoragePolicyResult refreshStoragePolicy() TInitExternalCtlMetaResult initExternalCtlMeta(1: TInitExternalCtlMetaRequest request) TFetchSchemaTableDataResult fetchSchemaTableData(1: TFetchSchemaTableDataRequest request) From d3e5e299d7d1a863a1516b67f40626724c410f24 Mon Sep 17 00:00:00 2001 From: eldenmoon <15605149486@163.com> Date: Tue, 6 Sep 2022 13:48:28 +0800 Subject: [PATCH 09/30] [feature-dynamic-table](vtablet_sink) support sink block with extended columns --- be/src/vec/sink/vtablet_sink.cpp | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/be/src/vec/sink/vtablet_sink.cpp b/be/src/vec/sink/vtablet_sink.cpp index 0ad8458f13a26c..de07926de2d17d 100644 --- a/be/src/vec/sink/vtablet_sink.cpp +++ b/be/src/vec/sink/vtablet_sink.cpp @@ -225,8 +225,6 @@ Status VNodeChannel::init(RuntimeState* state) { _rpc_timeout_ms = state->query_options().query_timeout * 1000; _timeout_watch.start(); - _cur_mutable_block.reset(new vectorized::MutableBlock({_tuple_desc})); - // Initialize _cur_add_block_request _cur_add_block_request.set_allocated_id(&_parent->_load_id); _cur_add_block_request.set_index_id(_index_channel->_index_id); @@ -448,7 +446,7 @@ Status VNodeChannel::add_block(vectorized::Block* block, << " loadinfo:" << _load_info; } - _cur_mutable_block.reset(new vectorized::MutableBlock({_tuple_desc})); + _cur_mutable_block.reset(new vectorized::MutableBlock(block_row.first->clone_empty())); _cur_add_block_request.clear_tablet_ids(); } @@ -731,6 +729,10 @@ void VNodeChannel::mark_close() { { debug::ScopedTSANIgnoreReadsAndWrites ignore_tsan; std::lock_guard l(_pending_batches_lock); + if (!_cur_mutable_block) { + // add a dummy block + _cur_mutable_block.reset(new vectorized::MutableBlock()); + } _pending_blocks.emplace(std::move(_cur_mutable_block), _cur_add_block_request); _pending_batches_num++; DCHECK(_pending_blocks.back().second.eos()); @@ -1269,12 +1271,24 @@ Status VOlapTableSink::_validate_column(RuntimeState* state, const TypeDescripto return ret; }; +<<<<<<< HEAD auto column_ptr = vectorized::check_and_get_column(*column); auto& real_column_ptr = column_ptr == nullptr ? column : (column_ptr->get_nested_column_ptr()); auto null_map = column_ptr == nullptr ? nullptr : column_ptr->get_null_map_data().data(); auto need_to_validate = [&null_map, &filter_bitmap](size_t j, size_t row) { return !filter_bitmap->Get(row) && (null_map == nullptr || null_map[j] == 0); }; +======= + for (int i = 0; i < _output_tuple_desc->slots().size() && i < block->columns(); ++i) { + SlotDescriptor* desc = _output_tuple_desc->slots()[i]; + block->get_by_position(i).column = + block->get_by_position(i).column->convert_to_full_column_if_const(); + const auto& column = block->get_by_position(i).column; + + auto column_ptr = vectorized::check_and_get_column(*column); + auto& real_column_ptr = + column_ptr == nullptr ? column : (column_ptr->get_nested_column_ptr()); +>>>>>>> f25377f4b7 ([feature-dynamic-table](vtablet_sink) support sink block with extended columns) ssize_t last_invalid_row = -1; switch (type.type) { @@ -1453,7 +1467,7 @@ Status VOlapTableSink::_validate_data(RuntimeState* state, vectorized::Block* bl } void VOlapTableSink::_convert_to_dest_desc_block(doris::vectorized::Block* block) { - for (int i = 0; i < _output_tuple_desc->slots().size(); ++i) { + for (int i = 0; i < _output_tuple_desc->slots().size() && i < block->columns(); ++i) { SlotDescriptor* desc = _output_tuple_desc->slots()[i]; if (desc->is_nullable() != block->get_by_position(i).type->is_nullable()) { if (desc->is_nullable()) { From 766a4e53d103fc8ff769f4830113ad1c7d2b7125 Mon Sep 17 00:00:00 2001 From: eldenmoon <15605149486@163.com> Date: Tue, 6 Sep 2022 14:06:28 +0800 Subject: [PATCH 10/30] [feature-dynamic-table](vec/block) add names to MutableBlock --- be/src/vec/core/block.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/be/src/vec/core/block.h b/be/src/vec/core/block.h index 1e32b506b49a98..c0ba4ffe0c88fc 100644 --- a/be/src/vec/core/block.h +++ b/be/src/vec/core/block.h @@ -524,8 +524,8 @@ class MutableBlock { void swap(MutableBlock&& other) noexcept; void add_row(const Block* block, int row); - void add_rows(const Block* block, const int* row_begin, const int* row_end); - void add_rows(const Block* block, size_t row_begin, size_t length); + void add_rows(const Block* block, const int* row_begin, const int* row_end, bool align = false); + void add_rows(const Block* block, size_t row_begin, size_t length, bool align = false); std::string dump_data(size_t row_limit = 100) const; From a61ba90f639e5da76ff5aa017902d4b86851f8dd Mon Sep 17 00:00:00 2001 From: eldenmoon <15605149486@163.com> Date: Tue, 6 Sep 2022 16:06:20 +0800 Subject: [PATCH 11/30] [feature-dynamic-table](load) support dynamic table load 1. Load plan, inject variant type in the tuple descriptor end slot 2. VJsonScanner, parse json docs to dynamic column and extract columns 3. BaseScanner _materialize_dest_block 4. VBrokerScannode, adapt variant Block, since block schema may change during scan 5. VTabletSink, adapt variant Block, since block schema may change during sink --- be/src/common/consts.h | 1 + be/src/exec/base_scanner.cpp | 37 +++++++++++++++++++ be/src/exec/base_scanner.h | 7 ++++ be/src/exec/tablet_info.h | 1 + be/src/runtime/descriptors.cpp | 1 + be/src/runtime/descriptors.h | 2 + be/src/vec/core/block.cpp | 15 +++++++- be/src/vec/sink/vtablet_sink.cpp | 33 +++++++++++++++++ be/src/vec/sink/vtablet_sink.h | 11 ++++++ .../java/org/apache/doris/catalog/Column.java | 1 + .../doris/planner/StreamLoadPlanner.java | 14 +++++++ 11 files changed, 121 insertions(+), 2 deletions(-) diff --git a/be/src/common/consts.h b/be/src/common/consts.h index bf7a2e6013cd66..0f8ce9bdd8469e 100644 --- a/be/src/common/consts.h +++ b/be/src/common/consts.h @@ -27,6 +27,7 @@ const std::string CSV_WITH_NAMES_AND_TYPES = "csv_with_names_and_types"; const std::string BLOCK_TEMP_COLUMN_PREFIX = "__TEMP__"; const std::string ROWID_COL = "__DORIS_ROWID_COL__"; const std::string ROW_STORE_COL = "__DORIS_ROW_STORE_COL__"; +const std::string DYNAMIC_COLUMN_NAME = "__DORIS_DYNAMIC_COL__"; constexpr int MAX_DECIMAL32_PRECISION = 9; constexpr int MAX_DECIMAL64_PRECISION = 18; diff --git a/be/src/exec/base_scanner.cpp b/be/src/exec/base_scanner.cpp index eb3075f481e9d3..66670c7aed0571 100644 --- a/be/src/exec/base_scanner.cpp +++ b/be/src/exec/base_scanner.cpp @@ -19,6 +19,7 @@ #include +#include "common/consts.h" #include "common/utils.h" #include "exec/exec_node.h" #include "runtime/descriptors.h" @@ -51,6 +52,7 @@ BaseScanner::BaseScanner(RuntimeState* state, RuntimeProfile* profile, _scanner_eof(false) {} Status BaseScanner::open() { + _full_base_schema_view.reset(new vectorized::object_util::FullBaseSchemaView); RETURN_IF_ERROR(init_expr_ctxes()); if (_params.__isset.strict_mode) { _strict_mode = _params.strict_mode; @@ -102,6 +104,11 @@ Status BaseScanner::init_expr_ctxes() { return Status::InternalError("Unknown source slot descriptor, slot_id={}", slot_id); } _src_slot_descs.emplace_back(it->second); + + if (it->second->type().is_variant() && + it->second->col_name() == BeConsts::DYNAMIC_COLUMN_NAME) { + _is_dynamic_schema = true; + } } _row_desc.reset(new RowDescriptor(_state->desc_tbl(), std::vector({_params.src_tuple_id}), @@ -156,6 +163,11 @@ Status BaseScanner::init_expr_ctxes() { } } } + if (_dest_tuple_desc->table_desc()) { + _full_base_schema_view->db_name = _dest_tuple_desc->table_desc()->database(); + _full_base_schema_view->table_name = _dest_tuple_desc->table_desc()->name(); + _full_base_schema_view->table_id = _dest_tuple_desc->table_desc()->table_id(); + } return Status::OK(); } @@ -181,6 +193,9 @@ Status BaseScanner::_materialize_dest_block(vectorized::Block* dest_block) { if (!slot_desc->is_materialized()) { continue; } + if (slot_desc->type().is_variant()) { + continue; + } int dest_index = ctx_idx++; auto* ctx = _dest_vexpr_ctx[dest_index]; @@ -250,6 +265,28 @@ Status BaseScanner::_materialize_dest_block(vectorized::Block* dest_block) { std::move(column_ptr), slot_desc->get_data_type_ptr(), slot_desc->col_name())); } + // handle dynamic generated columns + if (!_full_base_schema_view->empty()) { + assert(_is_dynamic_schema); + for (size_t x = dest_block->columns(); x < _src_block.columns(); ++x) { + auto& column_type_name = _src_block.get_by_position(x); + const TColumn& tcolumn = + _full_base_schema_view->column_name_to_column[column_type_name.name]; + auto original_type = vectorized::DataTypeFactory::instance().create_data_type(tcolumn); + // type conflict free path, always cast to original type + if (!column_type_name.type->equals(*original_type)) { + vectorized::ColumnPtr column_ptr; + RETURN_IF_ERROR(vectorized::object_util::cast_column(column_type_name, + original_type, &column_ptr)); + column_type_name.column = column_ptr; + column_type_name.type = original_type; + } + dest_block->insert(vectorized::ColumnWithTypeAndName(std::move(column_type_name.column), + std::move(column_type_name.type), + column_type_name.name)); + } + } + // after do the dest block insert operation, clear _src_block to remove the reference of origin column if (_src_block_mem_reuse) { _src_block.clear_column_data(origin_column_num); diff --git a/be/src/exec/base_scanner.h b/be/src/exec/base_scanner.h index 972682a0c13a25..586578934a3eda 100644 --- a/be/src/exec/base_scanner.h +++ b/be/src/exec/base_scanner.h @@ -19,6 +19,7 @@ #include "common/status.h" #include "util/runtime_profile.h" +#include "vec/common/object_util.h" #include "vec/exprs/vexpr.h" #include "vec/exprs/vexpr_context.h" @@ -65,6 +66,8 @@ class BaseScanner { // Close this scanner virtual void close() = 0; + bool is_dynamic_schema() const { return _is_dynamic_schema; } + protected: Status _fill_dest_block(vectorized::Block* dest_block, bool* eof); virtual Status _init_src_block(); @@ -124,6 +127,10 @@ class BaseScanner { // slot_ids for parquet predicate push down are in tuple desc TupleId _tupleId = -1; + bool _is_dynamic_schema = false; + // for tracing dynamic schema + std::unique_ptr _full_base_schema_view; + private: Status _filter_src_block(); void _fill_columns_from_path(); diff --git a/be/src/exec/tablet_info.h b/be/src/exec/tablet_info.h index e21081544916e0..c125011f7d98d4 100644 --- a/be/src/exec/tablet_info.h +++ b/be/src/exec/tablet_info.h @@ -90,6 +90,7 @@ using OlapTableIndexTablets = TOlapTableIndexTablets; // } using BlockRow = std::pair; +using VecBlock = vectorized::Block; struct VOlapTablePartition { int64_t id = 0; diff --git a/be/src/runtime/descriptors.cpp b/be/src/runtime/descriptors.cpp index 5f392e700ae084..01ed59eaac178e 100644 --- a/be/src/runtime/descriptors.cpp +++ b/be/src/runtime/descriptors.cpp @@ -123,6 +123,7 @@ std::string SlotDescriptor::debug_string() const { TableDescriptor::TableDescriptor(const TTableDescriptor& tdesc) : _name(tdesc.tableName), _database(tdesc.dbName), + _table_id(tdesc.id), _num_cols(tdesc.numCols), _num_clustering_cols(tdesc.numClusteringCols) {} diff --git a/be/src/runtime/descriptors.h b/be/src/runtime/descriptors.h index c9fec4f933a0dc..fd75a5ad032987 100644 --- a/be/src/runtime/descriptors.h +++ b/be/src/runtime/descriptors.h @@ -178,10 +178,12 @@ class TableDescriptor { const std::string& name() const { return _name; } const std::string& database() const { return _database; } + int32_t table_id() const { return _table_id; } private: std::string _name; std::string _database; + int32_t _table_id; int _num_cols; int _num_clustering_cols; }; diff --git a/be/src/vec/core/block.cpp b/be/src/vec/core/block.cpp index b608a6ac4928a2..427e194486cf91 100644 --- a/be/src/vec/core/block.cpp +++ b/be/src/vec/core/block.cpp @@ -38,6 +38,8 @@ #include "vec/columns/column_vector.h" #include "vec/columns/columns_number.h" #include "vec/common/assert_cast.h" +#include "vec/common/exception.h" +#include "vec/common/object_util.h" #include "vec/common/string_ref.h" #include "vec/common/typeid_cast.h" #include "vec/data_types/data_type_factory.hpp" @@ -868,7 +870,12 @@ void MutableBlock::add_row(const Block* block, int row) { } } -void MutableBlock::add_rows(const Block* block, const int* row_begin, const int* row_end) { +void MutableBlock::add_rows(const Block* block, const int* row_begin, const int* row_end, + bool align) { + if (align) { + object_util::align_block_by_name_and_type(this, block, row_begin, row_end); + return; + } auto& block_data = block->get_columns_with_type_and_name(); for (size_t i = 0; i < _columns.size(); ++i) { auto& dst = _columns[i]; @@ -877,7 +884,11 @@ void MutableBlock::add_rows(const Block* block, const int* row_begin, const int* } } -void MutableBlock::add_rows(const Block* block, size_t row_begin, size_t length) { +void MutableBlock::add_rows(const Block* block, size_t row_begin, size_t length, bool align) { + if (align) { + object_util::align_block_by_name_and_type(this, block, row_begin, length); + return; + } auto& block_data = block->get_columns_with_type_and_name(); for (size_t i = 0; i < _columns.size(); ++i) { auto& dst = _columns[i]; diff --git a/be/src/vec/sink/vtablet_sink.cpp b/be/src/vec/sink/vtablet_sink.cpp index de07926de2d17d..5d00df089a4127 100644 --- a/be/src/vec/sink/vtablet_sink.cpp +++ b/be/src/vec/sink/vtablet_sink.cpp @@ -744,6 +744,39 @@ void VNodeChannel::mark_close() { _eos_is_produced = true; } +void VNodeChannel::force_send_cur_block() { + if (_cur_mutable_block->rows() > 0) { + SCOPED_ATOMIC_TIMER(&_queue_push_lock_ns); + std::lock_guard l(_pending_batches_lock); + // To simplify the add_row logic, postpone adding block into req until the time of sending req + _pending_batches_bytes += _cur_mutable_block->allocated_bytes(); + _pending_blocks.emplace(std::move(_cur_mutable_block), _cur_add_block_request); + _pending_batches_num++; + } + + _cur_mutable_block.reset(nullptr); + _cur_add_block_request.clear_tablet_ids(); +} + +bool VNodeChannel::fitted_with(VecBlock* input_block) { + if (_cur_mutable_block == nullptr) { + return true; + } + if (input_block->columns() != _cur_mutable_block->columns()) { + return false; + } + const std::vector& names = _cur_mutable_block->get_names(); + for (size_t i = 0; i < input_block->columns(); ++i) { + auto& column_type_name = input_block->get_by_position(i); + if (column_type_name.name != names[i] || + !column_type_name.type->equals(*_cur_mutable_block->get_datatype_by_position(i))) { + return false; + } + } + + return true; +} + VOlapTableSink::VOlapTableSink(ObjectPool* pool, const RowDescriptor& row_desc, const std::vector& texprs, Status* status) : _pool(pool), diff --git a/be/src/vec/sink/vtablet_sink.h b/be/src/vec/sink/vtablet_sink.h index 04809a6eca72bb..336a79668501f7 100644 --- a/be/src/vec/sink/vtablet_sink.h +++ b/be/src/vec/sink/vtablet_sink.h @@ -228,6 +228,17 @@ class VNodeChannel { size_t get_pending_bytes() { return _pending_batches_bytes; } + // if input block fitted with NodeChannel's pending block + // dynamic table may return false, since block schema may be changed + // during sink + bool fitted_with(VecBlock* input_block) override; + + // force to send current block to pending queue + // usually when input block not fitted with _cur_mutable_block + // we need to flush it to down stream or input block could be conflict + // with _cur_mutable_block + void force_send_cur_block() override; + protected: void _close_check(); void _cancel_with_msg(const std::string& msg); diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Column.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/Column.java index a4f00f4bf3cfda..f363b66c2d67b3 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Column.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Column.java @@ -60,6 +60,7 @@ public class Column implements Writable, GsonPostProcessable { public static final String SEQUENCE_COL = "__DORIS_SEQUENCE_COL__"; public static final String ROWID_COL = "__DORIS_ROWID_COL__"; public static final String ROW_STORE_COL = "__DORIS_ROW_STORE_COL__"; + public static final String DYNAMIC_COLUMN_NAME = "__DORIS_DYNAMIC_COL__"; private static final String COLUMN_ARRAY_CHILDREN = "item"; private static final String COLUMN_STRUCT_CHILDREN = "field"; public static final int COLUMN_UNIQUE_ID_INIT_VALUE = -1; diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/StreamLoadPlanner.java b/fe/fe-core/src/main/java/org/apache/doris/planner/StreamLoadPlanner.java index ff17c4ac870f09..0491d68edb673a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/StreamLoadPlanner.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/StreamLoadPlanner.java @@ -170,6 +170,20 @@ public TExecPlanFragmentParams plan(TUniqueId loadId) throws UserException { } } + if (destTable.isDynamicSchema()) { + descTable.addReferencedTable(destTable); + tupleDesc.setTable(destTable); + // add a implict container column "__dynamic__" for dynamic columns + SlotDescriptor slotDesc = descTable.addSlotDescriptor(tupleDesc); + Column col = new Column(Column.DYNAMIC_COLUMN_NAME, Type.VARIANT, false, null, false, "", + "stream load auto dynamic column"); + slotDesc.setIsMaterialized(true); + slotDesc.setColumn(col); + // alaways nullable + slotDesc.setIsNullable(true); + LOG.debug("plan tupleDesc {}", tupleDesc.toString()); + } + // create scan node ExternalFileScanNode fileScanNode = new ExternalFileScanNode(new PlanNodeId(0), scanTupleDesc); // 1. create file group From 6a362ccddb0fd8aedb29c108fcb75a08bc50c697 Mon Sep 17 00:00:00 2001 From: eldenmoon <15605149486@163.com> Date: Wed, 7 Sep 2022 20:21:07 +0800 Subject: [PATCH 12/30] []ture-dynamic-table](regression-test) add regression-test --- .../data/dynamic_table/btc_transactions.json | 100 + .../dynamic_bigint_contact_phone.json | 4 + .../dynamic_table/dynamic_date_birthday.json | 4 + .../dynamic_table/dynamic_feishu_alarm.json | 116 + .../dynamic_table/dynamic_github_events.json | 13 + .../dynamic_simple_type_confiic_data.json | 4 + .../dynamic_simple_type_conflic_data.json | 4 + .../dynamic_string_birthday.json | 4 + .../dynamic_string_contact_phone.json | 4 + .../dynamic_timestamp_birthday.json | 4 + .../data/dynamic_table/es_nested.json | 1015 ++++ .../data/dynamic_table/ghdata_sample.json | 5000 +++++++++++++++++ .../data/dynamic_table/nbagames_sample.json | 1000 ++++ .../data/dynamic_table/sql/q01.out | 223 + .../data/dynamic_table/sql/q02.out | 35 + .../data/dynamic_table/sql/q03.out | 23 + .../data/dynamic_table/sql/q04.out | 34 + .../test_dytable_complex_data.out | 156 + .../suites/dynamic_table/create_table.groovy | 51 + .../suites/dynamic_table/load.groovy | 98 + .../suites/dynamic_table/sql/q01.sql | 8 + .../suites/dynamic_table/sql/q02.sql | 10 + .../suites/dynamic_table/sql/q03.sql | 7 + .../test_create_dynamic_table.groovy | 139 + .../test_dytable_alter_type.groovy | 226 + .../test_dytable_complex_data.groovy | 279 + 26 files changed, 8561 insertions(+) create mode 100644 regression-test/data/dynamic_table/btc_transactions.json create mode 100644 regression-test/data/dynamic_table/dynamic_bigint_contact_phone.json create mode 100644 regression-test/data/dynamic_table/dynamic_date_birthday.json create mode 100644 regression-test/data/dynamic_table/dynamic_feishu_alarm.json create mode 100644 regression-test/data/dynamic_table/dynamic_github_events.json create mode 100644 regression-test/data/dynamic_table/dynamic_simple_type_confiic_data.json create mode 100644 regression-test/data/dynamic_table/dynamic_simple_type_conflic_data.json create mode 100644 regression-test/data/dynamic_table/dynamic_string_birthday.json create mode 100644 regression-test/data/dynamic_table/dynamic_string_contact_phone.json create mode 100644 regression-test/data/dynamic_table/dynamic_timestamp_birthday.json create mode 100644 regression-test/data/dynamic_table/es_nested.json create mode 100644 regression-test/data/dynamic_table/ghdata_sample.json create mode 100644 regression-test/data/dynamic_table/nbagames_sample.json create mode 100644 regression-test/data/dynamic_table/sql/q01.out create mode 100644 regression-test/data/dynamic_table/sql/q02.out create mode 100644 regression-test/data/dynamic_table/sql/q03.out create mode 100644 regression-test/data/dynamic_table/sql/q04.out create mode 100644 regression-test/data/dynamic_table/test_dytable_complex_data.out create mode 100644 regression-test/suites/dynamic_table/create_table.groovy create mode 100644 regression-test/suites/dynamic_table/load.groovy create mode 100644 regression-test/suites/dynamic_table/sql/q01.sql create mode 100644 regression-test/suites/dynamic_table/sql/q02.sql create mode 100644 regression-test/suites/dynamic_table/sql/q03.sql create mode 100644 regression-test/suites/dynamic_table/test_create_dynamic_table.groovy create mode 100644 regression-test/suites/dynamic_table/test_dytable_alter_type.groovy create mode 100644 regression-test/suites/dynamic_table/test_dytable_complex_data.groovy diff --git a/regression-test/data/dynamic_table/btc_transactions.json b/regression-test/data/dynamic_table/btc_transactions.json new file mode 100644 index 00000000000000..79ab6af3b600e2 --- /dev/null +++ b/regression-test/data/dynamic_table/btc_transactions.json @@ -0,0 +1,100 @@ +{"inputs": [{"index": 0, "script": "004730440220741d81f0c555f52072426b9eb88d24dbe628608a7ee4a9f473d0f42e258766a00220469dd4f3fbdcc1fe592abc78d2c8bdc6ddc573ede8594b4ddc6d44e0127e93d501473044022019da55103ba4a86a14b0b4391635fa85e545ba7bf438ed0635b44d2539cd3faf022015ac1947abe118f12c142784ac5f77ff901a928be6c18382bf55246f7492fb66014c6952210363448e531bcf7d1992ded3bf7aa7d73293cb9716d961ee1a7045148f387e246d2103f09b8c862742c287b97f3335cbb909d5a26bd25720a1a587bd4e271dd806a88021034a6a80100c4cf9a241d12a186d5b507ac14673803428d154f7a588c59781156a53ae", "prev_out": {"addr": "3HN1tvuLskwg9zbUEatiERPnbrEPi4rNtf", "script": "a914abea1606ec26bb4160258e9343c023f9a711fb9287", "tx_index": 7905652756961984, "value": 13113728, "spent": true, "spending_outpoints": [{"tx_index": 8485415091903596, "n": 0}], "n": 18, "type": 0}, "witness": "", "sequence": 4294967295}, {"index": 1, "script": "00483045022100f4f8e47b8bebfc7d2a6094fff3b2706afe8ff7b66bfa8dcb378b902c842b718402202a0cb2de7e697a9db899985a4a4e7ee988a0f9c1305d4f7605a0368c80a3650b0148304502210099fa03a0531db35f47a9946502cf2643df5c9b7d894f6510d6a8be33e3761bb202206637d6bc8f656b69381ff9a6aa1a1354809cb8bf0fa364b287870923936a7d71014c695221037d70ffd7aff40e5fc72930005ce1664d445245ed560f5ba128e33b81f3cda89b21027d2f4f1313fe4946fdb2c645414a39929a467f070a87436d0be4e14255c86b50210272c819c91a8aa95b2be91cfa44ab259bf0dc922b1bf65a335ce33ca31fe21efd53ae", "prev_out": {"addr": "3EqD1BrciLC2n6kkf5a8uRNFifBYRR3mQS", "script": "a91490263649b9ac561e305c350697fdcc100a1bc34087", "tx_index": 7056155430347268, "value": 13138855, "spent": true, "spending_outpoints": [{"tx_index": 8485415091903596, "n": 1}], "n": 12, "type": 0}, "witness": "", "sequence": 4294967295}, {"index": 2, "script": "00483045022100f81584cdd3add822b768923024ba2289904d6af244e3e516cb4ee323b0dee28e022063900d82249e77385e4d0bfc953ed9b971c4019a74e4a2b11d4705f84336e46f014730440220383c594e1fa3fe0b911a417158e1bee907398f7f980dce5f09b091612934375e02207fd61a8e6484cadbf6bc935aeefbe12fb207c9b1e4624e2d2637c3b8b53b4b3f014c69522103f6c43ef2e9ffe013d3675bfe55f1fa6b6313eb9dfa91303212adf4aae472e34f2103929a2d347b1df1f007653d0483dfecf5890675417fcf3296294b66190a20d004210259474b7c8e4ea4229662332eefaf94a2bfe252b444ac06cdb8e07e9c8ad8a66653ae", "prev_out": {"addr": "36Qi61vZ8jdPyoHxiucfAJZHxGU5QcjhMp", "script": "a91433c3158fd0bcf4bf19658641261299803659f11d87", "tx_index": 4373031853191056, "value": 27143774, "spent": true, "spending_outpoints": [{"tx_index": 8485415091903596, "n": 2}], "n": 0, "type": 0}, "witness": "", "sequence": 4294967295}, {"index": 3, "script": "00483045022100df80f130ff51964929fda68f899df14177ecea2d303445e1e704c85944f881ca022062f7662392e3afffa470f7c224014b2229076b353864007a12c4f2ba7c95e6ff01483045022100f4ba645cd1da7e64834366dcd7b0c47bcd16aad540fe782ea34eb7f51975b53102203e4c395cfe5fc96cb2441067b19008810efe4006295138de45f9d4b72de835ce014c6952210261ecdcc890bf820b1fd61a2e5a583dfe294b0fa9689d97bbf5c16c4ed7f29656210283f30bb740b1f0fcc94c2b89a141eabeab27c8d8f338784fba95a75708cc374e2102041dfda855679ede8c9952e86f5472aaad5e16352d7661570d5903dde1f730d553ae", "prev_out": {"addr": "3M4xXEJGyDFhLmxbiBuzTfbpyV1911KCDv", "script": "a914d490b3845854e0b00787d7688e92576a4806065187", "tx_index": 7087016719471246, "value": 32498657, "spent": true, "spending_outpoints": [{"tx_index": 8485415091903596, "n": 3}], "n": 0, "type": 0}, "witness": "", "sequence": 4294967295}, {"index": 4, "script": "", "prev_out": {"addr": "bc1q88jed7zckgmxnq0gru8xvyxvquk3g79hf2xyguva6y5cfmd46rmqg9jfdv", "script": "002039e596f858b2366981e81f0e6610cc072d1478b74a8c44719dd12984edb5d0f6", "tx_index": 8672334309875724, "value": 43803256, "spent": true, "spending_outpoints": [{"tx_index": 8485415091903596, "n": 4}], "n": 8, "type": 0}, "witness": "0400473044022012a2718e8951362a5bb047cc33cdfd5902c8f54f8d85b71f1521b5bf8c81251e0220528528f5dec883e4234d26e9e87785a2653296db164056ab7e697d2c5796d63601473044022009d60c045543265f20b83bd7ec2366ffa5d0a03352feddd94fc08e693389661702207319053daf15a2c248ecb9e8f2223d26a150a3b1311c020f6bfba6bb3450b6c00169522102d286ea3606740edbacf0b930d36b0b5649ed355ffa4f3e6fdfed97d499f82dcf2103cb5d4a8b73b65d72d2c13084a0957074ba833b4c488b47bcb99859f988f1057c2103df342ff73054d074710bbb78d34600476af1bc78c517ffa05bfd814e0e45b83e53ae", "sequence": 4294967295}, {"index": 5, "script": "0047304402203f6068fed9bafdff389e8fc0de8fa170ae28cc44e8de5e14927e4ebeef827128022061fe726ad05d12aad4eebc9e58e3729f7573cdbe707a542ea3f2707ed16d9a150147304402200b5d61ec65e3d170443bdc51e4018a9ee6ebf92c38fb63668ea19547ca91370d022032d584476e3cf5619b2c3bee862b78a649bb8f3a94346fb8bad524580bf053af014c6952210302471ea4cb97ff64b735128f30c64116ca107e960527c999b8217db1ca49059a2103f6ff095fd41c7183eeaffceb99986a7d51d99e04673c7fc39c100c833f2b7b222103c1975cd032c566bad253bbe388e6e80479f8cd5701bda0dc35178ab39a41b6de53ae", "prev_out": {"addr": "3D1DvhA1o25qc7fotbBQpUuCGEUf2i3VLk", "script": "a9147c1ae3e2cd8ed15dca1ede2ba40145e1874f819787", "tx_index": 8085434281022428, "value": 51694818, "spent": true, "spending_outpoints": [{"tx_index": 8485415091903596, "n": 5}], "n": 0, "type": 0}, "witness": "", "sequence": 4294967295}, {"index": 6, "script": "00483045022100d367380aaec849fe953d4ca2c8c3865dfb835bbd4b179a754027aabd7e2bbe9c022020c2e0eed3ba0e71a660f16ef59e0278939178729283924c328487c5345d8cb401483045022100d3bf15da4983a042284553aa7a8edafed40701dc1e338c6c8e569b03da97d52402205dd1dcba0059f3960a1208ae1b90d934cd152fe6050c4cd324233ef8ab9c7fa5014c69522103c5b887e95073f447ce3f7c553fbfa447d117cd46f437eadc50982d41aa7bae25210334cae460f828f4230c6a330d196e1a4171259d412f4661b0fb95d1165a2b2b9921023fdf0b95256825079f41944e418e96dac7e79faf29eceaff247e273d79f159a453ae", "prev_out": {"addr": "3FjyroL1tG2NUVALbVKJ34VWySwZoAWgtC", "script": "a9149a2149138e75f053ea709bae30242e605dfed5fe87", "tx_index": 7747491055252991, "value": 999995000, "spent": true, "spending_outpoints": [{"tx_index": 8485415091903596, "n": 6}], "n": 0, "type": 0}, "witness": "", "sequence": 4294967295}], "lock_time": 0, "fee": 140000, "ver": 1, "weight": 8640, "tx_index": 8485415091903596, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 7, "vout_sz": 8, "time": 1636406685, "hash": "e28b6b3676adf05a33cd358a685f7576d83a430e47ff715f6460e39842852bf1", "double_spend": false, "out": [{"addr": "bc1q0vhee4vfxl3pq5s9tzd6xnfezxhslprqnzju2z", "script": "00147b2f9cd58937e2105205589ba34d3911af0f8460", "tx_index": 8485415091903596, "spending_outpoints": [], "spent": false, "value": 7317878, "n": 0, "type": 0}, {"addr": "1EdZDyFLUKVurELwLHDa3SND3qGWaYWLkb", "script": "76a9149583823c68bb31fc894ba704ea790474bdec789588ac", "tx_index": 8485415091903596, "spending_outpoints": [], "spent": false, "value": 820385, "n": 1, "type": 0}, {"addr": "1NBSAB1xtgN5BUbUJJtoe8ejySzmqwBjHG", "script": "76a914e853cd52b4c3749fb23781af69bc36b70fdc46c988ac", "tx_index": 8485415091903596, "spending_outpoints": [], "spent": false, "value": 509130000, "n": 2, "type": 0}, {"addr": "3Pzfn1UcfKVPKnuVmMeoqrhJ8uuxj3J4R1", "script": "a914f4a96fc276cfa1680a410e0d7d9c68f97ea8a58387", "tx_index": 8485415091903596, "spending_outpoints": [], "spent": false, "value": 8771715, "n": 3, "type": 0}, {"addr": "bc1qmvzqkcfu22p0l9cxz8l0cqwqmg27839qd6sz9n", "script": "0014db040b613c5282ff970611fefc01c0da15e3c4a0", "tx_index": 8485415091903596, "spending_outpoints": [], "spent": false, "value": 281000, "n": 4, "type": 0}, {"addr": "34VU3MCN2aduxPC3PUWbEpn7Z2eB69tRVu", "script": "a9141eb92ffd6f72ec5a7f1c1e1ec6000cbf88d3354b87", "tx_index": 8485415091903596, "spending_outpoints": [], "spent": false, "value": 618941, "n": 5, "type": 0}, {"addr": "1E6hmiRbP3jpc5HTrBMePPGAUX5YBJN6KH", "script": "76a9148fadbfb54f8637815ead0aa41dcdbe39c9fd01d488ac", "tx_index": 8485415091903596, "spending_outpoints": [], "spent": false, "value": 264107, "n": 6, "type": 0}, {"addr": "bc1qtq7tpn00ggvjnj3qhh7svvfk2g2w3gqy4xnxcdc6vutyhwv8lj8smezysx", "script": "0020583cb0cdef421929ca20bdfd0631365214e8a004a9a66c371a67164bb987fc8f", "tx_index": 8485415091903596, "spending_outpoints": [], "spent": false, "value": 654044062, "n": 7, "type": 0}], "size": 2355} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qvmhv5480095qllzag2dfhu88378luexxrgsu2c", "script": "001466eeca54ef79680ffc5d429a9bf0e78f8ffe64c6", "tx_index": 2352973157266237, "value": 130188, "spent": true, "spending_outpoints": [{"tx_index": 8270995445718570, "n": 0}], "n": 1, "type": 0}, "witness": "0247304402204829897f5a7d56be85ba5b78d614e06bb356bb6edc978671f438b3c1c28598540220167853120013864ce963535f22646222c8151200e3db12d74d5ce783e2f109140121029c426c4077204b99f4fcee37e4b022ed7fe9d4b7e36fe0f9946a878069b52d17", "sequence": 4294967295}], "lock_time": 0, "fee": 762, "ver": 2, "weight": 561, "tx_index": 8270995445718570, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406685, "hash": "23818418b251c14c7908f29d15dda15641fc7c6ed39f19b1de50f1d88b6913eb", "double_spend": false, "out": [{"addr": "bc1q0c2dh56gf7myr6pu8hjatdqlhhwnkdsglc36g9", "script": "00147e14dbd3484fb641e83c3de5d5b41fbddd3b3608", "tx_index": 8270995445718570, "spending_outpoints": [], "spent": false, "value": 37662, "n": 0, "type": 0}, {"addr": "bc1q9esfffwasyp5nzhydanttcpk63ndpj7n43krf0", "script": "00142e6094a5dd8103498ae46f66b5e036d466d0cbd3", "tx_index": 8270995445718570, "spending_outpoints": [], "spent": false, "value": 91764, "n": 1, "type": 0}], "size": 222} +{"inputs": [{"index": 0, "script": "483045022100dfa796475cc282af219f10b6bc197495bf0142df453358a2bda6e2942ecc14d702203ba40faa7fbba3a9318fd2a000c5841b2d89e36f61dba5d2e0f255da993eb4e301210388c433231bc42240faf718fcf9d975cd592fd924217f3e328b0eba3c6ae4e963", "prev_out": {"addr": "1Ed1snyMMAG8e69LqSM747Ap6dqTq5SD6c", "script": "76a914956957414b0d6f9ede83e4be9eda23171ddae1ee88ac", "tx_index": 3799348620846940, "value": 3472116, "spent": true, "spending_outpoints": [{"tx_index": 7615002208576309, "n": 0}], "n": 0, "type": 0}, "witness": "", "sequence": 4294967295}], "lock_time": 0, "fee": 6460, "ver": 1, "weight": 760, "tx_index": 7615002208576309, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 1, "time": 1636406685, "hash": "9eadb62f4d8e58caf7c68124998354fdbed516d97be0edc52aab19d9ec6e6ed8", "double_spend": false, "out": [{"addr": "3Jz8B6ACWWW788r2KqL24NzmLjBvf1P5bW", "script": "a914bdb66d757d7c2040cf9f28521784de4624f9e04087", "tx_index": 7615002208576309, "spending_outpoints": [], "spent": false, "value": 3465656, "n": 0, "type": 0}], "size": 190} +{"inputs": [{"index": 0, "script": "483045022100b14de4c40942061408fd3bd2ba0688c09732018bbdbea7797d0c74a729933a6702201af66acb677b84e1afea255f0eaebbf15e768b3926912288ef687232c2b52c82014104beb9bd83639049738b8a5ec928c3ec1ca39066b4e9b6d6e051f62ceff66a3c752f6bd8228e99012c7f6d578629782ef39e318cac89de80bc4dae9c3e436342bd", "prev_out": {"addr": "1NoRW5ZgbzoCtBTN9QrV7NPzBumis1qmJn", "script": "76a914ef223a78b1126da1d9c4ef4b4e71d0ff5631f4e288ac", "tx_index": 199225896112496, "value": 453759, "spent": true, "spending_outpoints": [{"tx_index": 7367822710336978, "n": 0}], "n": 0, "type": 0}, "witness": "", "sequence": 4294967295}], "lock_time": 0, "fee": 3840, "ver": 2, "weight": 1032, "tx_index": 7367822710336978, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406684, "hash": "4448663717dcf75c2fb1aa3b40ba180cb04b1240bbf6927b67956e573bf767d1", "double_spend": false, "out": [{"addr": "1NoRW5ZgbzoCtBTN9QrV7NPzBumis1qmJn", "script": "76a914ef223a78b1126da1d9c4ef4b4e71d0ff5631f4e288ac", "tx_index": 7367822710336978, "spending_outpoints": [], "spent": false, "value": 156158, "n": 0, "type": 0}, {"addr": "147fDDneYYmYkiqfxxtC32Q8sv3vvMve2n", "script": "76a914222ac51204c5edd22b8de0f08803179813275ee788ac", "tx_index": 7367822710336978, "spending_outpoints": [], "spent": false, "value": 293761, "n": 1, "type": 0}], "size": 258} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1q8ugfx7jvlphvurn33shunn4m4jsuefl039gl4f", "script": "00143f10937a4cf86ece0e718c2fc9cebbaca1cca7ef", "tx_index": 1360241255460922, "value": 4160621, "spent": true, "spending_outpoints": [{"tx_index": 7170312234638999, "n": 0}], "n": 1, "type": 0}, "witness": "0248304502210085378b0a1e08a9ae2f48c3859f3241765e7a7e8b257aa6d3516373f74b662c9202203d2c3f6051e110ff6d178c65408e50512695086dd6454e864ffdfb52824d93040121038a303df1d0254f268b4ecd73f1936a04abc194171baf6c68d582b0abd624e015", "sequence": 0}], "lock_time": 0, "fee": 1974, "ver": 1, "weight": 562, "rbf": true, "tx_index": 7170312234638999, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406684, "hash": "38a3cec2445648185fa7c2f4cfdc7065cec5c355c98e4578c4bdf4644de3cacb", "double_spend": false, "out": [{"addr": "bc1qm8gz4a54u32e97kddknmh4uzw97yc2yw963q90", "script": "0014d9d02af695e45592facd6da7bbd782717c4c288e", "tx_index": 7170312234638999, "spending_outpoints": [], "spent": false, "value": 269611, "n": 0, "type": 0}, {"addr": "bc1q8ugfx7jvlphvurn33shunn4m4jsuefl039gl4f", "script": "00143f10937a4cf86ece0e718c2fc9cebbaca1cca7ef", "tx_index": 7170312234638999, "spending_outpoints": [], "spent": false, "value": 3889036, "n": 1, "type": 0}], "size": 223} +{"inputs": [{"index": 0, "script": "1600141fafa0873c47ba9859b11d527b73e5f1bd725ebd", "prev_out": {"addr": "3Dyb7MwQ1YkHSaFPm3deF2xaNUiyc2tfuF", "script": "a91486c3de14c37d0bb23eef2f5dfd136207fa586d2a87", "tx_index": 5262300851852687, "value": 6035790, "spent": true, "spending_outpoints": [{"tx_index": 6337013526045930, "n": 0}], "n": 0, "type": 0}, "witness": "02483045022100a00f60436adbca4079b76c1a31d7be9b1341baed6f37a54f43b6017f2739100b0220657eae319131548ff0f9e9743a5d9edc97ecb6a76c391dca12885d0ccd05741a012102f3c3a9c0f3baace5682af102d8d1a70a3271a09fb14391585444910a17e9f378", "sequence": 4294967295}], "lock_time": 0, "fee": 2123, "ver": 1, "weight": 658, "tx_index": 6337013526045930, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406684, "hash": "4e9a8c042b85d3fe48087e9d2b8e74fbfbe646c397c47db66c54274181d71bb4", "double_spend": false, "out": [{"addr": "bc1qg4z3ffkknckzhu0qltmwr304pd2jy796m96v6n", "script": "0014454514a6d69e2c2bf1e0faf6e1c5f50b552278ba", "tx_index": 6337013526045930, "spending_outpoints": [], "spent": false, "value": 300000, "n": 0, "type": 0}, {"addr": "39fHrWhDSrRR5gnAhpoM7SxgasFSp4ht8g", "script": "a914576d78f30c06f9a39a17ecf6ec7d28933782411d87", "tx_index": 6337013526045930, "spending_outpoints": [], "spent": false, "value": 5733667, "n": 1, "type": 0}], "size": 247} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1q7cyrfmck2ffu2ud3rn5l5a8yv6f0chkp0zpemf", "script": "0014f60834ef165253c571b11ce9fa74e46692fc5ec1", "tx_index": 4075712374833125, "value": 1184753880, "spent": true, "spending_outpoints": [{"tx_index": 5679970266278027, "n": 0}], "n": 4, "type": 0}, "witness": "02473044022071e4108f737b7dbac5164069c1b4dc0cb2fc7127353c04b683db1f10a42c202602205d0ad9f75216cbdc0a94e712ea4c9da7d37137fe99b6fad107d43d57cdb6d8ca0121026e5628506ecd33242e5ceb5fdafe4d3066b5c0f159b3c05a621ef65f177ea286", "sequence": 4294967293}], "lock_time": 0, "fee": 36414, "ver": 2, "weight": 937, "rbf": true, "tx_index": 5679970266278027, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 5, "time": 1636406684, "hash": "0c05b6633d2bd6cb715b956e772a99bb534db29802a01dd69c58447310396fa1", "double_spend": false, "out": [{"addr": "bc1qm74dc6ntwgjjdhkg97s8esqcr0y6wdn0dntgsq", "script": "0014dfaadc6a6b722526dec82fa07cc0181bc9a7366f", "tx_index": 5679970266278027, "spending_outpoints": [], "spent": false, "value": 4096302, "n": 0, "type": 0}, {"addr": "bc1qzdutcydf33908l7n6p77j0zze3l9ze8s4z68uz", "script": "00141378bc11a98c4af3ffd3d07de93c42cc7e5164f0", "tx_index": 5679970266278027, "spending_outpoints": [], "spent": false, "value": 49960000, "n": 1, "type": 0}, {"addr": "bc1qvrvurk3rvmmkwlkvqfzgyzlfpk7p6tuxutd3xs", "script": "001460d9c1da2366f7677ecc0244820be90dbc1d2f86", "tx_index": 5679970266278027, "spending_outpoints": [], "spent": false, "value": 2160000, "n": 2, "type": 0}, {"addr": "3DXLo7sCGK2SEYjzn362tgsge4Syy4dz4n", "script": "a91481cd1a73ef457382ec2be9c0be15923be4d26e0d87", "tx_index": 5679970266278027, "spending_outpoints": [], "spent": false, "value": 430000, "n": 3, "type": 0}, {"addr": "bc1q7cyrfmck2ffu2ud3rn5l5a8yv6f0chkp0zpemf", "script": "0014f60834ef165253c571b11ce9fa74e46692fc5ec1", "tx_index": 5679970266278027, "spending_outpoints": [], "spent": false, "value": 1128071164, "n": 4, "type": 0}], "size": 316} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qfmaf8h906quza78s3nh2ewkkeqxwp8vjte2zgq", "script": "00144efa93dcafd0382ef8f08ceeacbad6c80ce09d92", "tx_index": 8157784397358955, "value": 4752297, "spent": true, "spending_outpoints": [{"tx_index": 3246031659541791, "n": 0}], "n": 0, "type": 0}, "witness": "0247304402206a20a1d183753a59b29b25119ef44ef168cafdd7786da495996db240b22848af022041fb449adb4deec6cf9f545de45ec84d8937df668c61ba279a6c3e9996c4f209012103d85ef5f08516eb6f418806e48fdc7eb70f34dfc547e405e02dd06b831618aa55", "sequence": 4294967293}], "lock_time": 708833, "fee": 1698, "ver": 2, "weight": 569, "rbf": true, "tx_index": 3246031659541791, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406684, "hash": "22c01976ff0d27762d2eab0c378c10b0d007ff0e183fafd665ff28f91ffd415c", "double_spend": false, "out": [{"addr": "3282odJZbLhWGorygahgLNt5FoDqb6dBf7", "script": "a91404bb225e38fce6165bb2a23da27506412ae53c8c87", "tx_index": 3246031659541791, "spending_outpoints": [], "spent": false, "value": 397800, "n": 0, "type": 0}, {"addr": "37ZVducxkodU5zVyJmAoqTEATSiFeXvKdo", "script": "a91440648f90dace033da6d13125c90c3d49c0879ad287", "tx_index": 3246031659541791, "spending_outpoints": [], "spent": false, "value": 4352799, "n": 1, "type": 0}], "size": 224} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qxpdf7gg0m6utpcu760d96nt2utvsdt8da3csnx", "script": "0014305a9f210fdeb8b0e39ed3da5d4d6ae2d906aced", "tx_index": 7145734888807163, "value": 14220817, "spent": true, "spending_outpoints": [{"tx_index": 2507054251761891, "n": 0}], "n": 1, "type": 0}, "witness": "02483045022100f94140b4bdd4c57303272bfc2ba825d6fc6cff194541028ef6de9c32d6cf9e4402200960d9436811c9cebe936d9cd5ebbe9cba4edc9bbd5abe2fac4fe7b6abd3c79e0121039351032370c47376ecc56e43ca175b0e16dd87d9d09c67e492bdab7e0e580bf9", "sequence": 4294967295}], "lock_time": 0, "fee": 705, "ver": 1, "weight": 562, "tx_index": 2507054251761891, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406684, "hash": "9f088c5dd7125f964175754f7c65287511a11ec9439d0083ba1807df70384147", "double_spend": false, "out": [{"addr": "bc1q342lc8z7hvalj5ad5nd9kynlku5aujxus27ekh", "script": "00148d55fc1c5ebb3bf953ada4da5b127fb729de48dc", "tx_index": 2507054251761891, "spending_outpoints": [], "spent": false, "value": 14117544, "n": 0, "type": 0}, {"addr": "bc1qzvlpnrvdpeekfjg7gwtr325dmdcgy54a3tl7ql", "script": "0014133e198d8d0e7364c91e439638aa8ddb708252bd", "tx_index": 2507054251761891, "spending_outpoints": [], "spent": false, "value": 102568, "n": 1, "type": 0}], "size": 223} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qjnxappqrt5ltenvptnzuzhta7yax7msrma8trdlkn48v6e4ngq0q3jrwys", "script": "002094cdd084035d3ebccd815cc5c15d7df13a6f6e03df4eb1b7f69d4ecd66b3401e", "tx_index": 937303132879910, "value": 2232881, "spent": true, "spending_outpoints": [{"tx_index": 2401724312046667, "n": 0}], "n": 0, "type": 0}, "witness": "040047304402201380b6e0518a3a7d534eb0f3a5187727ffc985253a7e9b96b70a3e3414909f8f0220710dcc30ddf86c9bb6f64eebf21d4bc0310c044ebaef075de96a24f0a0ea797501483045022100d98312a41f2806673a4078fb254040cb412b27bb5d98bde88d3f07f8a20cc92302202bfac0f9cb56db621cc913c8690c116f49daaaaa49a22dcfd2d85b20291cbefc01475221021d3709f6c80fe613f3a9a9bea6e6852db5693b8f13032c3353b3aeee007e369b210283e87615e4133b8e1dc1486802e4194348b85da82134437117ef1aca161f276852ae", "sequence": 4294967295}], "lock_time": 0, "fee": 2411, "ver": 1, "weight": 725, "tx_index": 2401724312046667, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406684, "hash": "5bc1204d0feb348755668c7065c437b1497873b3eb1f8445035962be23d84244", "double_spend": false, "out": [{"addr": "bc1qlrheh86vl9yqu79gwfgcaqpvau2lwjhhalglld52g9exqg2yemcqsrycmx", "script": "0020f8ef9b9f4cf9480e78a872518e802cef15f74af7efd1ffb68a4172602144cef0", "tx_index": 2401724312046667, "spending_outpoints": [], "spent": false, "value": 1701626, "n": 0, "type": 0}, {"addr": "3BXGRMeanpT1irNwLAbFWhQcP6nV1Laa3K", "script": "a9146bd93313bbb30d8cba0ee4794375b01a6acbdf3c87", "tx_index": 2401724312046667, "spending_outpoints": [], "spent": false, "value": 528844, "n": 1, "type": 0}], "size": 347} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qa8a0twx7t9p4dpxaecekfsvw738p8tajfsgh26", "script": "0014e9faf5b8de59435684ddce3364c18ef44e13afb2", "tx_index": 953116449488051, "value": 8203, "spent": true, "spending_outpoints": [{"tx_index": 2377102276803763, "n": 0}], "n": 0, "type": 0}, "witness": "024730440220760b5e4bc24c2d89c27843a4071c50654c7b8e03f3f098e074365c1081c25cf90220152124b28b2784b6a7b75d78ef0880d0da20376d2dabdd7c9403bd6f7b3224c501210333c65c96343cd25e7f754156a62cf8dc7e0476ef74df679b2b0f7c1a04816d7c", "sequence": 4294967293}, {"index": 1, "script": "", "prev_out": {"addr": "bc1qnq393qpph3tynge2svx24ec9afvhk4a3e3q9av", "script": "00149822588021bc5649a32a830caae705ea597b57b1", "tx_index": 2327699581655162, "value": 7445, "spent": true, "spending_outpoints": [{"tx_index": 2377102276803763, "n": 1}], "n": 0, "type": 0}, "witness": "02473044022056175f58d1472c9c42949df08a58227e879c02f213f06ff4598218b4845743ff022074efb5b0d30ccde6b1130f0be0b4083d73ad5786622a8173ca49a2973b6950ed012102e77a825c45074dd62e5ca8882e568933b135e6b196343fac07a4c15ad151e3dd", "sequence": 4294967293}], "lock_time": 708833, "fee": 2090, "ver": 2, "weight": 720, "rbf": true, "tx_index": 2377102276803763, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 2, "vout_sz": 1, "time": 1636406684, "hash": "1f213f663c78e2e4a3b7f20dadd6c91eb08c9c726ae8d225969ee56d06b28f43", "double_spend": false, "out": [{"addr": "12Guny2Ya2QMsKZB7HHHEsq5mp6GdJeZ7x", "script": "76a9140dfa6f26b4f90fbb41c4ee9f8f6551acc26d00d088ac", "tx_index": 2377102276803763, "spending_outpoints": [], "spent": false, "value": 13558, "n": 0, "type": 0}], "size": 342} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qalxt5k362aa5dxkdgtl43sxd48yh9n9h720jdr", "script": "0014efccba5a3a577b469acd42ff58c0cda9c972ccb7", "tx_index": 6102278331913006, "value": 12819971, "spent": true, "spending_outpoints": [{"tx_index": 8987047093946431, "n": 0}], "n": 1, "type": 0}, "witness": "02483045022100c00e30d3e6f3a8de38e819e4596a925667bad7995eaed569bd2a7375ec51f7bc0220175487f40fe87bb6a502145f0e77adada8ee8da4de71faad476e2f5246f4172c0121038a3b6332dab2aa20c317fce28428ea6034c932b319543f883c384c2176ef4035", "sequence": 4294967295}], "lock_time": 0, "fee": 769, "ver": 2, "weight": 566, "tx_index": 8987047093946431, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406683, "hash": "8e5dd4a25860df5911b0d5c6ac772e61523e0aa519617aeac7fe41eaac5f6dff", "double_spend": false, "out": [{"addr": "35eRKWvPK9uXAgsghdefykxyQaM8hD75ei", "script": "a9142b62c90a99d156f17192ca4b07b3a38c4b3581ad87", "tx_index": 8987047093946431, "spending_outpoints": [], "spent": false, "value": 90436, "n": 0, "type": 0}, {"addr": "bc1qaj2379uqgf90fl7tzjyrgfd2c9qqwfpqq3p340", "script": "0014ec951f1780424af4ffcb14883425aac140072420", "tx_index": 8987047093946431, "spending_outpoints": [], "spent": false, "value": 12728766, "n": 1, "type": 0}], "size": 224} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qehmjhara9fmlpn0t7l08yd7m2gzfh69nhlfw4v", "script": "0014cdf72bf47d2a77f0cdebf7de7237db52049be8b3", "tx_index": 7892815829142104, "value": 74170, "spent": true, "spending_outpoints": [{"tx_index": 5730174107868168, "n": 0}], "n": 1, "type": 0}, "witness": "0247304402203161620890b8e1d7bdbc61cdcaed6ad14e92399c49f176add49c84d07ca73c0902203dcb07a688f0e404412a69c29ab95d28c16192fd146a85198099f74883dd7d86012103795f0d93b58e815c1f827f49cdb9a1327631b43e2800bc81cf7f874fd5c3647d", "sequence": 4294967295}, {"index": 1, "script": "", "prev_out": {"addr": "bc1qruauqlj0hw6a9dayzxd06xdlpyjf53hvps4n4l", "script": "00141f3bc07e4fbbb5d2b7a4119afd19bf09249a46ec", "tx_index": 4328162206581984, "value": 1038, "spent": true, "spending_outpoints": [{"tx_index": 5730174107868168, "n": 1}], "n": 1, "type": 0}, "witness": "024730440221008ccee365e7e91402f9a87f057876531c25dfafb43e6cdae166162dd09c965bf8021f042282427c08fa773288fc15dd75c80ed42056bfe6aee3a2d9d9029c2804960121031932ecaf5e8c08013b358db7045d9d45260a59a842796ff9dbdfef7f1de1b710", "sequence": 4294967295}], "lock_time": 0, "fee": 2596, "ver": 2, "weight": 720, "tx_index": 5730174107868168, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 2, "vout_sz": 1, "time": 1636406683, "hash": "0aa258830d3625cbdaf9222b3f755eb9c9e95077fc1a7808fa42e09a0181dca2", "double_spend": false, "out": [{"addr": "19s1QBiGgnyVothFfDjNXHPqiQfZxUjuN7", "script": "76a91461362356bf4a00488a3228ba9f09c3232dd173d188ac", "tx_index": 5730174107868168, "spending_outpoints": [], "spent": false, "value": 72612, "n": 0, "type": 0}], "size": 342} +{"inputs": [{"index": 0, "script": "160014cfc706e1467183f4fea026abdbc624f6eb8a966b", "prev_out": {"addr": "3QSaHV3MSirxCzVuZZ5VtTUkpq23nfkcCR", "script": "a914f98faad028501f243225d5fc7d2cff1173e78d3b87", "tx_index": 5762607096232152, "value": 506567, "spent": true, "spending_outpoints": [{"tx_index": 2371994091383347, "n": 0}], "n": 0, "type": 0}, "witness": "02483045022100b18ebc41eb905ddcfe037716bb404a9720dd60141f0618f8f4d28e78ba4ce21902204b83a600ad3618006f2851a0ad4717bddd0c679ce0302df820d217b6d3a6c6d3012102297db92a2e44a3da38cd851b0305023a8b294c88628dc013481118c2db8c7ad9", "sequence": 4294967295}], "lock_time": 0, "fee": 1670, "ver": 1, "weight": 542, "tx_index": 2371994091383347, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 1, "time": 1636406683, "hash": "2120682fd3c1f179e4a23a352dfd4cfb02b8f36e3608b7ad129a51cf49876a43", "double_spend": false, "out": [{"addr": "1MAoTx45F24YHUzF2uC29pUkVca1voWFwU", "script": "76a914dd3d0bcaa4ac4a5b84d49e519f00a8756bf93c1988ac", "tx_index": 2371994091383347, "spending_outpoints": [], "spent": false, "value": 504897, "n": 0, "type": 0}], "size": 218} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qelj3vmd5qerhgnqtte0nl7tmg6mfd083nhhjtg", "script": "0014cfe5166db40647744c0b5e5f3ff97b46b696bcf1", "tx_index": 8465750917660749, "value": 71400, "spent": true, "spending_outpoints": [{"tx_index": 8344178849407849, "n": 0}], "n": 0, "type": 0}, "witness": "024830450221008ca883883ef75f3e5bc806c56174a459b836c54f05eaa6ae0ebf684f5b1d5475022051fcef7a6962d760c9a7aa18dcc002e59e265ef531a7936659553c38a397f2f6012102bd3a0ed9270e0ffbafe5ed30c3cb5b72b29b3bc186c7c5f641c053c46347db14", "sequence": 4294967295}, {"index": 1, "script": "483045022100c8183586b38fed6eff65ab4d069725457614f28f719ad63e255bf74c2d4a8b6e02207d8d8985b0263ec05c0fe114414193cc2a0052386993a57ac3c65255c3b29d310121036b811d1829e95a8f076678b260f7ed86749dd1823fb1461e749cd5d247ec72d6", "prev_out": {"addr": "17gwbwjEUkB7Y84iLKAbfz3YtgVCjLsMcx", "script": "76a914495e8e9bbad7cde65fe1d8e84a2cabeedb53ad7488ac", "tx_index": 5713861182567509, "value": 3030600, "spent": true, "spending_outpoints": [{"tx_index": 8344178849407849, "n": 1}], "n": 52, "type": 0}, "witness": "", "sequence": 4294967295}, {"index": 2, "script": "4730440220632c6f2a436dc21b8e45038628a5d4951ae190c93f29ea6698b51d5e1e2e4c3502205ffa6cbc6f6ce1d04084b62fca865b304d0683ce434a599652a3378419efc2390121036b811d1829e95a8f076678b260f7ed86749dd1823fb1461e749cd5d247ec72d6", "prev_out": {"addr": "17gwbwjEUkB7Y84iLKAbfz3YtgVCjLsMcx", "script": "76a914495e8e9bbad7cde65fe1d8e84a2cabeedb53ad7488ac", "tx_index": 7581422943696509, "value": 3091359, "spent": true, "spending_outpoints": [{"tx_index": 8344178849407849, "n": 2}], "n": 57, "type": 0}, "witness": "", "sequence": 4294967295}, {"index": 3, "script": "47304402200b01ccb6b474c348bb102f15c7052951034a0b4f31af197237b8cfd823ea5b52022029dea3571b0bffda4ba70d1a5f7959ade497791d6f94a721d58143b89217baa40121036b811d1829e95a8f076678b260f7ed86749dd1823fb1461e749cd5d247ec72d6", "prev_out": {"addr": "17gwbwjEUkB7Y84iLKAbfz3YtgVCjLsMcx", "script": "76a914495e8e9bbad7cde65fe1d8e84a2cabeedb53ad7488ac", "tx_index": 3097280834187177, "value": 274873, "spent": true, "spending_outpoints": [{"tx_index": 8344178849407849, "n": 3}], "n": 1, "type": 0}, "witness": "", "sequence": 4294967295}, {"index": 4, "script": "483045022100c9e8b89877858ab74d27fc5102a2b61b43714945fc9f600fa09ad072b9bea99c02201cb7ea8f30fb35d8c0a7740ba4e856b1f32ab2c10992820136a0456e408a4aad012102383d3bc6b04c4d40f1cca204329522e782f1500740b611303a972f8c38d015e8", "prev_out": {"addr": "17suq5K8YRczMGadooa1PwkQrmW11cvdiY", "script": "76a9144b71a6f0b62927a22c7275fa07eb2181aa0a83bf88ac", "tx_index": 5391300449858874, "value": 2807000, "spent": true, "spending_outpoints": [{"tx_index": 8344178849407849, "n": 4}], "n": 19, "type": 0}, "witness": "", "sequence": 4294967295}, {"index": 5, "script": "4730440220321be14f6ecbdca0dd5af13df71500f238894b43ebf5f598577a906e779cb6a702204e66a2909e7ddfb2b8662150ca1de1536c267f7c1833a5b81e309101a4db759f012102383d3bc6b04c4d40f1cca204329522e782f1500740b611303a972f8c38d015e8", "prev_out": {"addr": "17suq5K8YRczMGadooa1PwkQrmW11cvdiY", "script": "76a9144b71a6f0b62927a22c7275fa07eb2181aa0a83bf88ac", "tx_index": 8948982132470919, "value": 2913399, "spent": true, "spending_outpoints": [{"tx_index": 8344178849407849, "n": 5}], "n": 18, "type": 0}, "witness": "", "sequence": 4294967295}, {"index": 6, "script": "47304402201cf8512ff9cd3109d038e7aea04c56529575cceb58900c060ec1d85f094bb7e2022021a927d992a2d2d33bd15cb5d04df774863398bdd3cb78bfbdd78bf1cba904a7012103cc300f7072985a0edde6a8d08d5fc6216cf9b94a1b0e856d33ad4a0e726191c0", "prev_out": {"addr": "1Hc1e7xSpwrL5yieFHELkZ9Uq9T55WUJWN", "script": "76a914b6211afe95bdfd39ecc16430180c59b8f861c81b88ac", "tx_index": 2742331000380809, "value": 214004, "spent": true, "spending_outpoints": [{"tx_index": 8344178849407849, "n": 6}], "n": 35, "type": 0}, "witness": "", "sequence": 4294967295}, {"index": 7, "script": "4730440220316f19ff21d06b45569315fabe3c0f8afa59deb84a26d98c09d7032f5d1b5621022053b91ac2d58caa1c2349ec392404210e7b25f6c4e0fd61c006c7417e12d90b4c01210353cb89bed2900d46c158fa278bae79a2754451f840fbfa9ce265e99e689a03f7", "prev_out": {"addr": "19quFcNKX1Y4JA29NTVZLKK8xYjUtrFvMM", "script": "76a91461009712158b9ff858bb32cb7233d091c4d97bc388ac", "tx_index": 5931576135456881, "value": 1302814, "spent": true, "spending_outpoints": [{"tx_index": 8344178849407849, "n": 7}], "n": 16, "type": 0}, "witness": "", "sequence": 4294967295}], "lock_time": 0, "fee": 9597, "ver": 1, "weight": 4705, "tx_index": 8344178849407849, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 8, "vout_sz": 2, "time": 1636406682, "hash": "0f7327baa9b14740937aaa4433e3b5879290d4c3a2fc2e15724e1b1742e427ed", "double_spend": false, "out": [{"addr": "12W42igbmsoHNnvWDWcmrQLz82nMdqeib7", "script": "76a9141076b7ba38de63d99ec818424a0065fcb1c4fbdc88ac", "tx_index": 8344178849407849, "spending_outpoints": [], "spent": false, "value": 13534852, "n": 0, "type": 0}, {"addr": "bc1qkuutpqgjddvpzm28nfuqfcu0g2tdjkz8u3kwy2", "script": "0014b738b081126b58116d479a7804e38f4296d95847", "tx_index": 8344178849407849, "spending_outpoints": [], "spent": false, "value": 161000, "n": 1, "type": 0}], "size": 1264} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1q7ug4w4as2sefar89q057hnmxkakp58a25535ttlmurn6cncs8tms4e7gp2", "script": "0020f7115757b054329e8ce503e9ebcf66b76c1a1faaa52345affbe0e7ac4f103af7", "tx_index": 8177578082148544, "value": 94835212, "spent": true, "spending_outpoints": [{"tx_index": 7159775357516943, "n": 0}], "n": 1, "type": 0}, "witness": "040047304402206cbf7cf58fe33686db8096e70f4cff3110d51a38993838f0f8b0d329578b0ae7022056454a393fbb2207b5c2f3b6da2c729650f495f1c445677c731a3cd31977367d014730440220504dd47eb3f0993e546a95703d5fb5e52b535b3401d81d14e28c8fb33b8ab3f00220269348c68c5f4e4b73b59577230e374d29119180f2f00f9ce1f9514e64b27e89014752210200ad93259efc9f1ef3da018217928aba62416da35ccdcdb81cbbb53ceabff2182103a3af0f49a21d29106ebeef9b3c3d69fc375c856a7153d97156a5b7a161ca6c2552ae", "sequence": 4294967295}], "lock_time": 0, "fee": 1104, "ver": 1, "weight": 732, "tx_index": 7159775357516943, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406682, "hash": "ca2b0fa7ae6692268cd39731094ec9b1b481f27ead7977bf467de4d9d6387ecb", "double_spend": false, "out": [{"addr": "13Eh2bVUTAMzk61K68JkybtX47roWc87Dt", "script": "76a91418871284e684e963e8721967a5bfef349843ed2588ac", "tx_index": 7159775357516943, "spending_outpoints": [], "spent": false, "value": 38403, "n": 0, "type": 0}, {"addr": "bc1q7ug4w4as2sefar89q057hnmxkakp58a25535ttlmurn6cncs8tms4e7gp2", "script": "0020f7115757b054329e8ce503e9ebcf66b76c1a1faaa52345affbe0e7ac4f103af7", "tx_index": 7159775357516943, "spending_outpoints": [], "spent": false, "value": 94795705, "n": 1, "type": 0}], "size": 348} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qwycyxu8s74rcfmlc2x4zt87ydxr670d288j2a5", "script": "001471304370f0f54784eff851aa259fc46987af3daa", "tx_index": 5447320482081767, "value": 490157, "spent": true, "spending_outpoints": [{"tx_index": 7004296435935771, "n": 0}], "n": 5, "type": 0}, "witness": "02483045022100b8c20544d99a763d12e3a20aefac8a77c54b018e1cacb905ebf4a453d748fc1a02201aca65679597af2681119164b785806bdd04faee9c676dc8594184602975e008012103312123373c9fbccde73a4a8dace1b0ee7f9aa5cc8e9d453864589fb511f6b486", "sequence": 4294967280}], "lock_time": 0, "fee": 2842, "ver": 1, "weight": 566, "rbf": true, "tx_index": 7004296435935771, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406682, "hash": "60449b8206f5e424ea2324d8a87df49e283fbef00bdf6848ddd950b9c7f612c7", "double_spend": false, "out": [{"addr": "3GTH6oVrfqXM75gHzfyn3G8rnVfuCTouY4", "script": "a914a1f0bb789680ca20ed79c3a42717959910111c9e87", "tx_index": 7004296435935771, "spending_outpoints": [], "spent": false, "value": 71532, "n": 0, "type": 0}, {"addr": "bc1qv9lpswar64q85uyha99m0cq5hke8slrst2x4kd", "script": "0014617e183ba3d5407a7097e94bb7e014bdb2787c70", "tx_index": 7004296435935771, "spending_outpoints": [], "spent": false, "value": 415783, "n": 1, "type": 0}], "size": 224} +{"inputs": [{"index": 0, "script": "47304402205628be38fc3fabdaaf43c880c6469192c1efef8db0ff94f41e924d6443f5360b02201c9b328fa195e0f77e8b24c3ae56dbcb37a762e481660e6760188726dbf291df0141045e6920f18629c1a4c4b5e70c020c57596dbefa251431db901f5529e5aa6b5fb5382de0c123405c8ffe7f93ee0acbcbee3f94d06c82359bc5eb5c0eee03536fa7", "prev_out": {"addr": "1FG1pP3kkRTR7M8sAWLj4ZNFkk5BKrJ5nr", "script": "76a9149c68aeac07edd40f31f0d95cc0e7f9b7f1723ba688ac", "tx_index": 5343841481211608, "value": 5377561111, "spent": true, "spending_outpoints": [{"tx_index": 6389401809481499, "n": 0}], "n": 1, "type": 0}, "witness": "", "sequence": 4294967295}], "lock_time": 0, "fee": 5355, "ver": 1, "weight": 1016, "tx_index": 6389401809481499, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406682, "hash": "486507dca54980466c89d17d47a0ce74038f2ac50113b669b8d97873490499b5", "double_spend": false, "out": [{"addr": "bc1qqkhed4j74ceqh430576z08lpz0xjeyn0cdk3mq", "script": "001405af96d65eae320bd62fa7b4279fe113cd2c926f", "tx_index": 6389401809481499, "spending_outpoints": [], "spent": false, "value": 6476053, "n": 0, "type": 0}, {"addr": "14wMwPkhk3C9jZzR7x5ETMNQn6DMyLvfRN", "script": "76a9142b3051396123c004d3ac7c00aa79dafde13544e388ac", "tx_index": 6389401809481499, "spending_outpoints": [], "spent": false, "value": 5371079703, "n": 1, "type": 0}], "size": 254} +{"inputs": [{"index": 0, "script": "47304402201b42e0a3a558c26893f76714b9d02d8333d41b70a82bae02a2d494d3db2ab24302206c8d4fb234b23dd12b5a306ac583aae39cadc0ba702b6dcbce75fb8f94e1dbb1012102d92ee7d3cd9fd8f6d70a9a9a3230a25a9652861df95a57ea522f5f0f455710d4", "prev_out": {"addr": "1BU2UPLhFpvWwzhqs4QpxtP3DgmJCUDPVX", "script": "76a91472cdb7bb4c95285850fc7e35624249ddb532480a88ac", "tx_index": 8575031872933698, "value": 12247218, "spent": true, "spending_outpoints": [{"tx_index": 5859840954071140, "n": 0}], "n": 1, "type": 0}, "witness": "", "sequence": 4294967295}], "lock_time": 0, "fee": 2918, "ver": 1, "weight": 892, "tx_index": 5859840954071140, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406682, "hash": "d2c6f7a19dccddd997a46ef4abf72bc0cb167ed7241416bc1222c30f54f48ba6", "double_spend": false, "out": [{"addr": "38v5UnZ4pb5EzVw4YEFJ1YHWMXihoc1dS2", "script": "a9144f41419d7b78b307d2d9de1c8b667c738631895987", "tx_index": 5859840954071140, "spending_outpoints": [], "spent": false, "value": 6984000, "n": 0, "type": 0}, {"addr": "1Dpkm4LiSxdVEe91cTQE83oaGrhykZJbsY", "script": "76a9148ca9969a841ddd5daf785c9e8afe375dd4669bdd88ac", "tx_index": 5859840954071140, "spending_outpoints": [], "spent": false, "value": 5260300, "n": 1, "type": 0}], "size": 223} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qrj60m7eznuhttlc99fjvd4f437h8xej2sf6kz0", "script": "00141cb4fdfb229f2eb5ff052a64c6d5358fae73664a", "tx_index": 1430556310118584, "value": 221519, "spent": true, "spending_outpoints": [{"tx_index": 5343737085255499, "n": 0}], "n": 58, "type": 0}, "witness": "024730440220651b1ca792cb579ebead8d25eb5b25b79a63dda7e4f09c5dba07db432945e85602205871181a4ef829f51912505bd88d7e1194924f907db54111477c019d2f35407901210213c16cd755a180be9eb476d4c82ab6d6cfafed852872c2fcf9d7481323fb4c7f", "sequence": 4294967293}, {"index": 1, "script": "", "prev_out": {"addr": "bc1qwd8rcmccz7wg3j45pxnjmrcvn72utmu9tf37sv", "script": "0014734e3c6f18179c88cab409a72d8f0c9f95c5ef85", "tx_index": 8802135739940496, "value": 19184, "spent": true, "spending_outpoints": [{"tx_index": 5343737085255499, "n": 1}], "n": 0, "type": 0}, "witness": "0247304402206b1d7d59298fd3423799a5331a90570cd12c227b30e05d2499de7e1b98b51a0d02204a42c3d26a0649b99ace62fea740b3a56d4c129417fe484deb4e89c97dec793f012103a543c43d9d62d57990687e131b157c074676dc30b0405a1a447069a70ade03d2", "sequence": 4294967293}, {"index": 2, "script": "", "prev_out": {"addr": "bc1q3vkz5yc287xapfrslnw0gcmx5es2966z0ul2kt", "script": "00148b2c2a130a3f8dd0a470fcdcf46366a660a2eb42", "tx_index": 1948766388430146, "value": 35080, "spent": true, "spending_outpoints": [{"tx_index": 5343737085255499, "n": 2}], "n": 16, "type": 0}, "witness": "0247304402205df9490519fdb12293000555de723c3fcef79744bd9d5b8d5c11f58199dd1c690220055efe90df10fffe4348330e71422c9ddaa6866f21737d241458d23b5338fd5f0121027b308c4072b5bdfc7b621a9c525f292962c8b22b76adae287e885cea5c735901", "sequence": 4294967293}], "lock_time": 708833, "fee": 3308, "ver": 2, "weight": 1107, "rbf": true, "tx_index": 5343737085255499, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 3, "vout_sz": 2, "time": 1636406682, "hash": "45cba9914b76a59e00d79e1c91f033aa588ec372e070bffa5359faeaf5cde097", "double_spend": false, "out": [{"addr": "bc1qr0dhfm8vc3xkphk8khvtmfst3tylwz25js7hce", "script": "00141bdb74ececc44d60dec7b5d8bda60b8ac9f70954", "tx_index": 5343737085255499, "spending_outpoints": [], "spent": false, "value": 9036, "n": 0, "type": 0}, {"addr": "34epPEaTj3QSxzY6qNv37GsveTARNCAKQ8", "script": "a914207de9986017b005e37a0d87c32d6130bf7eb16a87", "tx_index": 5343737085255499, "spending_outpoints": [], "spent": false, "value": 263439, "n": 1, "type": 0}], "size": 519} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qy0gaeyce57lxp50drgykph4w66nhlpe8jckshw", "script": "001423d1dc9319a7be60d1ed1a0960deaed6a77f8727", "tx_index": 4743097401189285, "value": 69499, "spent": true, "spending_outpoints": [{"tx_index": 5110638976348890, "n": 0}], "n": 1, "type": 0}, "witness": "024730440220221022139843e1908fb2e434561fd38d7773c7dcad8967fdc49da92a3086c89702204daf4aeb8155f8808ebd8f499ab374735ae166f5293d03fb7568fc51fb4fc91b01210361d45ff7fac9f642cf58212a4e6218ac3f37877d7c76ce344005c3aab5d37f25", "sequence": 4294967295}], "lock_time": 0, "fee": 762, "ver": 2, "weight": 561, "tx_index": 5110638976348890, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406682, "hash": "0096ca3fbb1bff200e0a42c8c1ea5ed7185c6056d137ec16f7d39615e6ca4091", "double_spend": false, "out": [{"addr": "bc1q5tk950a02p6shgwguadslvfzqku58xwp9lzzck", "script": "0014a2ec5a3faf50750ba1c8e75b0fb12205b94399c1", "tx_index": 5110638976348890, "spending_outpoints": [], "spent": false, "value": 28768, "n": 0, "type": 0}, {"addr": "bc1qwmzgzwzyr0e54yy3hkxaw9u6e49ajpn6mrkhjx", "script": "001476c48138441bf34a9091bd8dd7179acd4bd9067a", "tx_index": 5110638976348890, "spending_outpoints": [], "spent": false, "value": 39969, "n": 1, "type": 0}], "size": 222} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qygqr8qtd4j9rdghsuynqjrl5w48g4vdljfjqme", "script": "0014220033816dac8a36a2f0e126090ff4754e8ab1bf", "tx_index": 1627354218830689, "value": 532478, "spent": true, "spending_outpoints": [{"tx_index": 359661801933760, "n": 0}], "n": 1, "type": 0}, "witness": "02483045022100ccad32d2ea86395a948fdc39ba0c9d41eb4bd59985b0b8661c119281d195a3a9022009d52cafda40e59441dcab480bd1af6d0770480f8b86b980004226e806f04958012103f2d24c9c367940e53d26e7dd458ebbf77e1c92863186827b9625ad746f139a1f", "sequence": 4294967280}], "lock_time": 0, "fee": 2841, "ver": 1, "weight": 566, "rbf": true, "tx_index": 359661801933760, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406682, "hash": "048d1c7095b788fcb821e42c356666730ee09ba29740ad21e1055e8c4fe2380a", "double_spend": false, "out": [{"addr": "3HMSqWAprQoqjb3onvdwumdtoa3G9Vrfaj", "script": "a914abce7d5e050f9132c976b37f585f3bf33ee22baf87", "tx_index": 359661801933760, "spending_outpoints": [], "spent": false, "value": 79138, "n": 0, "type": 0}, {"addr": "bc1qftaw4cg62xszfgxk3cs7mkx8fzv4sa38f7ccq9", "script": "00144afaeae11a51a024a0d68e21edd8c74899587627", "tx_index": 359661801933760, "spending_outpoints": [], "spent": false, "value": 450499, "n": 1, "type": 0}], "size": 224} +{"inputs": [{"index": 0, "script": "483045022100cce22fe50282f5492de0fa3385044d04fe254f6a9b004bacefec6192ddf29acd022035b0be5530ab0526ad6b0a17cf9e4bf038e184124cdfcacbf9f6a4264c8946c30121022a0160b2ed13b803ddca6f6f04606f56dfadee571d683725c7a58d0ed199de79", "prev_out": {"addr": "1BFfc2e6Kk82ut7S3C5yaN3pWRxEFRLLu5", "script": "76a91470774e661a57865243c066c0e287a018f074992a88ac", "tx_index": 6524033013547955, "value": 9437293, "spent": true, "spending_outpoints": [{"tx_index": 8168903104703233, "n": 0}], "n": 3, "type": 0}, "witness": "", "sequence": 4294967293}], "lock_time": 0, "fee": 31492, "ver": 1, "weight": 1392, "rbf": true, "tx_index": 8168903104703233, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 4, "time": 1636406681, "hash": "2ec82501e968bc99e6fb3d1f3fa4a7ce9a6317d85cdc21740e085815be972ce8", "double_spend": false, "out": [{"script": "6a4c5058325bc742fdc563fd8921b0530a8b15e2a28f056d017f1b9709e22cd4a15b78a93f95c6b42e72533bdb55da23daa9fde62bf12b9541da73bcb3cbbe82eed81925dbce000ad0e1000c000acf48001403", "tx_index": 8168903104703233, "spending_outpoints": [], "spent": false, "value": 0, "n": 0, "type": 0}, {"addr": "3KitFxbHAp9CQQsxjPB3YyVwGvRXwi13WS", "script": "a914c5ccb289097f529980eea375abb5cd022a5abbd387", "tx_index": 8168903104703233, "spending_outpoints": [], "spent": false, "value": 160000, "n": 1, "type": 0}, {"addr": "3MuLXCkM3CfU8hNjsAXLvdMjH3L5UtDW8g", "script": "a914ddb7081d20f79f751f5ff0ddea90b1537814131987", "tx_index": 8168903104703233, "spending_outpoints": [], "spent": false, "value": 160000, "n": 2, "type": 0}, {"addr": "1BFfc2e6Kk82ut7S3C5yaN3pWRxEFRLLu5", "script": "76a91470774e661a57865243c066c0e287a018f074992a88ac", "tx_index": 8168903104703233, "spending_outpoints": [], "spent": false, "value": 9085801, "n": 3, "type": 0}], "size": 348} +{"inputs": [{"index": 0, "script": "483045022100a4b7f020622c363eaba4755d580fb57639091e6d104dcf1c9571d31fefa3c01d0220746557af6aaf36915b94fba45a5b187d1be716c29d41c10a0f49c2534711f1350121027316cd81f0023a6ac021a1ca808954f67a81fcba913e8709304c21957328f7d8", "prev_out": {"addr": "114cpdir5bHyPvj1VdkdxMAmHPj4C2LS32", "script": "76a91400af26644e994c50442116ec53fe4e627158aeb688ac", "tx_index": 3892264390479835, "value": 411800, "spent": true, "spending_outpoints": [{"tx_index": 8119601212676566, "n": 0}], "n": 5, "type": 0}, "witness": "", "sequence": 4294967295}], "lock_time": 0, "fee": 2660, "ver": 1, "weight": 756, "tx_index": 8119601212676566, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 1, "time": 1636406681, "hash": "038928b9760f266e4302689a429a385c8f991718002d0ee52fb5cefecfdfc5e6", "double_spend": false, "out": [{"addr": "bc1qyu0tzjwxmjf9fc7436agsfm3phzwu9tgrdh5cq", "script": "0014271eb149c6dc9254e3d58eba8827710dc4ee1568", "tx_index": 8119601212676566, "spending_outpoints": [], "spent": false, "value": 409140, "n": 0, "type": 0}], "size": 189} +{"inputs": [{"index": 0, "script": "483045022100a53299956b0e64ae7cae5c40a18d21c2c83efe4400c90446c3c44d21c08f5b3f0220527917fd6a303b2c948f7812bb58039ff22f700d5201c2fd34d19a68b06e6941012103c802623088776d440c3fb9e8d82952975b416983327fb8873a021af87786d3ca", "prev_out": {"addr": "16K7RJeWUcceXuaZMRMCdSWWmqFqTVuyF1", "script": "76a9143a45797dbd5256d42ebe2d4a1613b59ad02dee4688ac", "tx_index": 899796572510560, "value": 115122084, "spent": true, "spending_outpoints": [{"tx_index": 8088693211060628, "n": 0}], "n": 3, "type": 0}, "witness": "", "sequence": 4294967293}], "lock_time": 0, "fee": 9441, "ver": 1, "weight": 1392, "rbf": true, "tx_index": 8088693211060628, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 4, "time": 1636406681, "hash": "0fb1ac23b4426d082a7d5b65d1b3075807e43ae1fc1067885fa6cc562cfde4e5", "double_spend": false, "out": [{"script": "6a4c5058325b3e3a35f93c1a9a6e6ab36b1fef1eea975ef7caf4e6974e082abc8331e39360883e717513dbddfbe24dde63649095a5f2dfe19e9a469f391a59c4447f9f329c74000ad0e1000c000ab7b801a903", "tx_index": 8088693211060628, "spending_outpoints": [], "spent": false, "value": 0, "n": 0, "type": 0}, {"addr": "3KitFxbHAp9CQQsxjPB3YyVwGvRXwi13WS", "script": "a914c5ccb289097f529980eea375abb5cd022a5abbd387", "tx_index": 8088693211060628, "spending_outpoints": [], "spent": false, "value": 188888, "n": 1, "type": 0}, {"addr": "3MuLXCkM3CfU8hNjsAXLvdMjH3L5UtDW8g", "script": "a914ddb7081d20f79f751f5ff0ddea90b1537814131987", "tx_index": 8088693211060628, "spending_outpoints": [], "spent": false, "value": 188888, "n": 2, "type": 0}, {"addr": "16K7RJeWUcceXuaZMRMCdSWWmqFqTVuyF1", "script": "76a9143a45797dbd5256d42ebe2d4a1613b59ad02dee4688ac", "tx_index": 8088693211060628, "spending_outpoints": [], "spent": false, "value": 114734867, "n": 3, "type": 0}], "size": 348} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1q35kxtzdg45sv4qdffuwne0lkyqk503lsenp2rq", "script": "00148d2c6589a8ad20ca81a94f1d3cbff6202d47c7f0", "tx_index": 257608135930969, "value": 14588981, "spent": true, "spending_outpoints": [{"tx_index": 5165127671898678, "n": 0}], "n": 45, "type": 0}, "witness": "024730440220731132ccb476f525b26b107bce0a178d24efa51e57532b36fa04146b65fcb764022056c20555328dff7dfe8a2bf688342b12e20402aa030e54aa3fab70a701a5e254012103caffc14461ccc8f7734b136c2d8d43f80c0e03e060306dd80d1090621ad4786a", "sequence": 4294967293}], "lock_time": 0, "fee": 5000, "ver": 2, "weight": 565, "rbf": true, "tx_index": 5165127671898678, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406681, "hash": "1f6407cc5775b64b998484d6d56b3573154b402fa1ea02ceeab211d30040cd92", "double_spend": false, "out": [{"addr": "bc1q6qz3g79fswpxglzy3763rcw3gxc8nef5cs65d3", "script": "0014d0051478a98382647c448fb511e1d141b079e534", "tx_index": 5165127671898678, "spending_outpoints": [], "spent": false, "value": 3144994, "n": 0, "type": 0}, {"addr": "3D1tr3hpj3wsxKNTTvDwFQLX8HLKvqfLRU", "script": "a9147c3b60fe16c16f5d7647b49b591fc41e486d685587", "tx_index": 5165127671898678, "spending_outpoints": [], "spent": false, "value": 11438987, "n": 1, "type": 0}], "size": 223} +{"inputs": [{"index": 0, "script": "473044022047a98e25f4c769aaf2b020068f260eab3ba801088b9f737a9c1611440da3bf0602201b028d389547859ee3fa9df00a5a6dc7c43af6cd4d4edb16888e16eafcc2f3de0121023c3653337d83cc44cda37213af4bb8a2ffa7d8be816af77c50383e275e40121f", "prev_out": {"addr": "17WLwUtYVAd7aLBjoXjpRQs2N91KMMkwpw", "script": "76a914475d764c7e4edbb3fa80d6a6137017c518029aca88ac", "tx_index": 8096487178208700, "value": 11437, "spent": true, "spending_outpoints": [{"tx_index": 4354883209311598, "n": 0}], "n": 0, "type": 0}, "witness": "", "sequence": 4294967295}], "lock_time": 0, "fee": 2660, "ver": 2, "weight": 880, "tx_index": 4354883209311598, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406681, "hash": "616d725b66d774705b16a0b8d784ea4199d90316c773cad21c72abd515f2c57b", "double_spend": false, "out": [{"addr": "bc1qsj5gcqdasm4r02709mwhak8evt79cc8p867dp7", "script": "001484a88c01bd86ea37abcf2edd7ed8f962fc5c60e1", "tx_index": 4354883209311598, "spending_outpoints": [], "spent": false, "value": 2750, "n": 0, "type": 0}, {"addr": "3AGX26cDupzqBk9M6XxNJraUSx7fua6Dsu", "script": "a9145e17055b1fc5b9a3faadb5aecbb50842b7eb3e0087", "tx_index": 4354883209311598, "spending_outpoints": [], "spent": false, "value": 6027, "n": 1, "type": 0}], "size": 220} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qe4utpcnrpuukfzsz3wc47urc499qpvrkysa9y0", "script": "0014cd78b0e2630f39648a028bb15f7078a94a00b076", "tx_index": 2709622147856081, "value": 599728, "spent": true, "spending_outpoints": [{"tx_index": 4245294408202541, "n": 0}], "n": 0, "type": 0}, "witness": "02473044022052a61612215d298bf8b501977c6f450974c96da0296681097d969c9ccf12c52302205707101e2dd77280d7da37331609a0640c051afd272df731988b55cf57d086110121029141e1d2d3428ece369ceadba650b6658a05616d3c46686675a8373ab6234e8e", "sequence": 4294967295}], "lock_time": 0, "fee": 1565, "ver": 2, "weight": 573, "tx_index": 4245294408202541, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406681, "hash": "76d4a1d5a84199005706abb332656ba7444f0c8723278e50b868c9570995a878", "double_spend": false, "out": [{"addr": "1jFbMdXeRWUenEpT2cBR393QnWgdD9L5x", "script": "76a91407fda6c684e080960f2a8efe2695a3521090378a88ac", "tx_index": 4245294408202541, "spending_outpoints": [], "spent": false, "value": 390175, "n": 0, "type": 0}, {"addr": "bc1q85gh70j8v42dz2yadg0k4t865dkas4ylh320vc", "script": "00143d117f3e476554d1289d6a1f6aacfaa36dd8549f", "tx_index": 4245294408202541, "spending_outpoints": [], "spent": false, "value": 207988, "n": 1, "type": 0}], "size": 225} +{"inputs": [{"index": 0, "script": "48304502210088110a3fcc746b858d8b35bcfb7f33f2ed63ffe478de8fbfba70e8c4a07a9dd702205f3ae20cd5a008ead23c3a93693ddd8a6b35bd9c49c12fe80bbb91121a1407f6012103e356007964fc225a44c38352899c41e6293a97f8d8115998ae7e97184704c092", "prev_out": {"addr": "1H3tZ2nmW1bTs7qRYS4xUZwaSa3zm614zg", "script": "76a914b00de0cc7b5e518f7d1e43d6e5ecbd52e0cd0c2f88ac", "tx_index": 8537076410918044, "value": 116543245, "spent": true, "spending_outpoints": [{"tx_index": 4095256255478091, "n": 0}], "n": 3, "type": 0}, "witness": "", "sequence": 4294967293}], "lock_time": 0, "fee": 31493, "ver": 1, "weight": 1392, "rbf": true, "tx_index": 4095256255478091, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 4, "time": 1636406681, "hash": "35d2ba109b4c45cbf712f4a5a6e19587a8add557dc131109a65dcaf932e96474", "double_spend": false, "out": [{"script": "6a4c5058325b851f202ae68c8573ad0d3cc98e378bc54bd96fd18e3cb58d20849456dec8eb6a39d929f22981a121e7472630299eb509170f3acd1b03d6a668dbcb6ec0e3fa44000ad0e1000c000ac08d005003", "tx_index": 4095256255478091, "spending_outpoints": [], "spent": false, "value": 0, "n": 0, "type": 0}, {"addr": "3KitFxbHAp9CQQsxjPB3YyVwGvRXwi13WS", "script": "a914c5ccb289097f529980eea375abb5cd022a5abbd387", "tx_index": 4095256255478091, "spending_outpoints": [], "spent": false, "value": 233000, "n": 1, "type": 0}, {"addr": "3MuLXCkM3CfU8hNjsAXLvdMjH3L5UtDW8g", "script": "a914ddb7081d20f79f751f5ff0ddea90b1537814131987", "tx_index": 4095256255478091, "spending_outpoints": [], "spent": false, "value": 233000, "n": 2, "type": 0}, {"addr": "1H3tZ2nmW1bTs7qRYS4xUZwaSa3zm614zg", "script": "76a914b00de0cc7b5e518f7d1e43d6e5ecbd52e0cd0c2f88ac", "tx_index": 4095256255478091, "spending_outpoints": [], "spent": false, "value": 116045752, "n": 3, "type": 0}], "size": 348} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qnqar8snpjn6fuacs5jcgzlvrw5dy8jxhz2mfjc", "script": "0014983a33c26194f49e7710a4b0817d83751a43c8d7", "tx_index": 6982060248241846, "value": 7207130, "spent": true, "spending_outpoints": [{"tx_index": 2264322793739384, "n": 0}], "n": 4, "type": 0}, "witness": "024730440220137cd22bc931118f02492e8e0cf809d773d52df8f7672f3252c4ec39303b74cf0220758cf82c061a5c4f110482af3b83b172e91a7c9912c62ce9c3f5c7046fd9c079012102cc7693c6544c2fa1fa39ef6d8df94981c11a1e85b615e551210147cc2d70f2aa", "sequence": 4294967295}], "lock_time": 0, "fee": 1537, "ver": 2, "weight": 565, "tx_index": 2264322793739384, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406681, "hash": "1a6cffbdcdc449272dd30f6946c694299bb33553d118cf8b2ac0a338de1d5b40", "double_spend": false, "out": [{"addr": "3LeRZt4Ka9pwJ8dVZh8aLGGVZetLboJ9Bc", "script": "a914cfece0f9e2c99359da247bc73d62c5671647cd7187", "tx_index": 2264322793739384, "spending_outpoints": [], "spent": false, "value": 4519404, "n": 0, "type": 0}, {"addr": "bc1qc0zf6gcpfwdjmsfclfrk5m8n30cesmfpprmlvf", "script": "0014c3c49d23014b9b2dc138fa476a6cf38bf1986d21", "tx_index": 2264322793739384, "spending_outpoints": [], "spent": false, "value": 2686189, "n": 1, "type": 0}], "size": 223} +{"inputs": [{"index": 0, "script": "483045022100d128ba7209396f4266d1f5e4e9ba5e3c0738cedc5fac453debde6b2990297ac402204ec2cc1420e1b6c24fccdbdaef5d5789ecbc266db5a7560095fdb94b517bc99801210302fbe8f61db05a3e5af8a58406047dad9e64f20bcd0559406cfa6bdd27f37877", "prev_out": {"addr": "1GCSsXH5kapeT6or8MZA2rGzGRB2iYPB1u", "script": "76a914a6b40ef472690f4e73e4991e09896253b3622ffd88ac", "tx_index": 6833894222700434, "value": 3500000, "spent": true, "spending_outpoints": [{"tx_index": 1946642491818096, "n": 0}], "n": 23, "type": 0}, "witness": "", "sequence": 4294967295}], "lock_time": 0, "fee": 9550, "ver": 2, "weight": 768, "tx_index": 1946642491818096, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 1, "time": 1636406681, "hash": "508bb1be93e22bb12fb0d2f40a0b326bc201c1fd7286b8605a8003d631b05337", "double_spend": false, "out": [{"addr": "12qA97T8hsDgvVoRCXGZifd9PCraqvd2DW", "script": "76a9141413b8b4f23ed118b7f4d50347169cb293ddd00588ac", "tx_index": 1946642491818096, "spending_outpoints": [], "spent": false, "value": 3490450, "n": 0, "type": 0}], "size": 192} +{"inputs": [{"index": 0, "script": "4730440220476093b1918aed8f7f9b5e3c55b7ff7f766c02bb6e165906a09e5c025d63a3600220486501de99dab2be3a3f3f0c893756b720d363a4553c8b9d52e0da074b5038f60121025d514ed190100151d729045a0db9557479c0577c4d691d265185553b84d0be8c", "prev_out": {"addr": "1F5gUNJfLWGoMSiFxF48XoTacWuHno9cLT", "script": "76a9149a745fcf97eb0caf29ebdc91758609eb8a91e21588ac", "tx_index": 4256194493945134, "value": 50076370, "spent": true, "spending_outpoints": [{"tx_index": 1421733087335887, "n": 0}], "n": 44, "type": 0}, "witness": "", "sequence": 4294967295}], "lock_time": 0, "fee": 9550, "ver": 2, "weight": 764, "tx_index": 1421733087335887, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 1, "time": 1636406681, "hash": "f88fe1d92848f6cdb1a4dbd55014500cfd3e31e3ba1cd0d22b7fae163d786828", "double_spend": false, "out": [{"addr": "12qA97T8hsDgvVoRCXGZifd9PCraqvd2DW", "script": "76a9141413b8b4f23ed118b7f4d50347169cb293ddd00588ac", "tx_index": 1421733087335887, "spending_outpoints": [], "spent": false, "value": 50066820, "n": 0, "type": 0}], "size": 191} +{"inputs": [{"index": 0, "script": "2200200dfc4a66de0016ebd1235cecda93035e41ec9b55b10235f915b86d1a546798cb", "prev_out": {"addr": "3GZ9abPDEseMGFqQCCy9i7GmBExTrJnARF", "script": "a914a30cf332f4583b92817d4659c62131ae0ef8024587", "tx_index": 6647176713962777, "value": 404900, "spent": true, "spending_outpoints": [{"tx_index": 8440511462993326, "n": 0}], "n": 1, "type": 0}, "witness": "040047304402201c3ffb6ea33a5a35797a12f74fe514e9d45974de9c561b33cbabbd4fd516c8df02202b44d3149ae07d77f5a7f04b7c3c18faab52bd94a536c4efeaa5f5f5d6ce5f5f0147304402202f366f2ee61da7b620f781f58be5c9b1a50ec6ea6c173127beb310515bfad686022044768b0fddce9dc954bed9bc2cbdfdd0e9e3c6b6ec632f41f8df3f630637fbc7016952210277f2ba05b1eebea79583967eaa2b04dc38ab7e3190ea29f863e9426117efdfd121027ce6a87cfe2c52fcd3ff777d4020aec43530e2aa13152bb1110bc8c08f09a7ab2103a92bb2426fd6e534dce3457321b7368bbd62e575390ea3d0667e2b9f3bb298f453ae", "sequence": 4294967295}, {"index": 1, "script": "", "prev_out": {"addr": "bc1qu6mqnfm9jxym9q2z2aqt728skqr3lj9efud38k8xk3mk7kkt5dtscl8w64", "script": "0020e6b609a7659189b281425740bf28f0b0071fc8b94f1b13d8e6b4776f5acba357", "tx_index": 6969173977813683, "value": 1855452, "spent": true, "spending_outpoints": [{"tx_index": 8440511462993326, "n": 1}], "n": 1, "type": 0}, "witness": "0400473044022068aba48776dae67a9f1c9169ddd871f25bc7bde0a46fc62c2d654ee1ec2c4a9902202788acab686f90f1da868b6672a4e30b5e1f0e06260211b93449cfb83c8d53c10147304402201bdbc7ec794645c8edf3ac774673c8ad2b8d9ffa8ee074369da197d46413db9802203a78e1e60ac70561425c17752f6d4036ff5ee525afdb54ef409dd84b32c2f3ce0169522102d37f29ff88778662f3d29fea340fb6aa13ade26607e42de132fe01f782eb87e5210321a9eb7b780998d00f76a13363e8ca444929507637041320eb01694ebaf243a721029addc5991928dc1e9fde19248a5107d7f22bfc53167538da41121373bbc2104f53ae", "sequence": 4294967295}, {"index": 2, "script": "", "prev_out": {"addr": "bc1qspv4yquzceyrzt38a9u35d9twml5hdfnxftcuzjuywqkvm0zfmpseyw8hs", "script": "00208059520382c648312e27e9791a34ab76ff4bb53332578e0a5c2381666de24ec3", "tx_index": 44131911090766, "value": 1197742, "spent": true, "spending_outpoints": [{"tx_index": 8440511462993326, "n": 2}], "n": 0, "type": 0}, "witness": "0400473044022040765c106166049476f49372779f45086c35b7dc86387b4fc096599927e9047b02206b84704a25e26d1311ca5be788302a744a707e24e9e1b944220e644d921e92060147304402201722e984d3d2a94a5dc5c39b5386c7d8f368ae98dffc99cb907b75867d7a69910220146501b810c528ef2e22420770b444d0ec897a34d9f96301293daffc1588f5ce016952210329104e9a73fc7cc9b1b92ed1840becb2629bad89b54c51507c398c792cc4e34d21039a398d0b313eb9a0fe5ebbfa82831d6b12484afad96dab024d2f59abe53b9e482103ce5e070726be00f4e68de78399a2454e98b8adb337afb8049f59822d0deb540e53ae", "sequence": 4294967295}, {"index": 3, "script": "2200205cad65e305cc6133a4656f0b90e55e5fd27d56ea8989ddd8710011bb2f9a25f5", "prev_out": {"addr": "3QDqnt8GdnqVHtD6HStEjbvE2fY3fx5PZS", "script": "a914f727344740d90879bc75b6f1c270728169b2c32987", "tx_index": 5957529889331012, "value": 185749, "spent": true, "spending_outpoints": [{"tx_index": 8440511462993326, "n": 3}], "n": 1, "type": 0}, "witness": "0400473044022020c17ea21f75fa1be73560d5c52d3d1f2fd8d3f7a24c180e7f244abc004723af02207df7f7b4d4c5779b1ccd2f222aa81661f2e60a9eb4356215dde97455722f4fc80147304402203fb1b67b458bf1d51bdb52f530055d299ceaf7ff40c703b9887ef25e74af13320220086a1b0ad1d262e39a0dae4a25346b8cc81c30566afa00407015bc38fc465d8401695221026e33ed0de7d7b055a4ad00cf55b18e7d626793c2e53f5e6404f7acba8b9dfd2e21038457838d7212a5226ea0442dc760687edecafe878259554bb8337c68ab2ebc6e21031334681c10af6c6725fe271312706d6d0c1621ee696be9c70c0d9c78db8fe73f53ae", "sequence": 4294967295}, {"index": 4, "script": "220020704ceb1074b12e21a3ce0d4a333c5e46ef186eb4fee550045cce211aef4b2d7f", "prev_out": {"addr": "3Lxm2dXhtn7GSvE7n1Bqto93FJrbD9NEXb", "script": "a914d3649c8c4a45de54962ef4b63724b2b8d4720c4d87", "tx_index": 8166808157339170, "value": 300000, "spent": true, "spending_outpoints": [{"tx_index": 8440511462993326, "n": 4}], "n": 2, "type": 0}, "witness": "04004730440220149620b097b9329ff71bff6e2476b6262025cd4b31e83f3c4d8b98870c57cc59022056a140427da9228d67c24636f507c655ee101a477311329e30220ab878ff7f21014730440220413b7e19d3e5eb2a6b6672254dda3e8a0b119568e05ef24c9565a5cbd13a4d880220049a371a5708d5cd9936aab1bdb69811387eb18cdaccafde6d2cfefdd678432601695221029762b108c955c77b01b9bf1290da496d648089edbac03fe043f4d7a0df97a79721030c22bb1ceab062a0bb285d5e1c1a7a0c1dd80ee4b3c41fd1e1ec7c21774b4d1121039d0f193e8568ef59b1e9ad11ea63e745d30e3f49c62a293bc7ad8932211507af53ae", "sequence": 4294967295}, {"index": 5, "script": "220020098875b564d1e25dabb9a4504cb460728936cc91da63d8a152d358d0d581e211", "prev_out": {"addr": "3QJz39Aa31dN76Z13H9YCwcAZf6F2Ei3B6", "script": "a914f8202ad4d72dcf2554aa91ad0bf1227c7c9ad7d587", "tx_index": 6250630112621340, "value": 297199, "spent": true, "spending_outpoints": [{"tx_index": 8440511462993326, "n": 5}], "n": 1, "type": 0}, "witness": "040047304402207fb227d787e2d9cbac06bcc5c4af36f745aef49164b9586e72fe4cda7e8934cc02205929a85ad3c6675b362008d7727bc01622abcf18c7367ff7b3faaf6d987c57200147304402207e45dc0b0b16ed3c07602d7d68b55d89db133980682ebcc91d6fba41e167a7f6022012c524d953fa79e4f8bb32064e343c491ef680b91c0fbd86bbeee31cd012fbd4016952210273c9bb0d7f3ad78466b0ab0fdb0c32f191c3c62a7ac39360ad604125216f5ef221020753b5713407f2927cf5409f55452da8257daf80f554eb7bbb93767de3ca5e8021024a689107192d3a68d9416e8c9f1ca2d5055c02110196e122cf346e17f4271ab653ae", "sequence": 4294967295}, {"index": 6, "script": "220020a5be39353759ab8c092a48b43cf99ce99d8bd2b7fe3caa0c5fd5fd6573270e51", "prev_out": {"addr": "3DAbQF1Qt1gt2PgJVQDZ9cgAojvNhcAiZw", "script": "a9147de08f6c99488fb3943683146f4922731519281487", "tx_index": 8129390540705099, "value": 165579, "spent": true, "spending_outpoints": [{"tx_index": 8440511462993326, "n": 6}], "n": 184, "type": 0}, "witness": "0400483045022100f92d9d51120c46ae4458cffa21d1b10790e46336cc6c2dcd0c082c3d64e5fe99022046074155cef8de1bbcedb4d3f2e85727b585c17ca207be08e1553374a8c6ebd301473044022041ba7d23994e273e8788281992ce4bc8469d3e6e470d4005ca9245f5e4b0e2cb022043e7431a36800531297a79c2fd9203dd982c172402761b3481fa1e135293513801695221034ba2ba23394b0f755689054b7b4255033b4377506efcdc78a52251c004ef303d21036c552fe5247bf3242399057a803b830cfa1034ff667beb04a0dba036e04334d22102219ae34744f82840322e696ec60952620c6732925f856c98facf479e0f4e820e53ae", "sequence": 4294967295}, {"index": 7, "script": "2200207d03bf9f9d5d737c4cfcd3c52fda568734df8d47ac2d4fd7b0923cd799f6150b", "prev_out": {"addr": "3ASLBdMYm68XPzet6WyRMWv8s96SHm5VxC", "script": "a9145ff222a72814cd2f9cf2d24f6df766a00e13275587", "tx_index": 1069038252182379, "value": 169971, "spent": true, "spending_outpoints": [{"tx_index": 8440511462993326, "n": 7}], "n": 1, "type": 0}, "witness": "0400483045022100f329bcd51045d3cd44c79c9bb1208dfc566002336e16172d2aea448afde946cc0220258294c23116f66ab7508fc24c98cf411a8c4f0e22b9842b499571da00b653d00147304402201ff37f70c6878949d066c1d1c56495cc1f0531de367fbb7dedcb4ecf50d83930022050cbe2e2cf4da0522364eba8a8829dbde54603900be0d0bf10d3884298a9c7830169522102e5f7df217658be9ad438f44ce637b015c92fcebdcff95b376b07762834f5905f2102f63ecfc519fd8ed25c40c794831fb26c8612d2edcbb60594eec6095e6340962421020a52692f3b21413892c2442cd1ed57db029d6219adffca593160ab2ee97d298853ae", "sequence": 4294967295}], "lock_time": 708833, "fee": 8067, "ver": 1, "weight": 4348, "tx_index": 8440511462993326, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 8, "vout_sz": 1, "time": 1636406680, "hash": "10363fea974e3193db1986a5fe145ebc3d503d2076e8700087776dcbbbcde4ef", "double_spend": false, "out": [{"addr": "17JZmuLxieXvKwYhHpdApFZV8vGPpSjFMf", "script": "76a91445232f3f6b0f2d3c68791e0d2b73c6d66066f0df88ac", "tx_index": 8440511462993326, "spending_outpoints": [], "spent": false, "value": 4568525, "n": 0, "type": 0}], "size": 2602} +{"inputs": [{"index": 0, "script": "0047304402200172589d067a11284b64b91d40f03b3bd63cb0d1c8eef16de5d9f688c7de4c700220629513509e3db415b64bad317c814945f21ff8645d666575040ed824b6bbd8a50147304402201d596bdc65cd52e80466ec71a1c042adcc94385c6865a786afa7e02c1a0e131b02206b0af27c23babc1ce10bbb755b5de4b2114943e25357c6b7063e4a3957679e89014c69522103cc60948abf3b93ee8456ded568504bbc0e52dfe9e603b06a4ecb59d3c263879921027d151040ba4a4b107265db366f59e15ac6ac349541e1a89f535cb55620857f0221023b1ac86f941b15c1e65534b2348aa646f8b8e43c6cb10ff2e6ad857169569fa553ae", "prev_out": {"addr": "3BrLsBbFcHgnkZ4j6VKZc2dN5jbbuVnD3n", "script": "a9146f74d0439f8ce39e87243a64c0c67cbc50bf7c9187", "tx_index": 1752732560978522, "value": 200000000, "spent": true, "spending_outpoints": [{"tx_index": 7929380011639087, "n": 0}], "n": 1, "type": 0}, "witness": "", "sequence": 4294967295}], "lock_time": 0, "fee": 2430, "ver": 1, "weight": 1340, "tx_index": 7929380011639087, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 1, "time": 1636406680, "hash": "2716cac1dc40519daf44e6dde65c9de6fe40c889d1e7cd15537d091037d55de1", "double_spend": false, "out": [{"addr": "36XWTfSYJJz3WSNPZVZ3q3aa5eFuJHR9nu", "script": "a914350c4a5875535bcfae8e8fa5c78fe8d31851e60e87", "tx_index": 7929380011639087, "spending_outpoints": [], "spent": false, "value": 199997570, "n": 0, "type": 0}], "size": 335} +{"inputs": [{"index": 0, "script": "00483045022100d0f252f9da19ac5d3d31dfa4b99348d3222b9e093eb50e2279d372c17a00a29d02207505f91ac5bf3596a90d20a9d361929b2d6ec26df7625d55ab9f9c798e3a0a6d014730440220260091f9f64f78fff891e3802c46ba4b12a089bb7c11ba0060887bec02310a7d0220312f2cecb12d8c2e050bd2c59244f626a8d8d9953eac7fa2ec459a5aecd1bfe3014c695221031ace866d2ba815d6f63a1ad46c98b1ce71736f83a29f0783ebff0b8b4b78f8912103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd608222102be8469f6a74653c615878c4a123b6808c195fe77ddfda7bfac7ffc8604f84fbf53ae", "prev_out": {"addr": "3Nfevq3bXkGTJKc9d2FnZPSaeuinhQntw4", "script": "a914e618b31ec46fd2b0386c1920189dd80ba465823887", "tx_index": 4848279437403438, "value": 580393, "spent": true, "spending_outpoints": [{"tx_index": 7763869997273429, "n": 0}], "n": 1, "type": 0}, "witness": "", "sequence": 4294967295}], "lock_time": 0, "fee": 4452, "ver": 1, "weight": 1480, "tx_index": 7763869997273429, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406680, "hash": "b0f2793ee6e86487ea3d12716375ac46559add5f5350e633f0af8a28ca96a9dc", "double_spend": false, "out": [{"addr": "3MrvPSmfaEwbobJX3Z1gmDhgmr6Z4rJQ7e", "script": "a914dd420dcdbaf39364e6a516dd705314721eb9562f87", "tx_index": 7763869997273429, "spending_outpoints": [], "spent": false, "value": 45193, "n": 0, "type": 0}, {"addr": "3Nfevq3bXkGTJKc9d2FnZPSaeuinhQntw4", "script": "a914e618b31ec46fd2b0386c1920189dd80ba465823887", "tx_index": 7763869997273429, "spending_outpoints": [], "spent": false, "value": 530748, "n": 1, "type": 0}], "size": 370} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qysx5ljuf9zythpzwf7q8kv2n8r4ae9rjx28alnujww4r9gv0s88q3rw5sr", "script": "0020240d4fcb892888bb844e4f807b315338ebdc9472328fdfcf9273aa32a18f81ce", "tx_index": 8448080969961214, "value": 310491642, "spent": true, "spending_outpoints": [{"tx_index": 7119085210022543, "n": 0}], "n": 1, "type": 0}, "witness": "0400483045022100aa5291089586f648d40ef5f85f42b18c8039e04f94ed4f73c43ec98ff1dd47b8022004e4e2fa6ac04bc7e59464046bd6ef4b6d8f789142356aa9fc4c4806f1dc22090147304402201f340b79cb1a3677dcc736d446f0a332ada305e12bc1038cc47883a6e2f2520102201e2a6625bd150e358208294f097baeeea05bd63be61d7cdf3bca33f120d995b00169522103917ca03bd2661580dae0f5b39291423e05b6a502d6936331107952f24a483d4821035a11a581035ca993ea0b3832f07ff2998c1d3a5b0e9ecd62773da18b45586c8421021f046a925c31ba1cf02da3c116374f3f6d3b9ac92d57c81a517ca162192d79f253ae", "sequence": 4294967295}], "lock_time": 708833, "fee": 1370, "ver": 1, "weight": 759, "tx_index": 7119085210022543, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406680, "hash": "620bbbb441c6c3ecfd23d9c3b0f096e7bcf3dcd9f46101395678948d882956ca", "double_spend": false, "out": [{"addr": "3QeVyEUry2pm9y6FeEQbp2Pb4tn2pAjhMZ", "script": "a914fbd10e9c4dcdbdc500754d16fc100c7d502e1dd987", "tx_index": 7119085210022543, "spending_outpoints": [], "spent": false, "value": 1000000, "n": 0, "type": 0}, {"addr": "bc1qe4qnamwfas6rvry4vwxlvrd6n4dd24mt6uk3ulv72hx6qrsjszasf040y7", "script": "0020cd413eedc9ec34360c95638df60dba9d5ad5576bd72d1e7d9e55cda00e1280bb", "tx_index": 7119085210022543, "spending_outpoints": [], "spent": false, "value": 309490272, "n": 1, "type": 0}], "size": 381} +{"inputs": [{"index": 0, "script": "4730440220171bbe9745c42526f6436b77be57f25aca68b5d94983a01b3cc7f1502e17285702201b232f997e13c5df3e03c594bf7a01629504c4993bb8242b7d0471ccf08f5e0f012102c334b8f10a8f1132d2b76f1fb940baee7b1d79d37ed18fbfb752ca8d30f3e519", "prev_out": {"addr": "1DTzJ6oN8dUTdnvsiSTjonbBSrZG3siukQ", "script": "76a91488bc26d7767d7167bd79dfa64800e5e1aaf8f3ed88ac", "tx_index": 406430757177183, "value": 131388112, "spent": true, "spending_outpoints": [{"tx_index": 5814976036215560, "n": 0}], "n": 3, "type": 0}, "witness": "", "sequence": 4294967293}], "lock_time": 0, "fee": 8743, "ver": 1, "weight": 1388, "rbf": true, "tx_index": 5814976036215560, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 4, "time": 1636406680, "hash": "58dd8e1c5bec473d02433a1a611e25732c48134caa7ddf06c141d820e88445a5", "double_spend": false, "out": [{"script": "6a4c5058325b5a5026614fc37fbd391a5417d00ee8dc60469707ff121a35331cfaf87567d3cb9346998d1fba6dc3d31db6c364f7effc0b3b6a9f7c88df8cffcca6bdc91152a2000ad0e1000c000ac767004e03", "tx_index": 5814976036215560, "spending_outpoints": [], "spent": false, "value": 0, "n": 0, "type": 0}, {"addr": "3KitFxbHAp9CQQsxjPB3YyVwGvRXwi13WS", "script": "a914c5ccb289097f529980eea375abb5cd022a5abbd387", "tx_index": 5814976036215560, "spending_outpoints": [], "spent": false, "value": 212750, "n": 1, "type": 0}, {"addr": "3MuLXCkM3CfU8hNjsAXLvdMjH3L5UtDW8g", "script": "a914ddb7081d20f79f751f5ff0ddea90b1537814131987", "tx_index": 5814976036215560, "spending_outpoints": [], "spent": false, "value": 212750, "n": 2, "type": 0}, {"addr": "1DTzJ6oN8dUTdnvsiSTjonbBSrZG3siukQ", "script": "76a91488bc26d7767d7167bd79dfa64800e5e1aaf8f3ed88ac", "tx_index": 5814976036215560, "spending_outpoints": [], "spent": false, "value": 130953869, "n": 3, "type": 0}], "size": 347} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qruetjj7uqcfkmsa0cxf8sgdnep8xmxgvfx946q", "script": "00141f32b94bdc06136dc3afc1927821b3c84e6d990c", "tx_index": 5635466309759257, "value": 996966, "spent": true, "spending_outpoints": [{"tx_index": 5220311469220731, "n": 0}], "n": 0, "type": 0}, "witness": "0247304402207d9dde57a088bd432632c230ea79a70f1db7fed36f201c47261e3990c3e1d35e02206c77477ff9f5509fd3be8431b51aa45c3e7124ba02a50c919b27e983ed7ed5ba012102fe2ffda92eaca80cdd7585c6054552e8670a25f20947be7f21a85a3cff12c8cd", "sequence": 4294967295}, {"index": 1, "script": "", "prev_out": {"addr": "bc1qw74npwlghhv2c7s6qcf28a3a8wgqf7r53ptwze", "script": "001477ab30bbe8bdd8ac7a1a0612a3f63d3b9004f874", "tx_index": 8160989823534114, "value": 200000000, "spent": true, "spending_outpoints": [{"tx_index": 5220311469220731, "n": 1}], "n": 1, "type": 0}, "witness": "02483045022100a93805e8bc163534f8fcb90ae7fc9f754d9db6d6427430f4c68b722a5ff222e1022071567eb9282fb87f235bdeae17b6d7155ca8d0ffd46dc53a32bcb942d54a895b01210335025ec2703e4adbf2c6b4d7990bacb26541766a71ec9797bee1fd857b822c38", "sequence": 4294967295}], "lock_time": 0, "fee": 2485, "ver": 2, "weight": 837, "tx_index": 5220311469220731, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 2, "vout_sz": 2, "time": 1636406680, "hash": "8c84f2c16c601510f51054177cf07cbe8c2ccdeaede3e83b17dd1bebd5c35e94", "double_spend": false, "out": [{"addr": "bc1qga2nhctpyjcjudhgj444r2rk0a0e2uvsz6r0rw", "script": "001447553be16124b12e36e8956b51a8767f5f957190", "tx_index": 5220311469220731, "spending_outpoints": [], "spent": false, "value": 994481, "n": 0, "type": 0}, {"addr": "3B6JTwDdnkqWhQ8MrYKTYjM4CtTkRsQGCt", "script": "a914672081d1b2879901b94de765215bc33edcc0701d87", "tx_index": 5220311469220731, "spending_outpoints": [], "spent": false, "value": 200000000, "n": 1, "type": 0}], "size": 372} +{"inputs": [{"index": 0, "script": "483045022100e3b42e9cecf7a8aa1fecbddfa1c56e6d9b779d97a7daa94b2dd81685a29d227602207b783a16aec0a9fa4c109886a8b5314dedf2dcdaa37d81b1c2120ea5f4a144f201210394dc0824a18be620db5179c2ec732f918d9cc3bcd83c6f4b7ec6b2b00a8334ea", "prev_out": {"addr": "1EW8XKVYVz1eLxf5tUseaeTqvWyRKSvVSd", "script": "76a914941bfa4d9d65a5af433a46a331195f171fdc103288ac", "tx_index": 4510926583080181, "value": 304641, "spent": true, "spending_outpoints": [{"tx_index": 2042138032090263, "n": 0}], "n": 1, "type": 0}, "witness": "", "sequence": 4294967295}], "lock_time": 0, "fee": 9044, "ver": 1, "weight": 904, "tx_index": 2042138032090263, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406680, "hash": "34eb6a363959de07b507d8606f67649019105356072a6c8b5abe64e17f820a3a", "double_spend": false, "out": [{"addr": "14yN4tiDKjLjwPSjhWznSpDHqz4vHJAddF", "script": "76a9142b9141d3c4531f978738529bd140b19f145ab2ae88ac", "tx_index": 2042138032090263, "spending_outpoints": [], "spent": false, "value": 73700, "n": 0, "type": 0}, {"addr": "1EW8XKVYVz1eLxf5tUseaeTqvWyRKSvVSd", "script": "76a914941bfa4d9d65a5af433a46a331195f171fdc103288ac", "tx_index": 2042138032090263, "spending_outpoints": [], "spent": false, "value": 221897, "n": 1, "type": 0}], "size": 226} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1quvacth6dt3xrpze5ct3a7wwcyfz0hvffpx8jxv", "script": "0014e33b85df4d5c4c308b34c2e3df39d82244fbb129", "tx_index": 4173934284806655, "value": 71483, "spent": true, "spending_outpoints": [{"tx_index": 1010130250138698, "n": 0}], "n": 16, "type": 0}, "witness": "02473044022030ff52e2ae87f8df50d64e00ad5a69af9d8a364eaae70a48adcfac250e612dc402206782ba9d4c792807e0e4b61335a273266cf0a581a0047cfca08362eef35205b7012102018173ed81d2d6077432a50a5e785ab3f1db1f9894df4df402f5e8630bc7d413", "sequence": 4294967295}], "lock_time": 0, "fee": 769, "ver": 2, "weight": 565, "tx_index": 1010130250138698, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406680, "hash": "99e21b3227ddd902af56807e7f4aa7c828aa53bbeafb814fdb5522e435aab51c", "double_spend": false, "out": [{"addr": "3Am6L3nsrSjAsexPsZ8MiGXc2oVs3iuvUf", "script": "a914637e792580c2d969a75a14b689e89f8220a1c4e187", "tx_index": 1010130250138698, "spending_outpoints": [], "spent": false, "value": 18078, "n": 0, "type": 0}, {"addr": "bc1qdwm6l7nz96kygsffxrevlm4mxdhlgq6qlfv232", "script": "00146bb7affa622eac44412930f2cfeebb336ff40340", "tx_index": 1010130250138698, "spending_outpoints": [], "spent": false, "value": 52636, "n": 1, "type": 0}], "size": 223} +{"inputs": [{"index": 0, "script": "483045022100a922023c7537164d6f27fcf583eefdfff1b26a34d5ead29b4ddb53cc11b012a1022061531613eec072ad0ab11c8e7f1d5f3c30ea4487b9a911cb4bd3985a1c07fbba012103dfef601fef552f3970e117d267f0ab30a130c56ce34b47732392691652edec4c", "prev_out": {"addr": "191kPzxKyHdYiJurWHtGtg2WbLoTBDSr8x", "script": "76a91457e53b5c374f251e134ef36f66822ea7d768e5dd88ac", "tx_index": 6971306486334625, "value": 64735, "spent": true, "spending_outpoints": [{"tx_index": 670650193123303, "n": 0}], "n": 41, "type": 0}, "witness": "", "sequence": 4294967295}], "lock_time": 0, "fee": 4966, "ver": 2, "weight": 768, "tx_index": 670650193123303, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 1, "time": 1636406680, "hash": "035245c70b7c8d54bb8e53597648d90571d4f0cf75ec36f7963ebf3c549f0f13", "double_spend": false, "out": [{"addr": "15WjpbKNYmdTDts9GBtDdG1j2JCEDNwcAy", "script": "76a91431804f91d0939b310fb0cdbb4612d4739878892888ac", "tx_index": 670650193123303, "spending_outpoints": [], "spent": false, "value": 59769, "n": 0, "type": 0}], "size": 192} +{"inputs": [{"index": 0, "script": "47304402204c3acdf43a3f3f25dcd652a3dcff60891d735a5e734c60468a40925f44ea088d0220500b8c2df235063ac85e3768b3f92c5f4b1050b21c07fee6b5fbb1007aac90b101210331289c78819b6df08c69e95652df77d89249ad002e3c667cb9e487eedfee9e95", "prev_out": {"addr": "1LgLcRZxoNPSHd5EEHHnWaSmDMucp2gkUc", "script": "76a914d7dafb8dcef6c0550e252bd9d0dfd304cb96842288ac", "tx_index": 8370237762239155, "value": 804194, "spent": true, "spending_outpoints": [{"tx_index": 8812535475818332, "n": 0}], "n": 1, "type": 0}, "witness": "", "sequence": 4294967295}], "lock_time": 0, "fee": 7684, "ver": 1, "weight": 900, "tx_index": 8812535475818332, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406679, "hash": "df9daa5a82a434019fba6728586590aed5b93856548ba9c8b0e47ada74a277fa", "double_spend": false, "out": [{"addr": "1Hpw9QNKJJwRBpM6vaK14Wbx3mi2vknwRW", "script": "76a914b892c2b77841caf5650a7c832ef41d9ee51d9a0588ac", "tx_index": 8812535475818332, "spending_outpoints": [], "spent": false, "value": 602509, "n": 0, "type": 0}, {"addr": "1HXPRfDksTwqp69sJqTk46d9bncWjdSvTb", "script": "76a914b5413602288e298259c237ffabf30039fc5b034e88ac", "tx_index": 8812535475818332, "spending_outpoints": [], "spent": false, "value": 194001, "n": 1, "type": 0}], "size": 225} +{"inputs": [{"index": 0, "script": "1600143cc1ea384b02725d2f5c740d3eb8da0a0bbda653", "prev_out": {"addr": "33Abu8t35MbxwZr5QJR5W4wWvQajbGQedz", "script": "a914102fb7e0a60f9983f3e6bd42980fb17591bb995e87", "tx_index": 8132319094453185, "value": 4629000, "spent": true, "spending_outpoints": [{"tx_index": 7388338586294277, "n": 0}], "n": 21, "type": 0}, "witness": "02483045022100fa63dd547126f2586aaf1ce8e843aa61486dc960fcdfe0fa4dc60b25fdd2552b022001c2066d330bdb89f621fc615d08dc7953b42c329669fe82876b7bb03ff595fb012102013acd0f7058dfa199ef5f8ea739d9c9b56454e0064f1b811678205aaf69e746", "sequence": 0}, {"index": 1, "script": "160014e57b385de1427e2b49a636692c75b37e046450bb", "prev_out": {"addr": "3K7TqvJPa7gWnLyCFwdpPNG7sky9bDd8rU", "script": "a914bf19c23143000581fc3acc8eed72bfdecdf8b44787", "tx_index": 6989961435261440, "value": 6000000, "spent": true, "spending_outpoints": [{"tx_index": 7388338586294277, "n": 1}], "n": 4, "type": 0}, "witness": "02483045022100c167fa12d97b81913812bd197ba093049506e0f518b81c11ef83884d6326461c0220044bfb03be89376fc5ae8ad667718458586f02a6a7f2004bb696b4b27261b5a8012103883ddfd4d8c991c7572734b3e398a5f1f80fe4cbbfb2c4aa53cc5e135f585174", "sequence": 0}], "lock_time": 0, "fee": 3354, "ver": 1, "weight": 1026, "rbf": true, "tx_index": 7388338586294277, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 2, "vout_sz": 2, "time": 1636406679, "hash": "b2aa5e8e870d65c3c53dfeafc06fc92caaaebaf2ee654d692928c054073dfdd1", "double_spend": false, "out": [{"addr": "334pLKNjvzoDNXzZcbdivN3yGWMDY2KdoJ", "script": "a9140f179a1d5630e76ea06a6606eb5c915b3b749de087", "tx_index": 7388338586294277, "spending_outpoints": [], "spent": false, "value": 5000000, "n": 0, "type": 0}, {"addr": "36XUfeWxnX3EiAkkQU8GWX7DX5cE27AMBv", "script": "a914350acb1aaad90a2f52bc9199c09f78f88ac66f9a87", "tx_index": 7388338586294277, "spending_outpoints": [], "spent": false, "value": 5625646, "n": 1, "type": 0}], "size": 420} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qc368279fj9hjrrq3f5sjvvdhmqt9e994hr2n64", "script": "0014c4747578a9916f218c114d212631b7d8165c94b5", "tx_index": 1540963183985247, "value": 9500000, "spent": true, "spending_outpoints": [{"tx_index": 6403234720218018, "n": 0}], "n": 82, "type": 0}, "witness": "02483045022100e30456e88ddb7d43f3693ef9e407fdca8ac24d0b9302920f9d383dd7b2ea5a5d02204dac23e072a8e6c3ac21df338ae44b42c7b3badc0b1e8333cc1adc055eedd75b01210360b1c69c82642dd2007663328b87827947a6d7b6b8806945788b4062d723ea22", "sequence": 4294967295}], "lock_time": 0, "fee": 1872, "ver": 2, "weight": 562, "tx_index": 6403234720218018, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406679, "hash": "9a99574aa2a5ae97e0f7ea56ad603fc9ccf39fd09c96ee337f14dd4b17aafdb5", "double_spend": false, "out": [{"addr": "bc1qh6k3jf2x2wv5grkrmnfnuc306cmg6246rcndcp", "script": "0014bead1925465399440ec3dcd33e622fd6368d2aba", "tx_index": 6403234720218018, "spending_outpoints": [], "spent": false, "value": 7531635, "n": 0, "type": 0}, {"addr": "bc1qzl6lf6dsrfm9q69m706e0qq9h7j8fhca3wdva3", "script": "001417f5f4e9b01a765068bbf3f5978005bfa474df1d", "tx_index": 6403234720218018, "spending_outpoints": [], "spent": false, "value": 1966493, "n": 1, "type": 0}], "size": 223} +{"inputs": [{"index": 0, "script": "160014b888ef2801904bd6212cb82f6d93be767170c019", "prev_out": {"addr": "3BTz9gvRRziyKp6h1aSbBbKZjqzWgfEpAu", "script": "a9146b3a5eb913a2c0363ed6d389d779c01a0ab9acbe87", "tx_index": 5623007922830895, "value": 112073, "spent": true, "spending_outpoints": [{"tx_index": 2663410947740189, "n": 0}], "n": 28, "type": 0}, "witness": "024830450221008c9df8e0229b0876e269aa0920ef82b49b1b0f96b5d07db6c15cb464e60d7f4002202cf160315115010e4c81045afc84f27cb076596c7e5c963b1bb70861e47d4994012103d6008b6e4936366f67e4843c69186b741181ce5cae2000e9774a941ecaa94216", "sequence": 4294967295}], "lock_time": 0, "fee": 1826, "ver": 1, "weight": 662, "tx_index": 2663410947740189, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406679, "hash": "0eb1fea04bb8b38a0de47045510274183a4debb55fbedb113dec90727bddb24b", "double_spend": false, "out": [{"addr": "39mU1smGCymUnQW1bYRE9QJrRbhwYMqNvv", "script": "a9145898735878aa63f33f46f0a8f7f562ca3367af0287", "tx_index": 2663410947740189, "spending_outpoints": [], "spent": false, "value": 103554, "n": 0, "type": 0}, {"addr": "3Kn43sbCuff5ZjPKtiURrBuroutLq41auv", "script": "a914c6661e717883aaec4a8e5b338ef4114d444816e387", "tx_index": 2663410947740189, "spending_outpoints": [], "spent": false, "value": 6693, "n": 1, "type": 0}], "size": 248} +{"inputs": [{"index": 0, "script": "48304502210083a5feb7203dd176fc7fefba1e775925e33b1b815ff2f55d2835896e282e7878022078d182e572a288a42154fc55b6129916564bef984347ba232037cf0cc32f213601210355459a64f40fdee501f55f3c4b778caf1d4c9d26fe8d3873df4d6e463495f4ae", "prev_out": {"addr": "17APcwDBUYrgXKwMqYH6RsGkiRmhiQ7Ez3", "script": "76a9144397615609ebb13c36847a6ca710b386ccfd4e1a88ac", "tx_index": 2012985747291880, "value": 68705964, "spent": true, "spending_outpoints": [{"tx_index": 1472749710201141, "n": 0}], "n": 3, "type": 0}, "witness": "", "sequence": 4294967293}], "lock_time": 0, "fee": 29743, "ver": 1, "weight": 1392, "rbf": true, "tx_index": 1472749710201141, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 4, "time": 1636406679, "hash": "773ad9ce09d43cc66600dd60adc108cec7dde836832148d8edad898e1aaadb29", "double_spend": false, "out": [{"script": "6a4c5058325bc92e33a6c3688dc9ca2e35882b97ea6cadb86f1c3306e577e8c7244d479e515f1559694fe4f9fd68e26b68a5ce5773567126d48331e5fd2d7da711fbace5c907000ad0e1000c000ac9eb00a203", "tx_index": 1472749710201141, "spending_outpoints": [], "spent": false, "value": 0, "n": 0, "type": 0}, {"addr": "3KitFxbHAp9CQQsxjPB3YyVwGvRXwi13WS", "script": "a914c5ccb289097f529980eea375abb5cd022a5abbd387", "tx_index": 1472749710201141, "spending_outpoints": [], "spent": false, "value": 202500, "n": 1, "type": 0}, {"addr": "3MuLXCkM3CfU8hNjsAXLvdMjH3L5UtDW8g", "script": "a914ddb7081d20f79f751f5ff0ddea90b1537814131987", "tx_index": 1472749710201141, "spending_outpoints": [], "spent": false, "value": 202500, "n": 2, "type": 0}, {"addr": "17APcwDBUYrgXKwMqYH6RsGkiRmhiQ7Ez3", "script": "76a9144397615609ebb13c36847a6ca710b386ccfd4e1a88ac", "tx_index": 1472749710201141, "spending_outpoints": [], "spent": false, "value": 68271221, "n": 3, "type": 0}], "size": 348} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qn462exs738vsqt7l8cwn2nm8jmzal88apcva59", "script": "00149d74ac9a1e89d9002fdf3e1d354f6796c5df9cfd", "tx_index": 1259854350468265, "value": 34302334, "spent": true, "spending_outpoints": [{"tx_index": 8049598119637189, "n": 0}], "n": 0, "type": 0}, "witness": "0247304402201031ade06596fead82fc22b822e960642f32cec1e504f73c030aff68418d6c8402207e30db0fc5aafb93369c2f248716fd27cffc17819dbeaf33ab57ebc4a5e2d82f012103b3f9b552528b5b663cddc80b82c9593e1078eaa67efbb2a9214ca9ffd15bbe78", "sequence": 0}], "lock_time": 0, "fee": 7810, "ver": 1, "weight": 565, "rbf": true, "tx_index": 8049598119637189, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406678, "hash": "92af74d7293ad66ae63a2482423db60b72ccd8e74f9b7193e62e860be488c8e4", "double_spend": false, "out": [{"addr": "361BmYj9PPgoM7XLSci3kSjnDsM7b3s5f7", "script": "a9142f503563ce2ce4b96fa5f7e284cf04d38531c86287", "tx_index": 8049598119637189, "spending_outpoints": [], "spent": false, "value": 1337158, "n": 0, "type": 0}, {"addr": "bc1qn462exs738vsqt7l8cwn2nm8jmzal88apcva59", "script": "00149d74ac9a1e89d9002fdf3e1d354f6796c5df9cfd", "tx_index": 8049598119637189, "spending_outpoints": [], "spent": false, "value": 32957366, "n": 1, "type": 0}], "size": 223} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qs37nqr8fmr0ke2un27xlklws6qjtmtt78us7jy", "script": "0014847d300ce9d8df6cab93578dfb7dd0d024bdad7e", "tx_index": 5301038809307589, "value": 114369, "spent": true, "spending_outpoints": [{"tx_index": 7412557565511915, "n": 0}], "n": 0, "type": 0}, "witness": "0247304402200396ec8e66733d040ac04492131f62d0230d33fbb81bb67f4399bef7591c77830220731bc425c298c3c7b3aea999f47592d59df57d31ba8cfb4d56e1dda30dbae25f01210266563604baa761a7bee34c03075f8254cc6ed0d0a0a34a0efed3e2e091655f98", "sequence": 4294967295}], "lock_time": 0, "fee": 769, "ver": 2, "weight": 565, "tx_index": 7412557565511915, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406678, "hash": "6c169e1b7e191c94dba7bca47d028131748f22f8273e2f03ef5b478e6474add2", "double_spend": false, "out": [{"addr": "3J2QXx4kUfbSisRTrK16oPYo4iggNwVyVM", "script": "a914b32cca42340e9452fe8b839b54e71bf82d8efaba87", "tx_index": 7412557565511915, "spending_outpoints": [], "spent": false, "value": 31636, "n": 0, "type": 0}, {"addr": "bc1qgxx3jjeqssvukpx3uy23tkt3a4krvcdm0maf4c", "script": "0014418d194b208419cb04d1e11515d971ed6c3661bb", "tx_index": 7412557565511915, "spending_outpoints": [], "spent": false, "value": 81964, "n": 1, "type": 0}], "size": 223} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qrtlvgqqkc46zhdqmu7t8eym6czdz0e4ekhyest", "script": "00141afec40016c5742bb41be7967c937ac09a27e6b9", "tx_index": 7289166207281476, "value": 2205, "spent": true, "spending_outpoints": [{"tx_index": 6437188822160102, "n": 0}], "n": 0, "type": 0}, "witness": "02483045022100b36c5bbde010f68b29b23deaaa280fe406278067a7e7cebc6ad01f8dc640c3fc02205c549b2e297074f7e20efe147268109eccfb683581d65ccf5677357ed60a0532012102ddb8baf48321053484b435baa25661e6e45e61ed85c734ddef142da0bd787a26", "sequence": 4294967295}, {"index": 1, "script": "", "prev_out": {"addr": "bc1q0qmdej3jdshr3f4gec5sk40cuq5mjkf4vdzy4k", "script": "00147836dcca326c2e38a6a8ce290b55f8e029b95935", "tx_index": 6921206253617444, "value": 1851871, "spent": true, "spending_outpoints": [{"tx_index": 6437188822160102, "n": 1}], "n": 0, "type": 0}, "witness": "02483045022100d655a4daa8b714723abccb1abaf4d9cf73e7249aa29a49600bdc6f25221ec12a0220369d190b0eff86976303b1ca51760c5858df99e1bf0c02587f1ebc69a563becc012102e33852da9508b9bf07016aa2f3e492576689381b4242dee63e78357a04e79d43", "sequence": 4294967295}], "lock_time": 0, "fee": 3153, "ver": 1, "weight": 838, "tx_index": 6437188822160102, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 2, "vout_sz": 2, "time": 1636406678, "hash": "02122df248d3d491c60c8c678f7b5b089f229d5bf81665fc7f3797c688b6f4b6", "double_spend": false, "out": [{"addr": "bc1qg49jz36q2g5k06nxxvw7cv6n2gw08k2unfgxdd", "script": "0014454b214740522967ea66331dec3353521cf3d95c", "tx_index": 6437188822160102, "spending_outpoints": [], "spent": false, "value": 345537, "n": 0, "type": 0}, {"addr": "32RnaDE8iFieZnZ1iHAgoQ47AURrtrD2Gs", "script": "a9140816bdeb8f9ba35b16664497b517d613376b6e8f87", "tx_index": 6437188822160102, "spending_outpoints": [], "spent": false, "value": 1505386, "n": 1, "type": 0}], "size": 373} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qdyt5gz0crxyachjl60w9erp9d2z49djtyycnpn", "script": "001469174409f81989dc5e5fd3dc5c8c256a8552b64b", "tx_index": 4926186023820427, "value": 63335, "spent": true, "spending_outpoints": [{"tx_index": 6313101949227572, "n": 0}], "n": 2, "type": 0}, "witness": "02483045022100cf8e74a4964a1486209cef467f1f46978eb7a38fa35dd1fa0e42466745590fbd022007b6bb5e0d791fad9e3de810ae096f0e2e178bfb69c18cf2b7acadf021e61bb1012102f6b6c9a049ae8931fd5c7ae29194d84be9c61cce14a5644409b80607d957a819", "sequence": 4294967295}], "lock_time": 0, "fee": 1850, "ver": 1, "weight": 566, "tx_index": 6313101949227572, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406678, "hash": "2fa56d0e186bd5514698cc462f55211b56e1d5e8ce1eb7bca9a291eab8dc6db3", "double_spend": false, "out": [{"addr": "33NnFxG3nLCqpUWakprq6BS2nGV8JDqeXb", "script": "a914127d5b642be594fe6f3a2b764ee2625e8437b92187", "tx_index": 6313101949227572, "spending_outpoints": [], "spent": false, "value": 40000, "n": 0, "type": 0}, {"addr": "bc1qg0nev9qnnk4u4q5280gk48zzww7e7r2muj5kg3", "script": "001443e79614139dabca828a3bd16a9c4273bd9f0d5b", "tx_index": 6313101949227572, "spending_outpoints": [], "spent": false, "value": 21485, "n": 1, "type": 0}], "size": 224} +{"inputs": [{"index": 0, "script": "160014245c66994534c8beebfb521b41742deb89d8df6a", "prev_out": {"addr": "3BKJ9NN1CkrGDAcxDvx4VUdhhRJbPQcAjP", "script": "a9146995a5bb93f3582105a79c5f6f29388e00a322a287", "tx_index": 6100781714346158, "value": 526384, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 0}], "n": 0, "type": 0}, "witness": "024730440220213fa87da016878fb53601e3e8b617ec37315c25d8da05ef547d434f560d008102207c59eeac60f5199325608afcf6d0598d86f04b6dd45eed722b01ba42f58c753101210387c28f7aa4d4095ce7bd481a243df7da3e3332014107fedfa60ac4455506a01c", "sequence": 4294967295}, {"index": 1, "script": "160014208f3f2c478286d7ddf84679d343f5e31e5015ed", "prev_out": {"addr": "3LQNJFeqJducM9B5RkjREAnwhzp2cxALuV", "script": "a914cd44537edf103cdd577487875af62d6a4bc97e4987", "tx_index": 2120010363353098, "value": 388000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 1}], "n": 44, "type": 0}, "witness": "0247304402201a33d11a58ed0a2a4ea386458072ad1159a240b0739c43167688f6fcc8171ea502203a9aef8e4b021f18258ff9661843e1fc07b48268cc9a36e14a7f5b2cc2388fc50121032f426ae5c22c5492c3fb01130e862668fac362c370ab17048b4b6518ce070698", "sequence": 4294967295}, {"index": 2, "script": "160014dd0e79dfbff8431dde8e1bde09ee3fd8f33abadb", "prev_out": {"addr": "3DEqgRrk8WLkWbjoxfYCTgubifZ61JrWp1", "script": "a9147eae24c836c0dfad1a9d3dc30aace7dcceedaa4887", "tx_index": 5311779576764877, "value": 1000003, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 2}], "n": 7, "type": 0}, "witness": "024730440220329358cdc08245de5f12028ffe0b81f722fe8a37eba01be071a7c2dadf936edc02201bbac3058e0675953be5b4c9842e81bb3b52942dd578e7a51a02f6ad4737021a0121030fea5c73dd57e2a56220b0b3618f2a8fba4a69169b95865b702bce444014f320", "sequence": 4294967295}, {"index": 3, "script": "1600148dd17d4bfccb59ca13eeed2d2235fbdd13df8f63", "prev_out": {"addr": "3CkzSDPVDryJrkKETGveQzsX8e6nCQ68sV", "script": "a9147969ce136d409e0dfa61863f48e54487e240a50687", "tx_index": 280014984703164, "value": 420000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 3}], "n": 78, "type": 0}, "witness": "02473044022019ad0cda1816ae554f9a9fd2f4b915ef15d0a94178d96f5a424a1fbdaa09b64102203f695a1bc3b91ba00bcc540f57bb68efee914cc3652865fc7a97ef5dd50c29230121034bdfd2c4d1838e508f581122123818cf42e2c65f20c321eea25a1d94595cd3bf", "sequence": 4294967295}, {"index": 4, "script": "1600146698a92c950394c65581d5ccadb43883e6e414db", "prev_out": {"addr": "3QKGaLpYZKpU3oFYiJD9wQKGc5QRpUeusp", "script": "a914f82df8f553686e0df9d7d291ad34238b997894e187", "tx_index": 2120010363353098, "value": 676000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 4}], "n": 69, "type": 0}, "witness": "024730440220707d3c9f3bcd5598075d7c98d7336d27d2d5f0910691d70c6b63b7a7cb2e166c022079b434fbe1da334d2be883b81fa1f67ec831cb03331925f3efd61e5a449e62060121039b59699ca97986be42d39392e4f06b131d2813c38086a2ef5790cbb36bb57e52", "sequence": 4294967295}, {"index": 5, "script": "160014893fbf81840687cda88eef404ba137fb70bbeed8", "prev_out": {"addr": "3Pbgjg4zkDMYpAn9CUwCSbXZtG7ZMSodER", "script": "a914f050abac439df106173161a7907ac7959ae982ae87", "tx_index": 2120010363353098, "value": 453000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 5}], "n": 51, "type": 0}, "witness": "0247304402207f5c9a463763ce636deaa9e437cdf992754219a2cb6883e11c2572952aed2551022055412a0f3acdc98e5dfca8f80d8bd68885769462b753994c14f14d09e63c0eaf012102041af6eb5eef960b3bd4fd12e4f18a65f1b04a845a3f42d932f452fd7f32af92", "sequence": 4294967295}, {"index": 6, "script": "160014dd0e79dfbff8431dde8e1bde09ee3fd8f33abadb", "prev_out": {"addr": "3DEqgRrk8WLkWbjoxfYCTgubifZ61JrWp1", "script": "a9147eae24c836c0dfad1a9d3dc30aace7dcceedaa4887", "tx_index": 7620671328471985, "value": 1000434, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 6}], "n": 12, "type": 0}, "witness": "0247304402203635d1e9cfa8a9b80eec89597059ec60575237b133b6e00f1950f06d3b4aefc002204d82ca662983742e90a155627c40873504b3ff6a8f58f386a16e38e918aaa09b0121030fea5c73dd57e2a56220b0b3618f2a8fba4a69169b95865b702bce444014f320", "sequence": 4294967295}, {"index": 7, "script": "1600149b87c0d42bbf113cec3d84b022220477730c617f", "prev_out": {"addr": "36zN9csKAUMi4Q4pMYThKhHfge6qyrqH2X", "script": "a9143a209567d55c564982dd3137079c5b272e02b80287", "tx_index": 2120010363353098, "value": 441000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 7}], "n": 50, "type": 0}, "witness": "0247304402204ec9460288822a838c6ebf03ef25970104202fe1b8d69cf96e3b20daa229801d02200a3c9a050c19449bd7852494be11df77d718985cf08df1176d86156a57943f280121023cab3e259ef4510059a847394e5ad62810012e1bb4a1eb18b78659b16172cb57", "sequence": 4294967295}, {"index": 8, "script": "1600140c03b64061b06b255f2da0bcd911ac4b6967e62f", "prev_out": {"addr": "3FZteKMt2Vd8KD1mtHR46DJtiScZ6z2WoF", "script": "a9149838c5bbe5dd585094dd6a220f82108fbb7ba84987", "tx_index": 2120010363353098, "value": 640000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 8}], "n": 65, "type": 0}, "witness": "02473044022035a17af37663863c99e9e67d6be1bd0452f5b50a4713500c41a8e8045545401002202a30f19d17905fd3498f0f9837a33c7c1de43630b6e3e804c777a92d444040c4012103acb969f631a7aa65493f79b592c80d4baa5bfbd2a4dcafd92c953232e35138db", "sequence": 4294967295}, {"index": 9, "script": "1600148bf5615846d3c2fc7efb32e1315172edb2d79f28", "prev_out": {"addr": "3NwJakNckHJHB3xxHdqvvy7wbUcRxj67NZ", "script": "a914e90e5ef400dc9bbd0cfa4e2e9386491fc587a6cf87", "tx_index": 2120010363353098, "value": 410000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 9}], "n": 47, "type": 0}, "witness": "0247304402201e5b0fc4882d6c929efcdccfde4df2ea0c6f129997f52b877e9c3bdb787795e30220009252b44d4cdc0ac3ee4f64d92206132222d1903404111612e4b93bc588dcc1012102685e8f4521a33196d6906f0e4024129baae259ab76cee517ae2256748e70b833", "sequence": 4294967295}, {"index": 10, "script": "1600146cc07005dc030376bded946c20d498856d7d5c6f", "prev_out": {"addr": "351o7YjrxtK77ZiqBy9UviPu5mq2GBRKdw", "script": "a9142475964f71217eca19ed690ad0d9e964240499b187", "tx_index": 2120010363353098, "value": 940000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 10}], "n": 75, "type": 0}, "witness": "0247304402200a2717f3e17672355650b2a3e4abc1bce9beb2d31865cc98384aada6cf86dcbc02206fcfbc52a3bb5bc5037b40b07031832919c5010a8024f98b363c6ba6dab0ac57012102b8ab9c8fcd372a2077119720a78b2d8127cb6237a8093a61e177ef5ed750b9df", "sequence": 4294967295}, {"index": 11, "script": "160014246d88790ee4c5f71a4a36d187b916b42925bba0", "prev_out": {"addr": "38PKZFb8ZUFmRo3SVD1JDZbhh8QcCUvv5m", "script": "a91449701cc52a04bb0bfb3c9c055df4e3ae4b651ce587", "tx_index": 5941962485242007, "value": 684660, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 11}], "n": 2, "type": 0}, "witness": "02473044022043297ea72cebb7a2009b7b56ba00ba4944d776c4f52ce8a669b78ddd91c270e9022074d31ceb71e524a3be7cd588dd1386b93eeb274255bf89c85b92235807f303460121020cddfa9eb9627e8b57e72820511cfaf2e3ab84f0c45312eb8beee270ea3fd500", "sequence": 4294967295}, {"index": 12, "script": "16001467afe44e66038f304ec5722bc40fb7aea3ee6cae", "prev_out": {"addr": "3M1sf7BsPj7dWznmqJkp9mrbkreN1HhDfi", "script": "a914d3fb64978f19c9ab933f8e92c3c896ca1d4f519487", "tx_index": 6087787934541541, "value": 846235, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 12}], "n": 2, "type": 0}, "witness": "0247304402201add3f09d6910bd4b966c6cc0f545b0e0f8cb0c13f24220cdb59e9555809487602207499181d23c3e996907857d789fe106c97b021bff16284d3f824df68837a394a01210306de51f3091b9ba9df0b5d6d5c415cc2cac7881904a5dda154158dc97268e77a", "sequence": 4294967295}, {"index": 13, "script": "160014668e4c6ab8113058958dc6a4ad1656e52551c505", "prev_out": {"addr": "377tVdQ96D3Hyz85Ev1S4rTeRnoPEVBGmM", "script": "a9143b8cd379177a73a098a871cada051372fde0405b87", "tx_index": 2120010363353098, "value": 463000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 13}], "n": 53, "type": 0}, "witness": "024730440220537e9c0ab79c1745c984434cec12eed5b09e8b6ca736e08e0bee4f4fd2735b600220669179c99b1d8e242a5b619441ff483861282b1592b16080acd970302f0b81d1012103c6f9a8c2df527c45d9bb25c97ccc1c590db15372b86dd7442292366504a248c2", "sequence": 4294967295}, {"index": 14, "script": "160014b7c2a35f652cc39a31d788895069245f76f26c7a", "prev_out": {"addr": "3FmLkfrGKfUuTau4ARWe6LuDphFpSdnsfY", "script": "a9149a6324a3c0243cf9bd23710e2edcf62b01b3ff3a87", "tx_index": 2120010363353098, "value": 371000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 14}], "n": 43, "type": 0}, "witness": "024730440220566a20f2f564de69d9fbdc716c4506f2fbe4719da9b66608afbe05ef7ae70a3e0220320e556e926d140e4e58d6e9bc39ff981bf2a37301c86a5d60e76282f4a589a5012103624a986c8ab535d1e7989fb4e1d5ae1f9864c0c1eccaa6ad4bac82e1acb27822", "sequence": 4294967295}, {"index": 15, "script": "16001420732a9bade652daf02a9cf339b8148e050a26f6", "prev_out": {"addr": "3Gy8aUHxS5V2foo8eFqxiwRfgokCuwNBrz", "script": "a914a79618b84526a6bb08fac0435d618c7b8f18d6a987", "tx_index": 2120010363353098, "value": 658000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 15}], "n": 68, "type": 0}, "witness": "0247304402206793abb775be529d072733a107084c5a8ec6d3abdf20ebece378a52eac33bb87022075a2af0046f216bf260487eee6e180310e544fc5a8ac7d87435fa340dca78fca012103eb4f45f8563f96d7bfefb443820737679d5b1e42e0c4bc43377777f506673bb6", "sequence": 4294967295}, {"index": 16, "script": "1600147394162238d409e51b5ef10204af2b9803b051ff", "prev_out": {"addr": "3PVYT9xkkDfm3PkbBAJvz1dNLZvmR8dhVm", "script": "a914ef27424eb9e7512d7aa374630beaad4c1e82d80487", "tx_index": 8558114015821446, "value": 1000000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 16}], "n": 0, "type": 0}, "witness": "0247304402201a2ecbf7e59620e76996baae21f1d8d3c6f16c532ff46fefe3b979e246e0014e022070e0d5b0cf434d8e2e9b91ce22cab62e0358959ceb57bd7f71287730d65e8d39012103b09e1dd521a53fa7afaffa49c7a47d9a28c9353822d826f0da682a6d587c3838", "sequence": 4294967295}, {"index": 17, "script": "160014ea04cd84bf44ccdf5c6a1440301551a7dc8941ee", "prev_out": {"addr": "37LL86XDTdHxFZQuRw49JaEqZ2pWeatqKH", "script": "a9143de7361f25f0dd9bc5021375dac975377405c36d87", "tx_index": 2120010363353098, "value": 584000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 17}], "n": 61, "type": 0}, "witness": "024730440220261ec4f9256d4a87d0fd859343b40f930beaecf27472942fb7e230d351c289cc02200dd5d763645e14ab01a19ef83bee9a926d402077e9833ffa19627526b2e974fe0121038ab93b7e718c4c8db1e62e3b6db6725f3d4299643889071a036e019c83c4543e", "sequence": 4294967295}, {"index": 18, "script": "1600142d4dc2b8af5e9fa5659084438e0491e37fe2642a", "prev_out": {"addr": "3MYq6XFYybXNgZXv7S82vMCFJvLEwibMe2", "script": "a914d9d62635e530b8ab4b73979c83a17e034a06ab0687", "tx_index": 2120010363353098, "value": 410000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 18}], "n": 46, "type": 0}, "witness": "0247304402202bea8ae2191811db871c753f1575a39abe36d807afea3863d3b13d79aa1a14f40220349140328232a94d989858bf111521926667ed172341fde5e22ba19ecc1cb26b012102c9e0b279804fac063abf2e6875b2fd19f6c0f5a1d3afde81fcfe7fa441ba7ad5", "sequence": 4294967295}, {"index": 19, "script": "160014858a0ef72981cd8e3860462aaf3632cb5522056a", "prev_out": {"addr": "3ABmA5Bv24vh4H4EVSzHz8hdNq8YncsAfh", "script": "a9145d30be15351331b1adc3e2bea1253b6b8feb9fcc87", "tx_index": 2120010363353098, "value": 438000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 19}], "n": 49, "type": 0}, "witness": "0247304402207455768ee2a795ae66efaada57b2639f9eb99029e03c8293dede82a891f410ed02207351031adc32489373d0894810068cefe03a9d37ccb04cc60dd358ccb23c395701210231cf052897d50dbd5363b97418f7371938fa72b1c10e355924a477551e1e718d", "sequence": 4294967295}, {"index": 20, "script": "1600149ce5662c85d8a040a0a8fedcf6ffc5ef2c013a4d", "prev_out": {"addr": "3KhMxRUZwVvCCXTr3BGSWZEHt2Zumhjh3B", "script": "a914c582fc7ee4d8535c6b76210a4adcd098315d6a7387", "tx_index": 5816532241540338, "value": 1000135, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 20}], "n": 3, "type": 0}, "witness": "02473044022062d3c66492a8ce25078a8bf836e2899862a375fa2993e2ea58c9e14d2ae321d3022067b7ddcf501f66292ce573724c67ba92435256d10fe61d0c16a49e413e206636012103f1eafa68ddb13a6f73bd8bf0101190385d8d5869a1e1dd3d4db9f488a52fb757", "sequence": 4294967295}, {"index": 21, "script": "160014298845e31e235d4febcf1aa112e97484476be8a5", "prev_out": {"addr": "3CfEoiXyk51XY4VngLgzDurfKmj8xBwUR5", "script": "a91478534e27f3eaeab9233c19a0b13d1828b87dd94e87", "tx_index": 6077036656197966, "value": 280503, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 21}], "n": 1, "type": 0}, "witness": "0247304402202ecd401babc354ea8b1070460bf7c9c220d66e807e25bd04dbcb1eca8cbbd79d022069d82667b5ef60314a7a7ff8654efa1a084cc71776225970b8564a5a4216f67e012103f86e5045d13f941d0f7e9972c932fdcfc277a3c44e7d89556a9728dbe2fbaa9d", "sequence": 4294967295}, {"index": 22, "script": "160014d04e2375d7f008b1fba75f8f710f89bd89cc6d23", "prev_out": {"addr": "3Ah5LFa1ZctZoxoPYBvMM7Ly1f2kP1zLgZ", "script": "a91462bbfa407579faceb864c26edba86af1dd4b57bb87", "tx_index": 14777540828797, "value": 748742, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 22}], "n": 4, "type": 0}, "witness": "0247304402200ef3ad5c6de5f6e439a4d435767b4573a64a888fcc62c5193a2c36ec664a225802203777f9285a2ebc8d1ab076c38293e91338eb00fb83f46c43dd42b37557669b7801210254371557cfe927bc0efe8c53a163c444802e4461863a678a6e065214a1592e0d", "sequence": 4294967295}, {"index": 23, "script": "16001479e5146ebbdd272052bedd1f9133fa755c61d4d3", "prev_out": {"addr": "3F9fBq78LpmYTaVNigHduaPvUaDgFbYQ7u", "script": "a91493a38e6653c0722886bd43381793c94f2e99993987", "tx_index": 2120010363353098, "value": 535000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 23}], "n": 57, "type": 0}, "witness": "02473044022008b3dc46c7b2f8332c89ec4ee595bbbb3b35f6a244c913e26d1155335c79866b0220580832783f6bfb86f152aa24d96c639f89b34280470fee6af6536e6ae586c6f901210358d5bae23d7afe30aee877a49255a0c2f86d4dc1816ca105a0fce11050db93cd", "sequence": 4294967295}, {"index": 24, "script": "160014e72c84e5aa2c106d171b57236ad6276907d00ff0", "prev_out": {"addr": "3MA592rhYadcEAjB77Hu1Kusdckj36W1MN", "script": "a914d5884e0cb6f6485b5788ac7c05aea38872b68ca587", "tx_index": 2120010363353098, "value": 737000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 24}], "n": 72, "type": 0}, "witness": "02473044022050c1a680d82162b9f4a11ef466c23e5e6caa573409cb234a2a8430ac661899f102202d6ca84234dcdd01331c2df1441895390eea9fd72a9f44f72c81ee6711152399012102369b2feb3c524e7bd2097208cde9fe3e407b5fcea84e964591bff013568dc475", "sequence": 4294967295}, {"index": 25, "script": "160014671091c99943f630da8cece2774ff3da46bb76d4", "prev_out": {"addr": "3JT84d9mu7qzNmxSynDr84ofBCbS9PFtx1", "script": "a914b7d9709058b416927abe3bd549ee2033564c4dda87", "tx_index": 2962392428879614, "value": 936854, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 25}], "n": 3, "type": 0}, "witness": "0247304402204bc9c8cb8c587f6c18e2e417c1810f9df0c40a20b621919ebd54a754fe0dd6b00220504ff547fa19204d33c2f8624999e46078146059a122a37af3d98f022a1a543f012102a392a80ce813ca2378f51efd8538609d040577ea83eca7a92240d5784a303d78", "sequence": 4294967295}, {"index": 26, "script": "160014406f8205275aac8d7c6c72344cca02152a548bf5", "prev_out": {"addr": "3LGVoriH3WQLEShe4J2SQtpf58VgEbAEwY", "script": "a914cbc744917ac8366058a25b7e2258bb655bb738ff87", "tx_index": 3963443407074294, "value": 287237, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 26}], "n": 1, "type": 0}, "witness": "0247304402203e8283acf743866f0dce314703cb257fe6a415c9cb7734c635ce79032c17bf18022022e0bbebcd1d99c54677885e24fd4c5c7479fb2466352263fa20c00e023fc04801210260318f1a0bff76737c114395f5ba160c960ffa5c1dc5fc1dfbe48d0bd76a58a5", "sequence": 4294967295}, {"index": 27, "script": "1600147803ac32a887d24ef5c42c7d2ccca0fd29f29b52", "prev_out": {"addr": "3KoRTNSMrJCUunZTAC2roweWH1dQ6MoTV7", "script": "a914c6a86729c2be63b7771a7bdba83e011e282d3ffc87", "tx_index": 2120010363353098, "value": 993000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 27}], "n": 77, "type": 0}, "witness": "0247304402206ab5ce137525b5ffe3e81b4bddbf23f0d631018b2389a2a7d98312299a632e0c022074eda45629881c87fef3d03c04524247ef22d7e11ab919b572fd0851386b571a012102a9cf2b13d51fe39d440f9fdec4313c03d84491e5566b03a8075ed170dcc29b18", "sequence": 4294967295}, {"index": 28, "script": "160014bc9fda1b06690f3c5d4a7ecf78304b8d13530c4c", "prev_out": {"addr": "3DdfCMDrSC7N1bgyQAo2dhfrmHoB5b31MS", "script": "a91482fef586908462b44ce3211cc018367e709318a387", "tx_index": 1940293304350167, "value": 379541, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 28}], "n": 0, "type": 0}, "witness": "024730440220783f14d9c8e1a28ba4f062c04550bafe7955bac1d49442f3a8102e77aebb74000220301b0784071007112f4445219b81fbe2ad60d3fb03a3b740f27d628fc4aad504012103ec816fedfda7a573b3507a4095ecd25356bdae29ac29af583d0742dd3fd64b0a", "sequence": 4294967295}, {"index": 29, "script": "160014fb55b53d4f7bfef6792ef304f7d387e04f3473d0", "prev_out": {"addr": "3QKjnD37iZd897Jvb4SzkMaz6RkbfwADJ4", "script": "a914f844ae863813346dcbd1bee1c5ee6ece0fcb280387", "tx_index": 7515509429567944, "value": 143699419, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 29}], "n": 1, "type": 0}, "witness": "0247304402205a344ea0033a798f988f6f2e75fe3fc7a4e51fb0aac58eecce86960a90c7b2be022076dd32e670e7cd5584ba6222f7fee24c29c129c33623b9deb378fc0ae1b1cee0012102092b3e3d47a5fd9df3427f38d5c3f3f283315404fe29813eb3c21b739733c519", "sequence": 4294967295}, {"index": 30, "script": "1600149ce5662c85d8a040a0a8fedcf6ffc5ef2c013a4d", "prev_out": {"addr": "3KhMxRUZwVvCCXTr3BGSWZEHt2Zumhjh3B", "script": "a914c582fc7ee4d8535c6b76210a4adcd098315d6a7387", "tx_index": 6141595017703646, "value": 1004964, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 30}], "n": 1, "type": 0}, "witness": "02473044022056753d13c27342500345d2020cbdbf6b42d455b9055cb519dec1edf1b26402500220748b173a19e2548b4e81d6dfd512dc2a2b0962adf35a2ba965617bed4fbaadc2012103f1eafa68ddb13a6f73bd8bf0101190385d8d5869a1e1dd3d4db9f488a52fb757", "sequence": 4294967295}, {"index": 31, "script": "160014572009d0534f928f452e92075b715319c56b0f04", "prev_out": {"addr": "3KCBkYj1uQU1WwBYUfv74FsJbhW34aTLoE", "script": "a914bffe67a97e6712c9c8399e7ca4780b8d241913a187", "tx_index": 2120010363353098, "value": 559000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 31}], "n": 58, "type": 0}, "witness": "0247304402203aacd24fd64fb6e36a77ad96d7d6b8e9ff85bc8719517bd17083e31cf3b52ded02203fe1307e4b5b4f052fb78a482fd43807688a40144e1f4cfcf74e2a37a9819af0012102883a39300d033eea041e8d64327a86f34d7d446692ed149536464c55d180b5dc", "sequence": 4294967295}, {"index": 32, "script": "160014b7555547120be786ec4e7331b4f8b431af6f381f", "prev_out": {"addr": "36CHDjcSoGeoM94ngs5i76caz9VmVimzTE", "script": "a914316955b72f2da6a9f1bf1e45e8e24f9997e736e787", "tx_index": 2120010363353098, "value": 334000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 32}], "n": 39, "type": 0}, "witness": "02473044022077f0da06913932c2ce83b4a0cf9d75f1bd2a1c931370feea311ff54999ee10a802206bc9394c9b76a34329b40d25175592222462f3b7337bfd87ecd1d784af709ab80121035755a8ea00b06f2d6d2825cbb5afe6ee01a006c5af3b69c998a3d6fad5e8de64", "sequence": 4294967295}, {"index": 33, "script": "1600149dbbee0e4b5a93e6d741f68d135a7d6adacf90d3", "prev_out": {"addr": "39ZKggAoPBDqmNCUuQ5kmg2VLVqX7esMKr", "script": "a914564c812f84b5cc87efc5fd21d6ad6c3e034d155587", "tx_index": 2120010363353098, "value": 288000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 33}], "n": 34, "type": 0}, "witness": "024730440220612749f8e8b351852c9269d7e524b67b1cb446bdb4cf9ea6847d1f0b6701a7ab02206e4be2bbb42de273703d95f674e927eb55c89601d6b88df84cc788d633867c0d012102eadad436201da58aaf9d9a6769d957820f4421f8d28214f2adf2254a4dadbae3", "sequence": 4294967295}, {"index": 34, "script": "160014024fafb6b24da61412480a8ec7dee29810626922", "prev_out": {"addr": "3J3CZtv6wSnXFZD24RFJcWnhCanGjMND4o", "script": "a914b3533789871ddc2931ddf0aaaa1d074d9529c53487", "tx_index": 6481523583743057, "value": 346565, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 34}], "n": 6, "type": 0}, "witness": "024730440220624c0e5905e0aaf7d8a77bef8553a69fe32e7976c2547534c7fc69d112a8af09022053e146686a0959c47231e565e04c146909a06ecbe2cd70640f66c6bf4a370fc9012102cc28a61026d41c75afd1774edaa2aeb07a73dce4aac0f01e78b3cc82bbd6a17c", "sequence": 4294967295}, {"index": 35, "script": "1600148fda88dd1a8506a6d90609e8d653f5abad60f708", "prev_out": {"addr": "3CBX4SXmK6WwiUP2apanBLN4pcgSLrrw2W", "script": "a914731539f5ee933d2b4447392ca00fbf4385d75cce87", "tx_index": 2120010363353098, "value": 308000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 35}], "n": 36, "type": 0}, "witness": "024730440220175b003795938737ec99b5d4f2b04927fd509e709de0846f20b30f22954caef102201902f7279780077c9d7d47c2fc2cf4cceeae3ba8a8bab264b6a1de50e4b206cd01210275b284da7763f39442b36545773b9ba8e8348100edeb0d27499963cb330851ce", "sequence": 4294967295}, {"index": 36, "script": "160014c34fa43749637a306cf98a5752203b99e8ca0772", "prev_out": {"addr": "3HgzwwRmMSWnK1Arj5ZeHfrdmGd3QG3mxj", "script": "a914af8132a7604043fff3ea74d7f49a8681ee02d99387", "tx_index": 2120010363353098, "value": 595000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 36}], "n": 62, "type": 0}, "witness": "02473044022026bfbf50720e53095842fa70cd0284079fde17839e049aa82d2532b072609aee02201166af2c69f65a0b4e0cefaba0a0f19961f77ef9b83817dc69d549bb5cd215ec012102305239ec9b5bd7e29cf3273e372078e36bf359ba216776fe3e4baf3800678cfd", "sequence": 4294967295}, {"index": 37, "script": "1600144d737cee3743f08e922783be0b92380e804c1767", "prev_out": {"addr": "3GNEYrUZyQWEMbkHrUunekzsA1R8Rf7gm9", "script": "a914a0fc85ee40ed36376c392588e9ac31e36048a12487", "tx_index": 3177399002884950, "value": 666004, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 37}], "n": 2, "type": 0}, "witness": "024730440220511361009545054732ba72f1b74b9234ef70f329b62c938dc9b67d7ca66d97420220480ea1b70b5fcde83823d9e87dcb23b5f66a1f3341fed650e8c05e2a38dde7a80121026b9c31c95b8c3c7165439d1a144206cb298bd619038aef2e2b2209be42018a08", "sequence": 4294967295}, {"index": 38, "script": "160014c801008024c59bb8690208e6c6f22125a6198808", "prev_out": {"addr": "3CSidcVct2u2i1H21xVnEZLLSTnPRB12uM", "script": "a91475f52026ee959b405bb5cb34b19644b16b7831cb87", "tx_index": 5382643018246186, "value": 562847, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 38}], "n": 0, "type": 0}, "witness": "0247304402205c3bdd5fbb79f7506aabd348665edaa7b8a1d634f32202de37f7fa17e1e22cd1022018f4769bfe623e04834e8f4d994c69205f96bbd064ac1233fcbb304abd4ea5c3012102332463f393eb4ab737fe425f18ce6af0aea2a94f4947fb133e69b70431176e94", "sequence": 4294967295}, {"index": 39, "script": "16001406abacbf8c111c02f8cc644acd6b56085ef9d2db", "prev_out": {"addr": "3NJge9P5c9Pxqna7rHRn2nQrLdYw6ChwAq", "script": "a914e22164d5b814f7cc10ae5ba4b59a208dac3a9e2c87", "tx_index": 2120010363353098, "value": 645000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 39}], "n": 66, "type": 0}, "witness": "0247304402201684e461c2ce904abac7c55213da709bcf7c8ef8a686bb7dc12ff2abce97a98302204f4dff1a6fbe8d1a5bd0a0fd167c7ad8fda81522d05400035097f1d05b9a80f10121039b07e893f65ab81c1023832c2d4427236d8c1db367432842125f66193d59223b", "sequence": 4294967295}, {"index": 40, "script": "160014ca9daf6239883ffb005f6605f42a910ada56e1c5", "prev_out": {"addr": "3BQY7TJvxSV15RQ3KVz8UxaCMUn2AhnUgM", "script": "a9146a9362e1b7f1c872a545d76bb1677dea7d3a8bf987", "tx_index": 8843059898503449, "value": 492011, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 40}], "n": 0, "type": 0}, "witness": "024730440220459b41c3d06a4ded470a7f80709903e9fc8e9715285804a5097136213929606f022046a6632213eca3ffabfeae5eba5de504a4cfcfd269a35acdac2861a4b831c7bd01210202c228cab36ad5cd61c621f30e944e535e79fe3d3da57fcf7136fbc0d2346f87", "sequence": 4294967295}, {"index": 41, "script": "160014dd0e79dfbff8431dde8e1bde09ee3fd8f33abadb", "prev_out": {"addr": "3DEqgRrk8WLkWbjoxfYCTgubifZ61JrWp1", "script": "a9147eae24c836c0dfad1a9d3dc30aace7dcceedaa4887", "tx_index": 8508409653625202, "value": 1000195, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 41}], "n": 2, "type": 0}, "witness": "0247304402201ffc600fed38248a0afac1be944948fa8fb6f0567f77268b5d298e432fb45960022061c3c710f991658018de0a65881ce523f3c553332ccb5cfc7f0cbcac915094a70121030fea5c73dd57e2a56220b0b3618f2a8fba4a69169b95865b702bce444014f320", "sequence": 4294967295}, {"index": 42, "script": "160014b6f67f7407419abe76acc00546ccca21a969ee49", "prev_out": {"addr": "3EHReU66Ek5RgEYbH91UEtyGmU6cBoXdZW", "script": "a9148a23747613c307d82833b122b81e3d563258be3987", "tx_index": 2120010363353098, "value": 434000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 42}], "n": 48, "type": 0}, "witness": "02473044022070a2737b83dadc67acbdf7a6e56aea68333d6c4afcc2e36b60d621e4571113f802206836118c77a72c0316d6e5d42581e6cbcb9a5fe1e7ff477c8fe5ab4490dd29b6012103730fd987ea629b4f966d6aa304f131582517666b49b2d27c273c54b61614ca27", "sequence": 4294967295}, {"index": 43, "script": "1600140f28ca17ceee73e229ed188af885951266f9d1f9", "prev_out": {"addr": "36wVfPxcGDrtNDX5gEmGwCyQ22FkP1tyDH", "script": "a91439959b8bf19ba6846dd492ebf74a444a7d12698d87", "tx_index": 2120010363353098, "value": 727000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 43}], "n": 71, "type": 0}, "witness": "02473044022049d4f12e26cd827b3211f9cc9138b5624a06234d82c993d4b7c96bf7be27641402200dd7a1b925330585d613758828c9f1752e44479dcafa463f6a6dda6c4016cdd6012103428ff6f55cbec0d84a0aa08eed56661afa56637cc94f7b63e15c38c5174ecad6", "sequence": 4294967295}, {"index": 44, "script": "160014711075539e95682a97ceab00deeece823c67ec83", "prev_out": {"addr": "3LZ88idAZzdBhY3XJfD1tfYmBNpNHesd7C", "script": "a914ceec3ef7c6c4471b78fd051be2fade8ae088af0f87", "tx_index": 2120010363353098, "value": 855000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 44}], "n": 74, "type": 0}, "witness": "02473044022069d8f4450cdacd519ee32b3beb4351147d4f51aada6d1dcd523b98539befea1502203d8d541226501b3104fb2d9ad299c8e0eafdfaed28abb1353ce4da014de5864c0121029722eeb6a89b71d34e66d1a8d52803a7d37e94fbdaae47cd4e933c17806dd015", "sequence": 4294967295}, {"index": 45, "script": "160014cfeb64d31767d1938699c74138e9f9aa4bfbaa69", "prev_out": {"addr": "388jsq9MUh9ju73CpotAMRXYKr9Fs4dmiM", "script": "a91446ae2cae77e362dab9376679242f53f4be7841e287", "tx_index": 2120010363353098, "value": 956000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 45}], "n": 76, "type": 0}, "witness": "0247304402207d15315a2f9c0761fc366c71bdc827c7230942ba4f685c8fb53b9e32c200ff050220501a72f7ec28ce2a0f8a2cd493cc4a91371fce3bc05d2caad2017595315493c7012102c9fe04d8e5cc2af4a23e50862c0cabaed9efcb529a23198fa8b18aceeb7914d2", "sequence": 4294967295}, {"index": 46, "script": "160014dd0e79dfbff8431dde8e1bde09ee3fd8f33abadb", "prev_out": {"addr": "3DEqgRrk8WLkWbjoxfYCTgubifZ61JrWp1", "script": "a9147eae24c836c0dfad1a9d3dc30aace7dcceedaa4887", "tx_index": 7321853208016461, "value": 1000060, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 46}], "n": 5, "type": 0}, "witness": "024730440220387dc15af5b4c09e8515660feb75de2e93df3ec17544e537d429fc22a718762a02206b9a9a5c8749625f4fb1fc35e85c9e5a7207097ab5494333fff67a6afc5b695d0121030fea5c73dd57e2a56220b0b3618f2a8fba4a69169b95865b702bce444014f320", "sequence": 4294967295}, {"index": 47, "script": "160014ab4e6ce25e8390a9eeccd7d7e6ec974cb83c0915", "prev_out": {"addr": "3KtkxnSxUFb9hvoXbCykMrpdf5hXFeb7Dt", "script": "a914c7aac43b310b559a8ea25230a3d22c8c3e1a980987", "tx_index": 1190617761559931, "value": 340000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 47}], "n": 1, "type": 0}, "witness": "0247304402204e4390dbce99e64e1e34e310fa4926f44583075a85ce308490ae814576f1c37b02201c1cf713865d7936a8ac3e69eba06948a53e54a245e904913875cc7b839360b401210286fd778231fee09ba5b2548c222c363eaddc5cdad3786d08624ec9066042772c", "sequence": 4294967295}, {"index": 48, "script": "1600149ce5662c85d8a040a0a8fedcf6ffc5ef2c013a4d", "prev_out": {"addr": "3KhMxRUZwVvCCXTr3BGSWZEHt2Zumhjh3B", "script": "a914c582fc7ee4d8535c6b76210a4adcd098315d6a7387", "tx_index": 989639219697164, "value": 1002971, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 48}], "n": 2, "type": 0}, "witness": "0247304402206ea2c7286f146e02c17437212ea62626f276983dcb6db4042b231d36c07b603f0220045ced45b12d263eddbb4c53304917b6048183f6f35e3164c8bb23d4d1353acd012103f1eafa68ddb13a6f73bd8bf0101190385d8d5869a1e1dd3d4db9f488a52fb757", "sequence": 4294967295}, {"index": 49, "script": "1600144aefbf4c1c35fdeb72605bced36f259d15810553", "prev_out": {"addr": "3Ewedmco3bY9HbQRuC6BxzfARLZ4U6G9nR", "script": "a914915e1a70eda762d38a4462b63a14006f4a62534087", "tx_index": 2120010363353098, "value": 279000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 49}], "n": 33, "type": 0}, "witness": "02473044022074f05401629931d5e2e4030ba12a45d2fa837b1be7bf61a306d2a29eb344c3a302204deb89960fd1fc574725ac8282bee59439da2e3e1f9c9bdd6125867cdfa74a8401210326f7de73692dcc0d8d6309a4d4db5efc9e4f923652b33f5d3d069aa3d111170a", "sequence": 4294967295}, {"index": 50, "script": "1600149ce5662c85d8a040a0a8fedcf6ffc5ef2c013a4d", "prev_out": {"addr": "3KhMxRUZwVvCCXTr3BGSWZEHt2Zumhjh3B", "script": "a914c582fc7ee4d8535c6b76210a4adcd098315d6a7387", "tx_index": 2423769314220034, "value": 1000003, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 50}], "n": 1, "type": 0}, "witness": "0247304402205724a81c430385293a4c70ebc8e426d4a179b4c92cf922435b8afec95d4943af02203a3da703416273b3e710b135db42e01a72a4fb358399c2a39a76a4e697b0c016012103f1eafa68ddb13a6f73bd8bf0101190385d8d5869a1e1dd3d4db9f488a52fb757", "sequence": 4294967295}, {"index": 51, "script": "1600144f65c7e9c03c3d520236992b582ed79b21c10be3", "prev_out": {"addr": "3Bobbbq8spoHBTZP5og1rtw55cuVt7xTVS", "script": "a9146eefdcdd5cb522141a3cf3cf0eaaf1d559b9eb4e87", "tx_index": 2120010363353098, "value": 398000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 51}], "n": 45, "type": 0}, "witness": "0247304402203b612670b487a663ee3b90bc3ba1f3dcbabf51b417ba124e18a44007b2aaa89f02205e40be5eeddcd8b9f5e465fa00126a86c5ff8ed96fea2865134588aa65c2cf56012102edcf1628c3eba85c811dcfd3e1de0ed4b6bae0260f5c302d07c0f6d3ac3263ca", "sequence": 4294967295}, {"index": 52, "script": "160014d2c90b7192c685787122307d45fc2d4ff31d9dcc", "prev_out": {"addr": "3Fa387LJbCFb3bniWuRrcoreFVYpeUNDbA", "script": "a914983fd9b804f93cd552b5e056557366ab7a54713487", "tx_index": 2120010363353098, "value": 639000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 52}], "n": 64, "type": 0}, "witness": "0247304402204a083c40edf3b8bc74795d8b850ceed367a893101c69a2d8a76c57ee76a6054502206604315815d7bbe7fa9a87ddc484ce5d77be39e92376c41fccf42943a07fd916012103fc96781a909c05a07821af7104a29129281aa1e8fb77cc8f8aca759fa15c07a8", "sequence": 4294967295}, {"index": 53, "script": "160014c87053460a0106cfa4d8c18bd726f4f8f6dffacc", "prev_out": {"addr": "34Y7pJRDJ5pzfhHJWhzHpiyLbCeiZQRV4U", "script": "a9141f398d69dd54a4aed27e9923152e60a4f98dbcb187", "tx_index": 2120010363353098, "value": 574000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 53}], "n": 60, "type": 0}, "witness": "02473044022031184b17dd584b47885bcd743131ad55d637ce787dc99b12872d8e2c7719d87a02206f721eee704f5b0de834c503a68b334abb24a26fc0f6c73e735da1055653005001210396405bf72ea3f8c377d08618bb39c894a7b294ccc774e60704b7f9a626df7cd2", "sequence": 4294967295}, {"index": 54, "script": "16001411fa15b949dd7f3982753ea46e331ea80e5133b0", "prev_out": {"addr": "35SV1AwvfE9uuqnxE4x8k55mgo4HvdBy79", "script": "a9142920de68f9358bcaa1682e109910e78a92272f2f87", "tx_index": 2122979826653083, "value": 279426, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 54}], "n": 2, "type": 0}, "witness": "0247304402200fd114f4897b2b62000d7a835cd106547e486c7ecea77e9194c708fce47f1e0502203819cc61b06a2e01f0e377f45118ead9747c478194f7b70a7d870a28db804d650121033fac0710759abe278d8cf9b0738de724ecef3a23ca7027d286b63dad68314a68", "sequence": 4294967295}, {"index": 55, "script": "16001406b4883f7fee54084197c3074f7bbc256288543f", "prev_out": {"addr": "33VJhZGCtM1V7KffqE797PZRJa9m2z5TXr", "script": "a91413b94395a31b1a80d172464a1c8f4b948de3492687", "tx_index": 2120010363353098, "value": 337000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 55}], "n": 41, "type": 0}, "witness": "0247304402206cd05777134ed1e11bb5f33327b915e8f8b515887faa93f254d1cb033136ae3f02204530e64bc630c82a502c1b2c32d3501aedaec5c3ed19989e3e8049e8592f7cb10121030d8f437cf03040db1eebf1b237c0c3c601346f355317b89058d6399ad7964276", "sequence": 4294967295}, {"index": 56, "script": "1600149f361188e44c95243cd2886277fd0fa521d3d93b", "prev_out": {"addr": "3KueAmNTTBpSAzuD6W3my3ZU14rXhfqKSh", "script": "a914c7d582f9e1bc324c4cf4a777c1204ee1ce2f27c187", "tx_index": 2120010363353098, "value": 259000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 56}], "n": 32, "type": 0}, "witness": "024730440220198066f1d0bc51df5081e83c742733894ee5e6044889a66d8c0eab5956f2ab8102206976226dfbfa5c24b0e45950a79b4c2a9ddff97550d5fae07c6e92394c3eaee6012103253f64f5ee200c3520440080fe9009dad818fdef84caa77da17194c250e2b90e", "sequence": 4294967295}, {"index": 57, "script": "160014ab18dcbfc882e22a89232e170bd64ee50ce12b2c", "prev_out": {"addr": "3QwZbg5dxQtPEswZCEjWwYfu7Kv3DPPgkr", "script": "a914ff0b283c9c32674ea2497e3478a9923c1247e78987", "tx_index": 2120010363353098, "value": 357000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 57}], "n": 42, "type": 0}, "witness": "0247304402207a866d6b671c649a4710bc1b4719c68878c91144d97cbd92225f754d1b1731e7022076c627dc39b45f919a91726497e1dd47d1002377c826dd05b470290958074efd0121022e4e059a2c2aa50bbb10f03b223ebf4bed8954d12ffa4e1ddfa7508da55f36a6", "sequence": 4294967295}, {"index": 58, "script": "160014bf66b5e25aa71649a9c6834dcdc918b5b60c1f57", "prev_out": {"addr": "38mwcUiqiLMUi75zocwGZaquJFrW7UwT2M", "script": "a9144db75c7be4eb6101e502967c0656cfbc17efc05c87", "tx_index": 2120010363353098, "value": 481000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 58}], "n": 54, "type": 0}, "witness": "0247304402207aae1e5109950acfe3a6a0a892938b5025bc18c2665d2042fd1c6e2ad5d41653022060e98785880794b14c77800ed23c103ef755ef99d6f37dc81fe1d7fd882f077301210394986761ad6ee55e484e842a4e4db5ca5a4222b85c283bf4300a97400a906fd5", "sequence": 4294967295}, {"index": 59, "script": "1600149ce5662c85d8a040a0a8fedcf6ffc5ef2c013a4d", "prev_out": {"addr": "3KhMxRUZwVvCCXTr3BGSWZEHt2Zumhjh3B", "script": "a914c582fc7ee4d8535c6b76210a4adcd098315d6a7387", "tx_index": 4246764485158248, "value": 1003408, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 59}], "n": 9, "type": 0}, "witness": "0247304402202c97145d8189ef9ad4f9fb17fd80b4816850a3453886047430e1cc8e63bcbf5f022075f8a93f35f1f8b2c0ddeda3aabd1d9834a3374b67e86783ebe4ca85a8a09c97012103f1eafa68ddb13a6f73bd8bf0101190385d8d5869a1e1dd3d4db9f488a52fb757", "sequence": 4294967295}, {"index": 60, "script": "160014dd0e79dfbff8431dde8e1bde09ee3fd8f33abadb", "prev_out": {"addr": "3DEqgRrk8WLkWbjoxfYCTgubifZ61JrWp1", "script": "a9147eae24c836c0dfad1a9d3dc30aace7dcceedaa4887", "tx_index": 4364350523528046, "value": 1001756, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 60}], "n": 6, "type": 0}, "witness": "0247304402203e774ae1a004fc4e773a0118a0d5c85ed0b01b91a6b87bd0d6731d76e9d86546022026d9253d8ca1cff7795a6788e122a501120f1e0cca6e3a2549d73c4ed9bd823d0121030fea5c73dd57e2a56220b0b3618f2a8fba4a69169b95865b702bce444014f320", "sequence": 4294967295}, {"index": 61, "script": "16001432df836be7e21ea831b2225d6ca6f6edfb545043", "prev_out": {"addr": "33w5zTTsQkRkcanoFQEyTFeSHGyus9RPSC", "script": "a9141899786b40480bc39d5dcd3d61801d8063863a1787", "tx_index": 2120010363353098, "value": 689000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 61}], "n": 70, "type": 0}, "witness": "0247304402207cc465108999f0f6cf024e7551058adaa24f4b80ee8fe9ecb767dc5538ceb029022042641a7abea1c2406c27f4336cf4bb53ce402a2cf9d989b98a254f2527f3f16d0121029e85fe1d1753cffefd40cec0de86aa52f272b876b452631358285f772e3bf8e4", "sequence": 4294967295}, {"index": 62, "script": "16001441c41c3b8694116a7d92f758480aa0bf1cbb7257", "prev_out": {"addr": "32TxZoNkFMJkdhGFWhHCk2bJr32AnA8Qzo", "script": "a914087fea5b99935172dad97db86cf63fbe4188a12c87", "tx_index": 2120010363353098, "value": 303000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 62}], "n": 35, "type": 0}, "witness": "024730440220284ec12f79cd0021db4fae8819919de4a12a86f4808fbd3a53efed2513368d5b0220010e79546e7e7611c01fd97738c4dec541008fc179a81d32f5b1c20a59c6a5570121033e484d3e2356ce9bca70e892c0399638a5e7374c9466fe6a8fc4a42e04b209b4", "sequence": 4294967295}, {"index": 63, "script": "160014bdae1c001c47a1fccb4d3722e688b11020f6e0a2", "prev_out": {"addr": "36ScTcmQ1U9qfF1KutVXATnCzRQQSyEQKF", "script": "a914341f37eec937d877c616470d5de131e67218e61887", "tx_index": 2120010363353098, "value": 650000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 63}], "n": 67, "type": 0}, "witness": "0247304402200d8c122b76c5534a2d28eac16be71fbe1ca776974c687df42596bece71bfb1fb0220415889c9d326378459f4a9b20909644498406330ec4af6bf4797a9e5932b223101210217c3ec7feae79d27a7803e6bed4e7001be236a168b930d887b452d57e167e312", "sequence": 4294967295}, {"index": 64, "script": "160014d5edfbba3962883e56030bfbebe059df1725a5b3", "prev_out": {"addr": "3HxnTgJD9Sv4WCjo2T9pJcPiqChap4gJhh", "script": "a914b27d6dee5e0aa1faaeccfa5abe15b8b53c9c07ad87", "tx_index": 2120010363353098, "value": 316000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 64}], "n": 37, "type": 0}, "witness": "0247304402202b2ea2e38fcf7517d5b2b465a4340da5a7fd324b4df06a192550c1b17139945902204ba4de7c5bd376cb00ec60636744e389c9982891949c3de884ec6eb5c10599cb012103fd7bc157ac9c5bb3213a5ba446b3ddc3daff8ba717260c6dd28ec680dd1aef21", "sequence": 4294967295}, {"index": 65, "script": "1600149a05d13e13fdf30ed49b96070e6cc43dae3e9980", "prev_out": {"addr": "34Sj72DN3Q6k2ZUDJhnPLq9pxFzsaw2xrD", "script": "a9141e348388a84a791a070aaa6c4dc7d21324dfa88687", "tx_index": 3822867793943269, "value": 300000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 65}], "n": 1, "type": 0}, "witness": "024730440220230d93c4077d5becab07864ae092bbbfba1ee8bc34c1f621cb75b5ae29c78fcc0220330f0fedade1c4451ddf2bd9832b1cf9b04fba6fc40a97d7ac1a3a2f80d7aa2101210299a7fd3110a9d3eb0508f9ca654d58b1185beaf9ea19af512271c5993cde0c1c", "sequence": 4294967295}, {"index": 66, "script": "1600149ce5662c85d8a040a0a8fedcf6ffc5ef2c013a4d", "prev_out": {"addr": "3KhMxRUZwVvCCXTr3BGSWZEHt2Zumhjh3B", "script": "a914c582fc7ee4d8535c6b76210a4adcd098315d6a7387", "tx_index": 1566102194167405, "value": 1000563, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 66}], "n": 12, "type": 0}, "witness": "02473044022031b893cd9b5a8b65a34872e5a7c17b59a00bc2daa969384388d978cdbc52031702201e230c399434e8cedb1a78b24e20f8c55eeac1fb33e728f14a91526aa6b8d2ca012103f1eafa68ddb13a6f73bd8bf0101190385d8d5869a1e1dd3d4db9f488a52fb757", "sequence": 4294967295}, {"index": 67, "script": "160014d77c5c842bb6788a8fa8756856f24a6defbb51bb", "prev_out": {"addr": "38wUPBFw4yfDZFzSBK4PU6aTxoLW2BJF9E", "script": "a9144f84ca7debb8fad9615aa94dfe110138fc9cc83587", "tx_index": 2120010363353098, "value": 481000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 67}], "n": 55, "type": 0}, "witness": "024730440220400aa397d99d2ef51b2224affbc9de6b94f08402f83adda35e50f73c178fdd0502202d45d3f456e3298fce14ea5b52ff6ad99a73199e3ce8919c7a7b2d3f85f18b610121022d23100accc953fa146ee7399f55e2f36d27239177bd1dddc50be653997474c4", "sequence": 4294967295}, {"index": 68, "script": "1600149ce5662c85d8a040a0a8fedcf6ffc5ef2c013a4d", "prev_out": {"addr": "3KhMxRUZwVvCCXTr3BGSWZEHt2Zumhjh3B", "script": "a914c582fc7ee4d8535c6b76210a4adcd098315d6a7387", "tx_index": 3087586071197833, "value": 1000029, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 68}], "n": 1, "type": 0}, "witness": "0247304402200a7275516ad140c814c05e7a057436b42c68ae28542d89203e8607f1455f6c0402205e1d01714799d3d3819556f5139d6b2013ee9aaaf661978748598b54b692d4ae012103f1eafa68ddb13a6f73bd8bf0101190385d8d5869a1e1dd3d4db9f488a52fb757", "sequence": 4294967295}, {"index": 69, "script": "1600142052e196a619e42c35e07b8412b256a7db6df6d6", "prev_out": {"addr": "321ybwmK9SwKq7miX99xFdLV2XSwYqhYCP", "script": "a9140395f750e5171b98871631b1129877083594b38f87", "tx_index": 2120010363353098, "value": 457000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 69}], "n": 52, "type": 0}, "witness": "02473044022041f2c2ae2666d505fc3a1abba91aa8cb4daba29cb077872c31a7304366b4981e0220446395c46fef26163beaee72a6d21ba657c5d89496a4256b4f42e4d75df80ca6012103b1ae5f4d47f857f7651f4fdb20557eb5ef5c73eb578ca57e7968c68456933555", "sequence": 4294967295}, {"index": 70, "script": "160014e1259a2be8c149b86bfa2992014036cf59552aa6", "prev_out": {"addr": "3AgjaooruduTEFa24F16iqe8yCxvtxpXAw", "script": "a91462ab7debd9299ff57e537cfa140eb44fed5a7b8387", "tx_index": 2120010363353098, "value": 490000, "spent": true, "spending_outpoints": [{"tx_index": 5131906219034408, "n": 70}], "n": 56, "type": 0}, "witness": "0247304402204f193260da025488ebd31a535c4a9f321996d5e432c16dab9c6cb727a99d89ac02200b5a2a2b025b040563a05024fb026d34c9023a10c1fd0c7763d9701bdb5e5345012103f11f77b47479dee714b6ce0b4e58efcb0423879b8790f2a9a0bc1c440540c0b4", "sequence": 4294967295}], "lock_time": 0, "fee": 135560, "ver": 2, "weight": 26983, "tx_index": 5131906219034408, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 71, "vout_sz": 9, "time": 1636406678, "hash": "8eeede8f51418b6961d10376b42c2a2e53b2247230da3e095f4239a63988db91", "double_spend": false, "out": [{"addr": "3MySuHBLWsicjUkmHv3PG9GtH8AQLqcq5d", "script": "a914de7e0596136f22f6ecf1dc4f6c429bbcb639fac687", "tx_index": 5131906219034408, "spending_outpoints": [], "spent": false, "value": 100000, "n": 0, "type": 0}, {"addr": "33Qsrj9fZJ69LejvMLL6qkUsYePYYFzVSx", "script": "a91412e2dcfa10cd1087375785f7fbe9e6ab78ae132687", "tx_index": 5131906219034408, "spending_outpoints": [], "spent": false, "value": 172480, "n": 1, "type": 0}, {"addr": "3NZdU5YyS7A7eezwG455e6PJrtfsUtuTxZ", "script": "a914e4f4fbf23cf9d103021a9f2e9ad99e1d3924d83987", "tx_index": 5131906219034408, "spending_outpoints": [], "spent": false, "value": 151275, "n": 2, "type": 0}, {"addr": "1LMeV6eH5QZfKECexzaeBU27TryG71Ufn5", "script": "76a914d451ffe31890be4ccf7c31c37db8320213a3d0cc88ac", "tx_index": 5131906219034408, "spending_outpoints": [], "spent": false, "value": 2124600, "n": 3, "type": 0}, {"addr": "3NjFqkuPb1qVwf91PC4KFDHrYiJbVQNEo6", "script": "a914e6c7175329100bda833701390f6d413c3db4e4b487", "tx_index": 5131906219034408, "spending_outpoints": [], "spent": false, "value": 60807120, "n": 4, "type": 0}, {"addr": "33pX1spG65AkW3KBRfK6yqpz8DWe2QNEXH", "script": "a914175b72b2a07a5e0716a39610dca25eaf271f225187", "tx_index": 5131906219034408, "spending_outpoints": [], "spent": false, "value": 114977720, "n": 5, "type": 0}, {"addr": "3AEjXvpmDdQR3HZkegxZaneM2GBTmvEUCM", "script": "a9145dc0a2ac0388247fa29c1e0e1eab6be94810714d87", "tx_index": 5131906219034408, "spending_outpoints": [], "spent": false, "value": 392876, "n": 6, "type": 0}, {"addr": "17jgHfyEbRQFAhnPCkFD3H18pgub8mjW66", "script": "76a91449e3054677255910c3d73b59f0af1a222d6b1ec088ac", "tx_index": 5131906219034408, "spending_outpoints": [], "spent": false, "value": 6086520, "n": 7, "type": 0}, {"addr": "3My2tDenGoXjzMY1dYLtbGbGmy6WxutP4U", "script": "a914de69f8ecc1611dcc939545fedc307d0cf9898f9187", "tx_index": 5131906219034408, "spending_outpoints": [], "spent": false, "value": 1410798, "n": 8, "type": 0}], "size": 12445} +{"inputs": [{"index": 0, "script": "483045022100b0ce22a609a7940c9bfdb2e9def296a8bbd152643e35afa4e430ddf6df742f6b0220533463a472569b0e84103e362d3b440ee14cea4cfd7d04be7b9302ca8545e3e5012103c6d1710f79fd451f42b142ef9fc7d89e8057b0a69ccf0fc96e71f46da8e5c18b", "prev_out": {"addr": "1MrqKRk5TbYLhAAyPiqH5oFxSX3Gb11ehp", "script": "76a914e4cf3b3c3e158402e31ce1c48f656358606e564b88ac", "tx_index": 8077938211922857, "value": 158446089, "spent": true, "spending_outpoints": [{"tx_index": 1693725099154825, "n": 0}], "n": 3, "type": 0}, "witness": "", "sequence": 4294967293}], "lock_time": 0, "fee": 9441, "ver": 1, "weight": 1392, "rbf": true, "tx_index": 1693725099154825, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 4, "time": 1636406678, "hash": "597f5aedab00eca3704c6690cdd4e540f6556d04ef7b5aee8c4bec0ed7782330", "double_spend": false, "out": [{"script": "6a4c5058325be103c852bebecf51270191aa068b8ffbb09f6682295973c12a14adea59db6ab37f89c95768e46b3e50b7e8cf7901a4f0d6a96eb06abff6affa42a187856b0b6c000ad0e1000c000acdcd020303", "tx_index": 1693725099154825, "spending_outpoints": [], "spent": false, "value": 0, "n": 0, "type": 0}, {"addr": "3KitFxbHAp9CQQsxjPB3YyVwGvRXwi13WS", "script": "a914c5ccb289097f529980eea375abb5cd022a5abbd387", "tx_index": 1693725099154825, "spending_outpoints": [], "spent": false, "value": 250555, "n": 1, "type": 0}, {"addr": "3MuLXCkM3CfU8hNjsAXLvdMjH3L5UtDW8g", "script": "a914ddb7081d20f79f751f5ff0ddea90b1537814131987", "tx_index": 1693725099154825, "spending_outpoints": [], "spent": false, "value": 250555, "n": 2, "type": 0}, {"addr": "1MrqKRk5TbYLhAAyPiqH5oFxSX3Gb11ehp", "script": "76a914e4cf3b3c3e158402e31ce1c48f656358606e564b88ac", "tx_index": 1693725099154825, "spending_outpoints": [], "spent": false, "value": 157935538, "n": 3, "type": 0}], "size": 348} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qpdr52dd59hzh2e9svj9a0z298mj428qsua029m", "script": "00140b474535b42dc57564b0648bd789453ee5551c10", "tx_index": 7986551882330745, "value": 21236851, "spent": true, "spending_outpoints": [{"tx_index": 909085960590569, "n": 0}], "n": 1, "type": 0}, "witness": "02473044022072b9114e6da9b11f1a7ae0e14ff54a9ee8b4466184a1f77ca27db306ae78e5600220193c078178232196a05ad5198c606a0715dc5829afc25f27c745ed7727a6dfd8012102b81b336d97f68a269434ecc5981e673822cc3470ddaed6effabef972f7508d9c", "sequence": 4294967295}], "lock_time": 0, "fee": 1837, "ver": 1, "weight": 561, "tx_index": 909085960590569, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406678, "hash": "317a9346ef64ab83dece4dd9d7c690c472d006247d7c485fc54ca7028e78d619", "double_spend": false, "out": [{"addr": "bc1q9r9gj87l6xrj43gxrefe94t7sfx33au3gu2kz2", "script": "001428ca891fdfd1872ac5061e5392d57e824d18f791", "tx_index": 909085960590569, "spending_outpoints": [], "spent": false, "value": 17741228, "n": 0, "type": 0}, {"addr": "bc1qe5an3gkmtm9kdfmsfkaykrd78vfxdncuyhz0kh", "script": "0014cd3b38a2db5ecb66a7704dba4b0dbe3b1266cf1c", "tx_index": 909085960590569, "spending_outpoints": [], "spent": false, "value": 3493786, "n": 1, "type": 0}], "size": 222} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qvnjc9c0ks9g4d6d3kclwcm4ku305zvl4lhsx00", "script": "001464e582e1f6815156e9b1b63eec6eb6e45f4133f5", "tx_index": 4973924866742832, "value": 577269, "spent": true, "spending_outpoints": [{"tx_index": 153644039088669, "n": 0}], "n": 1, "type": 0}, "witness": "02473044022042a4394c714844bc1989101fd08a03922461ab9d9e6126ceefd6e8614e6bbb2d02202d271c0633be35b051bcf9889a941b21946840fb8168533f23bb4dc4e443b237012102abf838aec83207cddbdf3fd0510347345173af4469d9a5f38a2c1c6aaf907f99", "sequence": 4294967280}], "lock_time": 0, "fee": 2842, "ver": 1, "weight": 565, "rbf": true, "tx_index": 153644039088669, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406678, "hash": "91f0546076338ab4b08d76c2ab3dd92de74aa8af5d65a3a4e8ef50f952e85d04", "double_spend": false, "out": [{"addr": "3LDi85pQvheuAPP7j7hUQMCgVW5JRC2ZEp", "script": "a914cb404ca3828815148e55a582cb4163c9f7ac686487", "tx_index": 153644039088669, "spending_outpoints": [], "spent": false, "value": 483774, "n": 0, "type": 0}, {"addr": "bc1qck6ct6exdxh6sunwn57830vtmu000qj6dy4lgk", "script": "0014c5b585eb2669afa8726e9d3c78bd8bdf1ef7825a", "tx_index": 153644039088669, "spending_outpoints": [], "spent": false, "value": 90653, "n": 1, "type": 0}], "size": 223} +{"inputs": [{"index": 0, "script": "483045022100bc1f7bd848a478bc1597bedb5ffd15a4cd9532b1084be6fb12fc71ef3562b6a20220150d655a946b30419a17ba2855a9d560ba74c4905b0327bd2ee086d08a5578760121021ea13c3948c1dda2a65f82811444f0c7ed39cf2929e1a16a2b88cc9980844819", "prev_out": {"addr": "1DAa7Dx4XoUMGyjYSmy7Ay1DstYqmtikE6", "script": "76a9148570e3bf8fd76294b58b62b449abe025e89aab3888ac", "tx_index": 8487744097864087, "value": 151935, "spent": true, "spending_outpoints": [{"tx_index": 7300691594757017, "n": 0}], "n": 0, "type": 0}, "witness": "", "sequence": 4294967295}], "lock_time": 0, "fee": 1344, "ver": 2, "weight": 892, "tx_index": 7300691594757017, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406677, "hash": "38df58a7558e8f75dec00811ab3fda5d2accd54125f9a3d14ece1cf6c8857fcf", "double_spend": false, "out": [{"addr": "bc1q5fukz3rgkw0v2mj64cg6kr8jvzy8jjdgejycgr", "script": "0014a279614468b39ec56e5aae11ab0cf260887949a8", "tx_index": 7300691594757017, "spending_outpoints": [], "spent": false, "value": 1441, "n": 0, "type": 0}, {"addr": "1KBYcE1Hb7ECEzo9aGihswTJFViHtLb3QJ", "script": "76a914c770cee515cf6941bc34b33cad468411ef92808a88ac", "tx_index": 7300691594757017, "spending_outpoints": [], "spent": false, "value": 149150, "n": 1, "type": 0}], "size": 223} +{"inputs": [{"index": 0, "script": "473044022018b8257372eaa2e20fcae6fd8210f5ac2ee03a201267a279065102dab533bf5e02202cc50ad6e293291b6f2912e35c5687f4074675a9d1e6dbf7bc708d89baa68a99012103dc477128c6b242f633d80e4892b5582b44ac340b42d5391e55193568767e0655", "prev_out": {"addr": "1JXe5Yqyrx5J3Y7FoMRPC1waBE5NobTYrV", "script": "76a914c0459195eeabac9f20a49306f8bdb277310f9fb388ac", "tx_index": 3711828230161832, "value": 17636, "spent": true, "spending_outpoints": [{"tx_index": 2525418264579859, "n": 0}], "n": 5, "type": 0}, "witness": "", "sequence": 4294967295}], "lock_time": 0, "fee": 9550, "ver": 2, "weight": 764, "tx_index": 2525418264579859, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 1, "time": 1636406677, "hash": "bddccc5c7c62418df6bd6dd14b312f559cd851bcb05d9019709c788e14d6c647", "double_spend": false, "out": [{"addr": "12qA97T8hsDgvVoRCXGZifd9PCraqvd2DW", "script": "76a9141413b8b4f23ed118b7f4d50347169cb293ddd00588ac", "tx_index": 2525418264579859, "spending_outpoints": [], "spent": false, "value": 8086, "n": 0, "type": 0}], "size": 191} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qy8plljkty0chgl2466zfmm7d9psj7c73e8h6xm", "script": "001421c3ffcacb23f1747d55d6849defcd28612f63d1", "tx_index": 1257459102249187, "value": 325444, "spent": true, "spending_outpoints": [{"tx_index": 8708146704871155, "n": 0}], "n": 0, "type": 0}, "witness": "0247304402204bc03b71263de0d7c6ddc19919e7df7be50aaefd517d997854f4e64706299e690220234c54353d2978397510b73cfa5f2a871d64c0f6fe908c532c6cb03b37453dbe01210303e5d3620e4c37ef4ca64c7d3396c14616b5efb4be2037f1c4902c23034a88b6", "sequence": 4294967295}], "lock_time": 0, "fee": 1122, "ver": 1, "weight": 437, "tx_index": 8708146704871155, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 1, "time": 1636406676, "hash": "61c06699949ccd592f10bf87f84e60bfc363dbb6391543d4159e77f7371b80f7", "double_spend": false, "out": [{"addr": "bc1qahxgx9q66mhrpx4h02jf97mqal0yww8sywewm2", "script": "0014edcc83141ad6ee309ab77aa492fb60efde4738f0", "tx_index": 8708146704871155, "spending_outpoints": [], "spent": false, "value": 324322, "n": 0, "type": 0}], "size": 191} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qjtg33y3ycrmxzgm44pwnm0ms6rtwau99gk9elk", "script": "001492d1189224c0f6612375a85d3dbf70d0d6eef0a5", "tx_index": 5612379011197731, "value": 121849, "spent": true, "spending_outpoints": [{"tx_index": 8597511952125331, "n": 0}], "n": 1, "type": 0}, "witness": "024830450221008ede893263c46a60bdfcbbb12560213c581a581eac69f4b8277d5c580ddb295f022038756716242e011b2eb059f6334fc2e5e0dbc40db9b5b19df81ebbcf71bda0ef01210380d4d2b9629ce756e76062b4443a1d4b54b4e0015f9b23ea435be8574ca00406", "sequence": 4294967295}], "lock_time": 0, "fee": 2535, "ver": 2, "weight": 566, "tx_index": 8597511952125331, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406676, "hash": "6a240aca5dc0985b8d7a31d06480c37d4ba12b4be24e26bd4b9c6cdeee215bf4", "double_spend": false, "out": [{"addr": "32j8bUtTJpQm8nTKZLovnzUYCDRUYfQTQh", "script": "a9140b5e86d36fe9e0ef79ce51a45c4da9a36d28446187", "tx_index": 8597511952125331, "spending_outpoints": [], "spent": false, "value": 35000, "n": 0, "type": 0}, {"addr": "bc1qjtg33y3ycrmxzgm44pwnm0ms6rtwau99gk9elk", "script": "001492d1189224c0f6612375a85d3dbf70d0d6eef0a5", "tx_index": 8597511952125331, "spending_outpoints": [], "spent": false, "value": 84314, "n": 1, "type": 0}], "size": 224} +{"inputs": [{"index": 0, "script": "1600145f0a41176025fd96fd93c6ddb5b204bf8d86babe", "prev_out": {"addr": "33VgoFEwfLSqVTbvexxpzFrisagvZBuaex", "script": "a91413cbb5e73998262db15752d6f2c4ce66bf46c5c787", "tx_index": 1752219652545578, "value": 40889400, "spent": true, "spending_outpoints": [{"tx_index": 8305732448960719, "n": 0}], "n": 0, "type": 0}, "witness": "02473044022066d876c06b02ca351388747b328c36285b2432e540a9e7c47afdf24fc135f7b8022036dfd82209c0bc468af8bd4d54963aa21dc92f3a51790fc922d82c439bbad934012103b749df3fd81a40760dd3f9f912cec755d8114441e2d3ac0ace74ece39041faaa", "sequence": 4294967293}], "lock_time": 0, "fee": 2004, "ver": 1, "weight": 661, "rbf": true, "tx_index": 8305732448960719, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406676, "hash": "725690be4f04911a44e025654074b10edcd18093815d3c341d7a06c2412810ec", "double_spend": false, "out": [{"addr": "39cDEjpdechrLFzC7Vtg9Hh4ppJnkDG7xk", "script": "a91456d85ee4732700502f871fefa6c100f04c34209387", "tx_index": 8305732448960719, "spending_outpoints": [], "spent": false, "value": 13560778, "n": 0, "type": 0}, {"addr": "3G4Mfh2RbnUbbqpCmDyHqUUamDvyXKWyD2", "script": "a9149d9afa417c5c1f71ca66e5105695d5d3dddbc7bd87", "tx_index": 8305732448960719, "spending_outpoints": [], "spent": false, "value": 27326618, "n": 1, "type": 0}], "size": 247} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qv6ktdusk5wc8acmj6js06urwnvakc6ydpp985v", "script": "001466acb6f216a3b07ee372d4a0fd706e9b3b6c688d", "tx_index": 3132326705084014, "value": 2011133, "spent": true, "spending_outpoints": [{"tx_index": 5857463922541047, "n": 0}], "n": 0, "type": 0}, "witness": "02473044022043bb52c762daa3ff6197af488c0d64d948646b1e876815c8389c5dbdeff281cf02203e2166952649780f2bd276d6f6f6a155cc28924cb09b31edc19ceaa3ca031278012103c5e29ca0ab938aa52e5a85f9b3e9cb26c9c55cc44ce292461268e0f2f5071604", "sequence": 4294967295}], "lock_time": 0, "fee": 1802, "ver": 1, "weight": 565, "tx_index": 5857463922541047, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406676, "hash": "f27c4c16d410e5878248732e1880862f897fd80db4b401e4dcbd0f1ac3a87aa6", "double_spend": false, "out": [{"addr": "3ARFy4NYFwXC7BnockFFno6aGwuVwNurK5", "script": "a9145fbe3310e2a7828e5a9697ddd260a9c0a585c47187", "tx_index": 5857463922541047, "spending_outpoints": [], "spent": false, "value": 40872, "n": 0, "type": 0}, {"addr": "bc1qwcnyafndvlatt68gfdqq4y7lf3uzy6sn3ud2mg", "script": "001476264ea66d67fab5e8e84b400a93df4c78226a13", "tx_index": 5857463922541047, "spending_outpoints": [], "spent": false, "value": 1968459, "n": 1, "type": 0}], "size": 223} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qmru3dwead5hdr5hw6m49jnvqqevh7slxafzfw7", "script": "0014d8f916bb3d6d2ed1d2eed6ea594d8006597f43e6", "tx_index": 226165094125979, "value": 75000, "spent": true, "spending_outpoints": [{"tx_index": 5790470732472115, "n": 0}], "n": 19, "type": 0}, "witness": "0247304402206c8d6b76864d738fa0fd2a782c3e1734a40c454d9c5fa826b0845ced7a49489f02207734dd02cdedb2fd54af87f7a9e2183ce5cee915c629aa3dcf6b49b258b1963e0121021dabf3890367ba4b662effdeac303630346978f1513991fb9d3bc570351de76e", "sequence": 0}], "lock_time": 0, "fee": 1554, "ver": 1, "weight": 441, "rbf": true, "tx_index": 5790470732472115, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 1, "time": 1636406676, "hash": "b21170b3b260c95ee5cf04128bb2533eaa5a017c29b8921b3f9ff9ba383893a4", "double_spend": false, "out": [{"addr": "37waQRe8zJN6R9yjM3m8hYqS7zHZhukKuz", "script": "a9144491b113dc4708a2cafeee18f24b2b5054cc14fd87", "tx_index": 5790470732472115, "spending_outpoints": [], "spent": false, "value": 73446, "n": 0, "type": 0}], "size": 192} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qytgrlfywt0lzgee0m5fffdhvuwvmrz9qz2txtn", "script": "001422d03fa48e5bfe24672fdd1294b6ece399b188a0", "tx_index": 5759291191136542, "value": 2279192, "spent": true, "spending_outpoints": [{"tx_index": 1685792381137272, "n": 0}], "n": 0, "type": 0}, "witness": "02483045022100ecd76001a2abaec9bb986c48cc51aa80f4c694610f0de5dfe80c03c02ba0b6db022028e84ddc5e5e4f2cb419e16ba5cbee6a17d16b81443c1dd0f9ee9a83c76c27cc012102ef7542d285bf73fc566e6270f5b87f804fed3ea68e762f5135828969727c3aca", "sequence": 4294967295}, {"index": 1, "script": "", "prev_out": {"addr": "bc1quygtvun8yg76n77qn9dr7hfmw7zhgcmd9qx45r", "script": "0014e110b67267223da9fbc0995a3f5d3b778574636d", "tx_index": 3432629530174019, "value": 9564000, "spent": true, "spending_outpoints": [{"tx_index": 1685792381137272, "n": 1}], "n": 0, "type": 0}, "witness": "02473044022027191c82007d5ccc8fa12bd9fb5e879ee6a0b5862b1b29cb1441f4b31084206b0220643611d4b4ab7cf0f45bd953341ea8e03ace6f78f9c527c2e3f0492c12fefe68012102776766e790f2b584e07e42fd89135f72834577eae0d5bfbe213f3ea81d0db916", "sequence": 4294967295}], "lock_time": 0, "fee": 4007, "ver": 2, "weight": 845, "tx_index": 1685792381137272, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 2, "vout_sz": 2, "time": 1636406676, "hash": "51522e1352a92e87f17cd90ddd02eaa11f35ff9f87a685ff28c38b5700c1e92f", "double_spend": false, "out": [{"addr": "bc1q944t6ufplzh8w0h0hlm32vhfh3054u0v47a0px", "script": "00142d6abd7121f8ae773eefbff71532e9bc5f4af1ec", "tx_index": 1685792381137272, "spending_outpoints": [], "spent": false, "value": 1293710, "n": 0, "type": 0}, {"addr": "1CxvBxPVbmW5e9wmkH5xCpT3PYmMZoQVXV", "script": "76a914833ca94ee20a998e5b5a9f3e3ee5a074b5baadd588ac", "tx_index": 1685792381137272, "spending_outpoints": [], "spent": false, "value": 10545475, "n": 1, "type": 0}], "size": 374} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qkt4aepqve4gaad2yc9705eq9rdj6yxyes99tms", "script": "0014b2ebdc840ccd51deb544c17cfa64051b65a21899", "tx_index": 5389725680156518, "value": 8401739, "spent": true, "spending_outpoints": [{"tx_index": 5588351545916968, "n": 0}], "n": 1, "type": 0}, "witness": "02473044022010d1e98e5ecd756bd31f70015d90b40b4e2c7e120344506ccb13bd36282dc4b902203f664ee6e6728d6fddaf82e48cc21ec86c8133dab40771ba0762016f49ff879b01210305066d59055de70e968bf9d21f217586d0189cdc1473c10c4526e4e8631370e2", "sequence": 4294967295}], "lock_time": 0, "fee": 1523, "ver": 2, "weight": 561, "tx_index": 5588351545916968, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406674, "hash": "2e724fe2fb9056133f04ce423c350dcafb0204797a443b2b8e41f131e69bd49e", "double_spend": false, "out": [{"addr": "bc1qd6t7hx7cqgrklkw02a7ne2ekeu68w8447l5k39", "script": "00146e97eb9bd802076fd9cf577d3cab36cf34771eb5", "tx_index": 5588351545916968, "spending_outpoints": [], "spent": false, "value": 3314857, "n": 0, "type": 0}, {"addr": "bc1qf4cgel3a2ldup8qlxqxgmxz3395pt69nt2q6ul", "script": "00144d708cfe3d57dbc09c1f300c8d9851896815e8b3", "tx_index": 5588351545916968, "spending_outpoints": [], "spent": false, "value": 5085359, "n": 1, "type": 0}], "size": 222} +{"inputs": [{"index": 0, "script": "160014487c1d47fad42e0f3f1afcdeb0b77276fded10dc", "prev_out": {"addr": "38RRexyf7nBcFimhy4gpkxTrFqR5sE1Hrt", "script": "a91449d608fb76ad0125c2d93578e721bfd7e7750b9a87", "tx_index": 4867076975040364, "value": 1800261, "spent": true, "spending_outpoints": [{"tx_index": 8608916026515418, "n": 0}], "n": 0, "type": 0}, "witness": "02483045022100c5ef65fe90a5bd3e5b86ba94da50ada1c590ee7ef8f189075fe56c71b6ac38200220504fe11c01fcda3328df25c94da6a75340857403b39e792048743d31a71115c70121029f3575a9e0132909cb028f6c1d2048117e2a7a92b20d2a923ea8078819d56dcf", "sequence": 4294967295}], "lock_time": 0, "fee": 2157, "ver": 1, "weight": 678, "tx_index": 8608916026515418, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406673, "hash": "f9801c130b24294677ccf8509975ff141fa06feddd222fb56cd1fe4aad1baef4", "double_spend": false, "out": [{"addr": "1MZJqPDhCb5ELC6pVsPRsTcwGLWnRn2TnT", "script": "76a914e17eb6b41d28b4a97495f08216b40edd12e3b84d88ac", "tx_index": 8608916026515418, "spending_outpoints": [], "spent": false, "value": 1317104, "n": 0, "type": 0}, {"addr": "1NGVt5zCKsjEMFnE4hEedTDfbxSNi4NYHN", "script": "76a914e948fd468bb52a8a65adc31505192cc58f544f0788ac", "tx_index": 8608916026515418, "spending_outpoints": [], "spent": false, "value": 481000, "n": 1, "type": 0}], "size": 252} +{"inputs": [{"index": 0, "script": "4630430220620c90f125b00a8aef38b579061b02a26e39c6a805cc6563bb062ba444b9b2f5021f2db7d5f465fdd7b26a0eee6a1f793c1ceb784f597417ac141d9e3c2a1e836e01210229701969946ca7ac28d36dc19df6995e0921005a85afb9683b8e0a19857bc2c9", "prev_out": {"addr": "1NGEXo4oKR563AoC2owwsb4YzGAJzUSndN", "script": "76a914e93c2d0a87c2fd559255b8e08da7c114d431add688ac", "tx_index": 4700169965837075, "value": 225932090, "spent": true, "spending_outpoints": [{"tx_index": 6492680839765176, "n": 0}], "n": 3, "type": 0}, "witness": "", "sequence": 4294967293}], "lock_time": 0, "fee": 43392, "ver": 1, "weight": 1384, "rbf": true, "tx_index": 6492680839765176, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 4, "time": 1636406673, "hash": "49cddfe3099d2bda409efb06d28191d39daaddea5b2958e785c1e5c0787888b8", "double_spend": false, "out": [{"script": "6a4c5058325be43735f9727e03f3faee7b060eaffa084c65ca6dc97a21d0d1079624e5fb0adc68c03e440459098ca45c316ca4f8489df89f74b6a9be05474242343b9ca7dae2000ad0e1000c000acb20001d03", "tx_index": 6492680839765176, "spending_outpoints": [], "spent": false, "value": 0, "n": 0, "type": 0}, {"addr": "3KitFxbHAp9CQQsxjPB3YyVwGvRXwi13WS", "script": "a914c5ccb289097f529980eea375abb5cd022a5abbd387", "tx_index": 6492680839765176, "spending_outpoints": [], "spent": false, "value": 210000, "n": 1, "type": 0}, {"addr": "3MuLXCkM3CfU8hNjsAXLvdMjH3L5UtDW8g", "script": "a914ddb7081d20f79f751f5ff0ddea90b1537814131987", "tx_index": 6492680839765176, "spending_outpoints": [], "spent": false, "value": 210000, "n": 2, "type": 0}, {"addr": "1NGEXo4oKR563AoC2owwsb4YzGAJzUSndN", "script": "76a914e93c2d0a87c2fd559255b8e08da7c114d431add688ac", "tx_index": 6492680839765176, "spending_outpoints": [], "spent": false, "value": 225468698, "n": 3, "type": 0}], "size": 346} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qxrz2rm8sek5xy7002lxpujmfzcp0myswayscqm949cmt5fyww94q55sdu2", "script": "002030c4a1ecf0cda86279ef57cc1e4b691602fd920ee921806cb52e36ba248e716a", "tx_index": 1916279461449560, "value": 60832633, "spent": true, "spending_outpoints": [{"tx_index": 8135216530942053, "n": 0}], "n": 1, "type": 0}, "witness": "0400483045022100bfae98ad321c2f47d2ea767d70bed98b37f129dff3744f75223991c6b3ed4b6b022073e16ab3fca0173a1dcfdc680d196ce935adc99a7e8622c56b328840a69948ec0147304402203b07b1e92e7d5034f48b5d2bf6bd13d555a7d35514ccd59dc48e624998d2953f0220779d63e818a7361076ebf9df4898bc5b8f6451c9757ae7490cd02ee90087a29c0169522103f4d4441b468bb75cf3b780d1c790c0396efd5b3c2c95189959fdc8ad947a0e122102b2925f44fd90e777b5c198f8186af08439564f3ae86fa02ecd62d672ab6bccc921031d23199d52c4b98d525db85896c7d791f2bba81ecebdadb8f52ea5148d2f163c53ae", "sequence": 4294967295}], "lock_time": 708833, "fee": 2316, "ver": 1, "weight": 767, "tx_index": 8135216530942053, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406672, "hash": "ef1f3aa2522496ce0695b15186845674b67d8df5e7206c22f72e43fb9b7d37e7", "double_spend": false, "out": [{"addr": "1JnLUzpu8iAJyHCJ4UazUkJmtPXMV6H9TJ", "script": "76a914c30d1eb500f75c5ad65d519c6c37fb3834209f1a88ac", "tx_index": 8135216530942053, "spending_outpoints": [], "spent": false, "value": 3254234, "n": 0, "type": 0}, {"addr": "bc1qe60myxwcypa9c2d0nuh5j6xxcx22eexdvyfaxevusy4yegwxjhast98u3s", "script": "0020ce9fb219d8207a5c29af9f2f4968c6c194ace4cd6113d3659c812a4ca1c695fb", "tx_index": 8135216530942053, "spending_outpoints": [], "spent": false, "value": 57576083, "n": 1, "type": 0}], "size": 383} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qjccjmjchm7030tkl8ntf4vdzkdjqe83guyk832dm2aqnfu7qn06q6xu3fw", "script": "002096312dcb17df9f17aedf3cd69ab1a2b3640c9e28e12c78a9bb574134f3c09bf4", "tx_index": 5302560490070082, "value": 39511010, "spent": true, "spending_outpoints": [{"tx_index": 4809930628427145, "n": 0}], "n": 1, "type": 0}, "witness": "0400483045022100ba8a58ff7ff517f5ab9d6c684b2178df171843888116911a079ab8dc220b346902203384608fd6aff83955ad9650e8649a12a9d8ca1deccb8cd2659feaa34c116e2b0147304402204f555693adfa4b419dde4436619f2c81e79716617e5a65e71e7c35cda53f4a1f022058c16d07976337b0a27cb85b8a329dbc31cd84ba65a4db4917333d5cc78f758e016952210347519ca58548db82130c467cc521c9eac12966fe4a2ca949d01d1cd6220209632102aeed6a8bf47635194be7027b32dd828cd2bac43080224f83dc148cda8c1aadb021028c09647675d52eaa71984d23087277f0d9dc80aac283b16275bfe2e01f72b3ff53ae", "sequence": 4294967295}], "lock_time": 708833, "fee": 1370, "ver": 1, "weight": 759, "tx_index": 4809930628427145, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406672, "hash": "9303688db199669b20b0c503f352d9d906dacf3f6775d090034d6c03f4d9b488", "double_spend": false, "out": [{"addr": "33EfuHwhMQGjhwfZ7fJSxd75FphWovN7K5", "script": "a91410f4b930b702272b761f5353fafe99e1afe7987887", "tx_index": 4809930628427145, "spending_outpoints": [], "spent": false, "value": 2455358, "n": 0, "type": 0}, {"addr": "bc1q4ts26jkd7h89jnwrs6phpcsuh5se25hv6pag8lkeswkdudecsfas4adw45", "script": "0020aae0ad4acdf5ce594dc3868370e21cbd219552ecd07a83fed983acde3738827b", "tx_index": 4809930628427145, "spending_outpoints": [], "spent": false, "value": 37054282, "n": 1, "type": 0}], "size": 381} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1q539ewam0jv7eunad9vycj37ppxkklzqm20g2u5", "script": "0014a44b97776f933d9e4fad2b098947c109ad6f881b", "tx_index": 6200070126969131, "value": 4704665, "spent": true, "spending_outpoints": [{"tx_index": 3773869957247344, "n": 0}], "n": 1, "type": 0}, "witness": "02483045022100fb3b623b7d5671e84bb79f87bec8aeb10504720905d530554e2c4f0c5ad493b90220651986c258dedd8d8d7ba7e72144652e1fd78ddc2e6203ee41ec1ade551aaa820121038528a758a68b288abb447485cf3f10fe18cdd5801db3147a09428fee626ef9f2", "sequence": 4294967295}], "lock_time": 0, "fee": 762, "ver": 2, "weight": 562, "tx_index": 3773869957247344, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406672, "hash": "767cc2966757f62f194b4cf8345e36d2d9dfbdb50696b3093c818bd79184426b", "double_spend": false, "out": [{"addr": "bc1q92qf4jzhh2l6vayxdw9fh9gsll8lhwvk7kar6l", "script": "00142a809ac857babfa674866b8a9b9510ffcffbb996", "tx_index": 3773869957247344, "spending_outpoints": [], "spent": false, "value": 15066, "n": 0, "type": 0}, {"addr": "bc1qxg8wax7d87scnwd6r3h0urs7gh09n72z9xaw0t", "script": "0014320eee9bcd3fa189b9ba1c6efe0e1e45de59f942", "tx_index": 3773869957247344, "spending_outpoints": [], "spent": false, "value": 4688837, "n": 1, "type": 0}], "size": 223} +{"inputs": [{"index": 0, "script": "483045022100972b3298422269ecb67209af524d795d356655fb00f307456b34f223cb14f8d1022046600d7e984b592905d2a6e070fe5d1c4dfe9e63b74854d09b594089fffeba760121030a2828e46929f70acc0d34d6946714956d787c8dc44aaab430dda098653747d9", "prev_out": {"addr": "17WKtEH1Cd73Q8h7HYnR4zJybFyxbEf1ZH", "script": "76a914475c949e8022b31b4c5b850e7c97aedbbf2f879488ac", "tx_index": 4626022607054225, "value": 4531075, "spent": true, "spending_outpoints": [{"tx_index": 2782955878363126, "n": 0}], "n": 1, "type": 0}, "witness": "", "sequence": 4294967295}], "lock_time": 0, "fee": 4966, "ver": 2, "weight": 896, "tx_index": 2782955878363126, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406672, "hash": "77a6cfbd6ff81fcd7c95ec1bbdc753c4525ee18c9bdb554359b17f7144ab184f", "double_spend": false, "out": [{"addr": "3NCq2ZHS4Ane646uELZFScREegUbisybxV", "script": "a914e105e614003a381e69b24d3be0f061d4f1e2a5ec87", "tx_index": 2782955878363126, "spending_outpoints": [], "spent": false, "value": 423008, "n": 0, "type": 0}, {"addr": "17WKtEH1Cd73Q8h7HYnR4zJybFyxbEf1ZH", "script": "76a914475c949e8022b31b4c5b850e7c97aedbbf2f879488ac", "tx_index": 2782955878363126, "spending_outpoints": [], "spent": false, "value": 4103101, "n": 1, "type": 0}], "size": 224} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qjzdq5kzf4rnmz7jzgqqssuq65h7zg6m0h59lc6", "script": "0014909a0a5849a8e7b17a42400108701aa5fc246b6f", "tx_index": 8811046917251069, "value": 370878, "spent": true, "spending_outpoints": [{"tx_index": 1594793682472250, "n": 0}], "n": 1, "type": 0}, "witness": "02483045022100864dcf7885a4d22bc3526affa9dffdd4e5d258a7646217ec63924e6e8fa72bb902207e67414ddbcde52219ff95406b348f65615900e42a86dd4233c9dbba8a9967820121037ad8705276b5c4a058b9bf7ca20e8033c074fe12809e0ffdb646ce8457999c8e", "sequence": 4294967295}], "lock_time": 0, "fee": 1960, "ver": 1, "weight": 562, "tx_index": 1594793682472250, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406672, "hash": "2cde40bb7a5b41d6e222be2518dce4293a5c8744a0f3e164ffd06978b7a6532d", "double_spend": false, "out": [{"addr": "bc1qtfajh28rjn03zl3revxtgt73lm9z3dhcm6k7qp", "script": "00145a7b2ba8e394df117e23cb0cb42fd1feca28b6f8", "tx_index": 1594793682472250, "spending_outpoints": [], "spent": false, "value": 60280, "n": 0, "type": 0}, {"addr": "bc1qjzdq5kzf4rnmz7jzgqqssuq65h7zg6m0h59lc6", "script": "0014909a0a5849a8e7b17a42400108701aa5fc246b6f", "tx_index": 1594793682472250, "spending_outpoints": [], "spent": false, "value": 308638, "n": 1, "type": 0}], "size": 223} +{"inputs": [{"index": 0, "script": "47304402205ed528937c79edaa75b13941f979c4f9cea5ac9a74f0b191dd09e546fd0270c70220260629ed68922434f5ba6a394db9ae0956b84b79bee6b505cf813419d3baba0b01210283399686653d7d30308b129a0edf9da0ccc4b2a073180802f269fe55c948b699", "prev_out": {"addr": "1AZ9n5GSTNL8aRVA4G7Y2xCMadZpe3Cja4", "script": "76a91468cdc505339d6ad28df7c5048d89c6bc5923995788ac", "tx_index": 914062787062593, "value": 510247, "spent": true, "spending_outpoints": [{"tx_index": 8070919951629642, "n": 0}], "n": 11, "type": 0}, "witness": "", "sequence": 4294967295}], "lock_time": 0, "fee": 9550, "ver": 2, "weight": 764, "tx_index": 8070919951629642, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 1, "time": 1636406670, "hash": "aef93a1248af0be184d3db3191b59337f8cf339878f88a7fc253ead1e5ab63e5", "double_spend": false, "out": [{"addr": "12qA97T8hsDgvVoRCXGZifd9PCraqvd2DW", "script": "76a9141413b8b4f23ed118b7f4d50347169cb293ddd00588ac", "tx_index": 8070919951629642, "spending_outpoints": [], "spent": false, "value": 500697, "n": 0, "type": 0}], "size": 191} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qw8wrek2m7nlqldll66ajnwr9mh64syvkt67zlu", "script": "001471dc3cd95bf4fe0fb7ffd6bb29b865ddf5581196", "tx_index": 659986414633940, "value": 1165681419, "spent": true, "spending_outpoints": [{"tx_index": 7916138178043215, "n": 0}], "n": 3, "type": 0}, "witness": "024830450221008ef38a4e40616cf76339fe2951e5f7e767029c0d98af8f96af73eb48425763510220284ad167679658dbc25b2fc62058b7098fa6722bba615309156539843360a0ec012102b62da5d43165ce3d50239c0fab2a9c6aac530375a7455353e9a9fa43f6bd141c", "sequence": 4294967295}], "lock_time": 0, "fee": 4420, "ver": 1, "weight": 690, "tx_index": 7916138178043215, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 3, "time": 1636406670, "hash": "a62e39a99022367b2c93e679e261fa6217ff24a44ca2fdab617ceac2607cfde0", "double_spend": false, "out": [{"addr": "37Gnti3Hs8Mze4DWwbhNiWgTBknKtVqyoA", "script": "a9143d3be4b2a729d9d0706854df31afdd95ae646eae87", "tx_index": 7916138178043215, "spending_outpoints": [], "spent": false, "value": 3582500, "n": 0, "type": 0}, {"addr": "bc1q5djn5xts7ffmc3d63ul4vqtzs500k79fuuzly6", "script": "0014a3653a1970f253bc45ba8f3f560162851efb78a9", "tx_index": 7916138178043215, "spending_outpoints": [], "spent": false, "value": 1176872, "n": 1, "type": 0}, {"addr": "bc1qw8wrek2m7nlqldll66ajnwr9mh64syvkt67zlu", "script": "001471dc3cd95bf4fe0fb7ffd6bb29b865ddf5581196", "tx_index": 7916138178043215, "spending_outpoints": [], "spent": false, "value": 1160917627, "n": 2, "type": 0}], "size": 255} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qph47qy7dlztm6mvezslfgav02vlu64u2sq5aza", "script": "00140debe013cdf897bd6d99143e94758f533fcd578a", "tx_index": 117838576399120, "value": 684703, "spent": true, "spending_outpoints": [{"tx_index": 1627354218830689, "n": 0}], "n": 1, "type": 0}, "witness": "02483045022100822f0d48ac932dcf7ad3e3d0040fcf2b90f51d5d656004dc16eed6e2cc471aac022015e2f664c2f38a360a7ab1d9b87ce95ba7cec75d2678daa3930e5a194b1a21f2012103b709a0b8519ebd1e4a56932c4dabc579d907cc671f64e668760da9a06366c5ca", "sequence": 4294967280}], "lock_time": 0, "fee": 2842, "ver": 1, "weight": 566, "rbf": true, "tx_index": 1627354218830689, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406670, "hash": "f74523a0577a37134f201071e1388fe7ccc998038d2dc625640cdb18718f402e", "double_spend": false, "out": [{"addr": "35Xacd8GC1MMCmCuYwMNaJ3UrCyi2xSPnr", "script": "a9142a17a1f3345d1d2cefd4af5e8a2df65adb97128e87", "tx_index": 1627354218830689, "spending_outpoints": [], "spent": false, "value": 149383, "n": 0, "type": 0}, {"addr": "bc1qygqr8qtd4j9rdghsuynqjrl5w48g4vdljfjqme", "script": "0014220033816dac8a36a2f0e126090ff4754e8ab1bf", "tx_index": 1627354218830689, "spending_outpoints": [{"tx_index": 359661801933760, "n": 0}], "spent": true, "value": 532478, "n": 1, "type": 0}], "size": 224} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qjzquemkr58ldg7jkreet057yzsr254n7hz62vj", "script": "00149081cceec3a1fed47a561e72b7d3c41406aa567e", "tx_index": 3073685059352869, "value": 6898, "spent": true, "spending_outpoints": [{"tx_index": 1062399915275687, "n": 0}], "n": 1, "type": 0}, "witness": "0248304502210088b6eaf8cc1953e5e56773178c0e9c8f99fb84e506d96dd29dfcd184ae564542022030dc6b9d7c7f5f2922f4908bbcf35e0ec4ff1c8d72da61de440989f89a631b100121021a061e5d4fb92a449ab2d3b50dbc0812800f774e4b2595b41eb61067ad0b0f41", "sequence": 4294967295}, {"index": 1, "script": "", "prev_out": {"addr": "bc1qk26y7xsm462ea40epuc83c6krz34merj9exkgl", "script": "0014b2b44f1a1bae959ed5f90f3078e35618a35de472", "tx_index": 2784008096235323, "value": 34800, "spent": true, "spending_outpoints": [{"tx_index": 1062399915275687, "n": 1}], "n": 1, "type": 0}, "witness": "02483045022100ba30824c58b407c7c4e8e07a9dcdedd92c8b906c382aaff24979d86ddeedbc110220186ab694179dd0ce4ac1313c23d01336cd321ce24b99fdd82ee2eff0992926450121022e459f5cb3f1d3c8bdad9048bc46839edec9c64adfc16bb7d2b4d3bda2369cf4", "sequence": 4294967295}], "lock_time": 0, "fee": 3749, "ver": 2, "weight": 838, "tx_index": 1062399915275687, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 2, "vout_sz": 2, "time": 1636406670, "hash": "0010b2ce2c95c089ff5180054e1732160acb50ebbc251275103cad790cfa311e", "double_spend": false, "out": [{"addr": "bc1q02w83s5mgda6sgh9wk93ayzrrt5j2vwam4x4sk", "script": "00147a9c78c29b437ba822e5758b1e90431ae92531dd", "tx_index": 1062399915275687, "spending_outpoints": [], "spent": false, "value": 31911, "n": 0, "type": 0}, {"addr": "33kcAKx8uESR9v6ZuZEGTcDSe8kBY12cNH", "script": "a914169e146102b4fa6286218b87ad80dac2c39a89a787", "tx_index": 1062399915275687, "spending_outpoints": [], "spent": false, "value": 6038, "n": 1, "type": 0}], "size": 373} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qrw3apn7qjsp9j6225v4neyd6u2t5f9dl780nr2", "script": "00141ba3d0cfc0940259694aa32b3c91bae2974495bf", "tx_index": 2707543695066745, "value": 9090849, "spent": true, "spending_outpoints": [{"tx_index": 461763776919610, "n": 0}], "n": 1, "type": 0}, "witness": "0248304502210098d96fb4ed8dbe8fc5e75063bdc9e4f3c834000cf470759b4520e24b601c9bba02207910fefe049e88c7125aa0ec807eae838c926a96e072297a939f6a56cea23e4b012102b16d515e643275b4d7793d7c9a282636f5c86072ffdecc56fef71901524d4a65", "sequence": 4294967295}], "lock_time": 0, "fee": 1716, "ver": 1, "weight": 566, "tx_index": 461763776919610, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406670, "hash": "797fa001db61f69478116fbaa5ab4911e999d470c0df395403d2c1250fc61f0d", "double_spend": false, "out": [{"addr": "bc1qeyhe525v5834kn2j3udc3hluv7cthkyjarh5r2", "script": "0014c92f9a2a8ca1e35b4d528f1b88dffc67b0bbd892", "tx_index": 461763776919610, "spending_outpoints": [], "spent": false, "value": 51933, "n": 0, "type": 0}, {"addr": "3PCrP9LzCt5MNNjgK2oWsFK485r2KepTA2", "script": "a914ebff27d45c63c2620d41c3eb0c48db6483378bc287", "tx_index": 461763776919610, "spending_outpoints": [], "spent": false, "value": 9037200, "n": 1, "type": 0}], "size": 224} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qdmqelphjxauavxu6nql8akz9ycxv69z48f7yrt", "script": "00146ec19f86f23779d61b9a983e7ed845260ccd1455", "tx_index": 8266759549775869, "value": 270340562, "spent": true, "spending_outpoints": [{"tx_index": 4747614140915628, "n": 0}], "n": 1, "type": 0}, "witness": "024830450221008bacdb8a9f9e1709a84da9b5a5fc5e28b17ce252d4d1db7367784f02cb39e599022007e6cd4455242f4626e00edd07a0f3efab9c55b088cea44b021d6316a36a6eba012102547fc8123dedf714f1f753197bdf003f22189749a5c719781edc60540168f592", "sequence": 4294967295}], "lock_time": 0, "fee": 2535, "ver": 2, "weight": 566, "tx_index": 4747614140915628, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406669, "hash": "28e9d1ccad9b2077fdeac7951590b9202fc043d7df2710c65a64fd327370ef86", "double_spend": false, "out": [{"addr": "bc1qd650plsdfmwaxspg6n52dj442h2d20xhg0v229", "script": "00146ea8f0fe0d4eddd34028d4e8a6cab555d4d53cd7", "tx_index": 4747614140915628, "spending_outpoints": [], "spent": false, "value": 270051291, "n": 0, "type": 0}, {"addr": "3Hg3WQ71SZ75SEfXJangn3GbVNX4ACVn3p", "script": "a914af52eb29217ff4ed4db64310e79f94fdbd44881487", "tx_index": 4747614140915628, "spending_outpoints": [], "spent": false, "value": 286736, "n": 1, "type": 0}], "size": 224} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qkg2uzkv5qyj49h6fratqv3qpm9jjcgj85fz3vf", "script": "0014b215c15994012552df491f56064401d9652c2247", "tx_index": 167755165865211, "value": 1111520, "spent": true, "spending_outpoints": [{"tx_index": 4590062018629189, "n": 0}], "n": 2, "type": 0}, "witness": "024730440220404d66371dbc18aae6cb1bbc135ce6b239403b15a0ffd8632969e09e2a1ecd9c0220780b78969f432ff354dad1769445a34169e96f184a64039d8b1496bc2c2809540121034f6c332d27aaaf374a99b968b180d7322e5edb27063916f94d92a322b225384a", "sequence": 0}], "lock_time": 0, "fee": 1540, "ver": 1, "weight": 437, "rbf": true, "tx_index": 4590062018629189, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 1, "time": 1636406669, "hash": "d7591f70e2f823c87bf22efa21886a0afbf19d1ac24f161c2f2b72f0c0187582", "double_spend": false, "out": [{"addr": "bc1qw425xk7fkz9nf36960z4y9et6ges5utz3wcu6h", "script": "00147555435bc9b08b34c745d3c552172bd2330a7162", "tx_index": 4590062018629189, "spending_outpoints": [], "spent": false, "value": 1109980, "n": 0, "type": 0}], "size": 191} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qge7uc506fs35l0xc20amcajr4qgn94jt4uy864", "script": "0014467dcc51fa4c234fbcd853fbbc7643a81132d64b", "tx_index": 4986047983071302, "value": 3008047, "spent": true, "spending_outpoints": [{"tx_index": 4455327319328767, "n": 0}], "n": 1, "type": 0}, "witness": "02483045022100b566537bba64f1febae3612a026bc24ed3ed48824794481a66a0b8a15e48beb902205be2774b137d8dac3b36edd1983d841f9251c8672aa9444e1e849764daf62aee012103335540ec6e117bfb59b46117d75610001d90bf1724e3af6f9161bc9a13479fcc", "sequence": 4294967295}], "lock_time": 0, "fee": 783, "ver": 2, "weight": 574, "tx_index": 4455327319328767, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406669, "hash": "1b531846ba6d5e0db7bd907fbbaa81776c11c40e5172aae701ff3fd0d1c5a07e", "double_spend": false, "out": [{"addr": "1H58wVVHmur6KiHcFPuyMKAvmFt9v8qQvo", "script": "76a914b04a4dcfb9281f041feee1a3a9270a48d53b9f0788ac", "tx_index": 4455327319328767, "spending_outpoints": [], "spent": false, "value": 301294, "n": 0, "type": 0}, {"addr": "bc1q70as3kk2ll7mgsg5cvtgduy9w2cn09sw2d67qs", "script": "0014f3fb08dacafffdb44114c31686f08572b137960e", "tx_index": 4455327319328767, "spending_outpoints": [], "spent": false, "value": 2705970, "n": 1, "type": 0}], "size": 226} +{"inputs": [{"index": 0, "script": "483045022100fdc34f7de7c2a00731a20e6373c5624dfc51b2d953d1ad235fd9215c9582fdbd022008a654f3940e7b3dd9dcef32f2a748a682dbfffec03cbf1e507f80b67bb4af6a012102159c4b283bc7bdc4ba959a893b606374de9b2582ffa2f3fee119177f6cc98dd9", "prev_out": {"addr": "1FZAhizjbkx73d1WFnEhTgLNGhYw72sQK9", "script": "76a9149fa72bb23364447aee73a3b428d4b4259ab8fa2d88ac", "tx_index": 3952310916067536, "value": 23393, "spent": true, "spending_outpoints": [{"tx_index": 4386667172417724, "n": 0}], "n": 1, "type": 0}, "witness": "", "sequence": 4294967295}], "lock_time": 0, "fee": 2944, "ver": 1, "weight": 904, "tx_index": 4386667172417724, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406669, "hash": "6ea941ab47a99a7eb841bf10b56f783017302e82f7228ceda9e0857a5434ad7c", "double_spend": false, "out": [{"addr": "1JyPDA6bKdbQFotrCA3KkQBZ8RVvpLKneQ", "script": "76a914c523f8c98bc4db9778f1adc897db865cd3132d3c88ac", "tx_index": 4386667172417724, "spending_outpoints": [], "spent": false, "value": 7561, "n": 0, "type": 0}, {"addr": "1JhzmxFL2DSFdit4MYU1pJZ91turrr31Ua", "script": "76a914c23b0145f1e1a92197fcad73382eb1951d59128888ac", "tx_index": 4386667172417724, "spending_outpoints": [], "spent": false, "value": 12888, "n": 1, "type": 0}], "size": 226} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qyemk24czaa6a2nr89nrz775ewvptxg7yfe750u", "script": "00142677655702ef75d54c672cc62f7a997302b323c4", "tx_index": 5056955923568542, "value": 2451777021, "spent": true, "spending_outpoints": [{"tx_index": 3521040327201062, "n": 0}], "n": 1, "type": 0}, "witness": "02483045022100e0fab40ede8f31a26cfd2775f5d488b5918191665c3e97a6299f54185e5c46b302204634212e0b7b336d2f35f3742b0e39be4fba6cf957b7a0e464fcbb7062f39781012103262587212166a8069cf3a5f154fdc5e4b1cdf0beddb85ead226403c1a878c3d9", "sequence": 4294967295}], "lock_time": 0, "fee": 2767, "ver": 1, "weight": 562, "tx_index": 3521040327201062, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406669, "hash": "e1e6bb4912ff8cb1d444871d4208a6ee96ca9c3eff85def30435898aaff01264", "double_spend": false, "out": [{"addr": "bc1q7epvme8mujq2qjws7gm8x8sq2xy7f0gthvqw0n", "script": "0014f642cde4fbe480a049d0f236731e005189e4bd0b", "tx_index": 3521040327201062, "spending_outpoints": [], "spent": false, "value": 834842, "n": 0, "type": 0}, {"addr": "bc1qyemk24czaa6a2nr89nrz775ewvptxg7yfe750u", "script": "00142677655702ef75d54c672cc62f7a997302b323c4", "tx_index": 3521040327201062, "spending_outpoints": [], "spent": false, "value": 2450939412, "n": 1, "type": 0}], "size": 223} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qrgqla7xxpvhj9t2uqxa4jch5haylqu3ljgh9rp", "script": "00141a01fef8c60b2f22ad5c01bb5962f4bf49f0723f", "tx_index": 3070941768673975, "value": 91398, "spent": true, "spending_outpoints": [{"tx_index": 2321583468933540, "n": 0}], "n": 8, "type": 0}, "witness": "02483045022100faed233fe9e816d8fc0de90ad52779771d7c8f14b18d714d0513079ea2cdb9bc022030c664aa1e06cd0ba03e278eff53ec05e633976a0e8e3b14219844ba8a4df5fa0121031fae0c21370dfb13a76baf3473b4af6143562c6ad92135210b15b48d321d1a2b", "sequence": 4294967294}], "lock_time": 0, "fee": 1554, "ver": 1, "weight": 442, "tx_index": 2321583468933540, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 1, "time": 1636406669, "hash": "71df9b7d29a9ebdf09874a1f919aae2d05a2a5fe2fb02beb19238ddb2fbefb41", "double_spend": false, "out": [{"addr": "38t15JN2E6SegAnGobJyi6odgP34t6KUSi", "script": "a9144edcbf5144b073c27109e50296beb42a4ea99b3687", "tx_index": 2321583468933540, "spending_outpoints": [], "spent": false, "value": 89844, "n": 0, "type": 0}], "size": 193} +{"inputs": [{"index": 0, "script": "473044022073c87bc06b55b42a23e110133e07941375bb081843cf2de06edb955f7e37eec90220063a240ff87c43ff1d362354db587c0eeed09dcd892df483506385dde1bc065b0121032bd66d0e60b3afd7b18c0d36c3fe7a097d0ef4a4f8f046bba66de72b067dc81a", "prev_out": {"addr": "1FMTjNjuTY7NvEowao7Gk622Ut1fWfRrAz", "script": "76a9149d7064cf6ee1e9d3ca284eca63880d7ed15773c588ac", "tx_index": 3680542030090669, "value": 1252423, "spent": true, "spending_outpoints": [{"tx_index": 1809442347930970, "n": 0}], "n": 1, "type": 0}, "witness": "", "sequence": 4294967295}], "lock_time": 0, "fee": 9550, "ver": 2, "weight": 764, "tx_index": 1809442347930970, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 1, "time": 1636406669, "hash": "10b035125339e7d96d8fb5b25eca7b2d41a85bdf576e034febd7aa1e036d6d33", "double_spend": false, "out": [{"addr": "12qA97T8hsDgvVoRCXGZifd9PCraqvd2DW", "script": "76a9141413b8b4f23ed118b7f4d50347169cb293ddd00588ac", "tx_index": 1809442347930970, "spending_outpoints": [], "spent": false, "value": 1242873, "n": 0, "type": 0}], "size": 191} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qw8svd4aegw69s28zvyy5nm0hfmcfwdl8ptkt0g", "script": "001471e0c6d7b943b45828e2610949edf74ef09737e7", "tx_index": 4477887096381731, "value": 6008100, "spent": true, "spending_outpoints": [{"tx_index": 433649683957555, "n": 0}], "n": 0, "type": 0}, "witness": "0247304402201941684ccd2b2f1a5bd380fd5f531498417c80cb4a26f6d9d94852d906fdc53e0220037ea29b6c5da0e15bc651ddfef1bc6b4cb528586706c71400d9eb9d92cbca760121027705ab6c705f615157ebcec76b87f32b5ccd0204f82ede72531468e15fbb5cbf", "sequence": 4294967294}], "lock_time": 0, "fee": 1988, "ver": 1, "weight": 565, "tx_index": 433649683957555, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406669, "hash": "1887b696a0c0090c384ea8ff8dd1b6a36aa12e1457dd0f38799b39f47a37530c", "double_spend": false, "out": [{"addr": "3B4HhxoYF4RDva2EfLt8XAhV92ugQVNA8b", "script": "a91466bf0ad4e3bf9f73d58b874b0e450f4c6ff8785987", "tx_index": 433649683957555, "spending_outpoints": [], "spent": false, "value": 5300000, "n": 0, "type": 0}, {"addr": "bc1qw8svd4aegw69s28zvyy5nm0hfmcfwdl8ptkt0g", "script": "001471e0c6d7b943b45828e2610949edf74ef09737e7", "tx_index": 433649683957555, "spending_outpoints": [], "spent": false, "value": 706112, "n": 1, "type": 0}], "size": 223} +{"inputs": [{"index": 0, "script": "47304402207e7898e9311c4ae3a27bc86c4d56004cb2c4cfee699b5db97864373f8bf45daa0220338fea58e40fdc29075787e65d71ef027e693e277037a4187650c9ffbfc474300121033a164598da9324a81dd7749b68248aa6e4e32f16216862288acb73c7f288031d", "prev_out": {"addr": "18NgYEPLk8jUFNx2DmxwzhzQ3U2GnLbaUE", "script": "76a91450e29ee824b8b0a9894f775c473a782d2a2ef48788ac", "tx_index": 7936343358062621, "value": 6609981, "spent": true, "spending_outpoints": [{"tx_index": 3825997181791941, "n": 0}], "n": 139, "type": 0}, "witness": "", "sequence": 4294967295}], "lock_time": 0, "fee": 9550, "ver": 2, "weight": 764, "tx_index": 3825997181791941, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 1, "time": 1636406668, "hash": "ab24083af0456a961c0ceda2ea612344bc88e6c04d3ab98bfc2e767517cbbd6c", "double_spend": false, "out": [{"addr": "12qA97T8hsDgvVoRCXGZifd9PCraqvd2DW", "script": "76a9141413b8b4f23ed118b7f4d50347169cb293ddd00588ac", "tx_index": 3825997181791941, "spending_outpoints": [], "spent": false, "value": 6600431, "n": 0, "type": 0}], "size": 191} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qny9dclf4e45849ql8ljyann7erugvpqdj3k0v9", "script": "0014990adc7d35cd687a941f3fe44ece7ec8f886040d", "tx_index": 5999089474860315, "value": 44272, "spent": true, "spending_outpoints": [{"tx_index": 2957271339174925, "n": 0}], "n": 1, "type": 0}, "witness": "02483045022100bd8885d706f1d8097cbb05294aff1d46a4bbb127ee6fad05b514551d614adc9302201bdff4a881a4aeab8a0ee45baf7100ac5bf3e23bf99dfbe352dd6a3215f6c7e9012102ff623f8136f833fe32e8737b348108e919f19f886703f301d877f7041beb65c7", "sequence": 4294967293}], "lock_time": 0, "fee": 2178, "ver": 2, "weight": 438, "rbf": true, "tx_index": 2957271339174925, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 1, "time": 1636406668, "hash": "8398f037aafae7423f3d3dd8c52b528624b1df32d43c296edd6b60681dfb0c54", "double_spend": false, "out": [{"addr": "bc1qv7shch59597mqgmpxljaq6dcqdztjcl7pl7fhu", "script": "001467a17c5e85a17db0236137e5d069b80344b963fe", "tx_index": 2957271339174925, "spending_outpoints": [], "spent": false, "value": 42094, "n": 0, "type": 0}], "size": 192} +{"inputs": [{"index": 0, "script": "47304402204bd51302992b227609243225aa404259ff5c4120e801dac178073000b9c73d4402202ad484b5e64525d7d7e1ef9e218348c6ddcb365f4e79feb62d8e88aed97080f0012103bff5795e0badec97bf264acdcdb433a8ba3046711a0505fdc6df455abde82013", "prev_out": {"addr": "16PyTPo9YkdLiQX9ojNYAm9hpuXY1FjCns", "script": "76a9143b30e808b03ebf5dfd354a0b7784a3c33287f05a88ac", "tx_index": 2414855406825753, "value": 721123, "spent": true, "spending_outpoints": [{"tx_index": 2354480809921026, "n": 0}], "n": 1, "type": 0}, "witness": "", "sequence": 4294967293}], "lock_time": 0, "fee": 4966, "ver": 2, "weight": 888, "rbf": true, "tx_index": 2354480809921026, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406668, "hash": "53cd346c1b97e5de1017bf02aed63006a827f9585d0edeb098175072421aeb42", "double_spend": false, "out": [{"addr": "bc1q8h3xdu9964zvk0ryl90nrv7vdgu6pkcrr8ryqx", "script": "00143de266f0a5d544cb3c64f95f31b3cc6a39a0db03", "tx_index": 2354480809921026, "spending_outpoints": [], "spent": false, "value": 225800, "n": 0, "type": 0}, {"addr": "16PyTPo9YkdLiQX9ojNYAm9hpuXY1FjCns", "script": "76a9143b30e808b03ebf5dfd354a0b7784a3c33287f05a88ac", "tx_index": 2354480809921026, "spending_outpoints": [], "spent": false, "value": 490357, "n": 1, "type": 0}], "size": 222} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qftf98c8vzwpc90dh5w3f5xy4f5kpt0x64d0a64", "script": "00144ad253e0ec138382bdb7a3a29a18954d2c15bcda", "tx_index": 1774581417791084, "value": 116118, "spent": true, "spending_outpoints": [{"tx_index": 8322339034003297, "n": 0}], "n": 0, "type": 0}, "witness": "0247304402204caadf23fd25e14cb367a4c1d3b77a7345f00aa4418f86b12638afcf0ae148c202205efd2d0621f86f2c55bb1c396adc61cd038862b06604cc981145feb6128774cd01210339958b2e50f7f394d613a9d32e320c264b9bcb5e4e1727192988853600fface1", "sequence": 4294967291}, {"index": 1, "script": "", "prev_out": {"addr": "bc1qftf98c8vzwpc90dh5w3f5xy4f5kpt0x64d0a64", "script": "00144ad253e0ec138382bdb7a3a29a18954d2c15bcda", "tx_index": 4915366475226110, "value": 73054, "spent": true, "spending_outpoints": [{"tx_index": 8322339034003297, "n": 1}], "n": 0, "type": 0}, "witness": "02483045022100b275a567edac61f4666fdaa04db8efa8c12b926f9124f70fe27ea4994cd07a9f022046441bc86a690a8c9b3e6bb645cc899aaa5a4f4f2b66ef7fae7c53c220a8cad601210339958b2e50f7f394d613a9d32e320c264b9bcb5e4e1727192988853600fface1", "sequence": 4294967292}, {"index": 2, "script": "", "prev_out": {"addr": "bc1qftf98c8vzwpc90dh5w3f5xy4f5kpt0x64d0a64", "script": "00144ad253e0ec138382bdb7a3a29a18954d2c15bcda", "tx_index": 605750923380429, "value": 74591, "spent": true, "spending_outpoints": [{"tx_index": 8322339034003297, "n": 2}], "n": 0, "type": 0}, "witness": "02483045022100dda20cda4039cfe2e8e060400d846b6a29e03c7b3cf2f5283d2dc970c32b7f930220587bd748b7b58fb0db5c62206789b9dfe621c9bf74301526ee237d5f193291cd01210339958b2e50f7f394d613a9d32e320c264b9bcb5e4e1727192988853600fface1", "sequence": 4294967293}, {"index": 3, "script": "", "prev_out": {"addr": "bc1qftf98c8vzwpc90dh5w3f5xy4f5kpt0x64d0a64", "script": "00144ad253e0ec138382bdb7a3a29a18954d2c15bcda", "tx_index": 4760843852333502, "value": 90469, "spent": true, "spending_outpoints": [{"tx_index": 8322339034003297, "n": 3}], "n": 0, "type": 0}, "witness": "02483045022100c537db767178cc0392955220aae6cf132e2dbef170321554e17594d9d30ef4a1022009acf57dddda1605c0eec7054235a082f21c1a188e0fa73bbba75cd03a09d94601210339958b2e50f7f394d613a9d32e320c264b9bcb5e4e1727192988853600fface1", "sequence": 4294967294}], "lock_time": 0, "fee": 4410, "ver": 1, "weight": 1257, "rbf": true, "tx_index": 8322339034003297, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 4, "vout_sz": 1, "time": 1636406667, "hash": "1fa25b7647f945fec9e8c401145c79c85bb3eda850eb85b24f0ebb936efc88ec", "double_spend": false, "out": [{"addr": "397tf1vFCpsRY2kBvZjubWKEFCmAG1NiTa", "script": "a914517d367701d7a03273f5b29e2e8fb4ffd59404de87", "tx_index": 8322339034003297, "spending_outpoints": [], "spent": false, "value": 349822, "n": 0, "type": 0}], "size": 639} +{"inputs": [{"index": 0, "script": "483045022100cbbabac3cfe4ba193ea5af15089c14db8731faf2ab7613c9305a7498af8789c202206fc18c96e229b3c8906a9e2d3bb339c578275afbab780058c1d2e66b1018bf6f0121035a71a06e40ba374308840d670778e13abd496905cdaeea2715fa9dd487a2a464", "prev_out": {"addr": "1DPBFhGFcLFBE9Ls4AZvCq1YWsgcTNWoL4", "script": "76a91487d33839953e9fb33dd98d5e300868b9c68fa5a488ac", "tx_index": 2330977840375561, "value": 1183337, "spent": true, "spending_outpoints": [{"tx_index": 3724245364169931, "n": 0}], "n": 1, "type": 0}, "witness": "", "sequence": 4294967295}], "lock_time": 0, "fee": 4416, "ver": 1, "weight": 904, "tx_index": 3724245364169931, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406667, "hash": "c4e3697d7bd81218baf570d18ed3afe85f854bbb19b517ae415de6e68f73d969", "double_spend": false, "out": [{"addr": "1Ct4PfUdW3k2ExWib88RP2KYaFKSUpaWGX", "script": "76a91482516d99b6750a1fb0d364f6e01cda67ca3cd81588ac", "tx_index": 3724245364169931, "spending_outpoints": [], "spent": false, "value": 829268, "n": 0, "type": 0}, {"addr": "13vZLxdaBQzLxfDcsw8a3KaFyhTxNKweCS", "script": "76a91420114c0be9ac38422478803fce235df0c942303a88ac", "tx_index": 3724245364169931, "spending_outpoints": [], "spent": false, "value": 349653, "n": 1, "type": 0}], "size": 226} +{"inputs": [{"index": 0, "script": "160014843602b112f5cac3a82032bbaf58acafe2d7a67b", "prev_out": {"addr": "39zppaGJ2FD37NjfaF8ZvAeGGJWSKjNeod", "script": "a9145b1f39af446c261734607f3c26596d98295dc5d987", "tx_index": 8067362209800182, "value": 2280000, "spent": true, "spending_outpoints": [{"tx_index": 7010643802717876, "n": 0}], "n": 0, "type": 0}, "witness": "024730440220214b66561a609438658a1b12de4ee12774b5c3c55c27f10fb7a93bfb324ddb5202202688b98684d06daa7ba3efcce1b8c4d0ba66425b7d79fec26f2203c440f27a4e012103a939e24796ea5af0e13975b57b970c06b593f5b89b114e180eac9fec53c164bc", "sequence": 4294967293}], "lock_time": 708833, "fee": 1176, "ver": 2, "weight": 669, "rbf": true, "tx_index": 7010643802717876, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406666, "hash": "05dfce14f4c953bd3610f49918f739b6956095f5d12b5cf7d5a5f50fac2541c7", "double_spend": false, "out": [{"addr": "18DjNgupGzHWAzRxAoN9B6Ua46DhMgr2NE", "script": "76a9144f313e772b08cb89ed143d65dbf010fc7b1f5d3788ac", "tx_index": 7010643802717876, "spending_outpoints": [], "spent": false, "value": 1155649, "n": 0, "type": 0}, {"addr": "3Mpg11AX33CJwfzsNcZFCgmgnxvna2LHNp", "script": "a914dcd5365fc9582177e65cec98ae1abc1d185ef4b987", "tx_index": 7010643802717876, "spending_outpoints": [], "spent": false, "value": 1123175, "n": 1, "type": 0}], "size": 249} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qvq0ee84zc2emevetsl3mx9xl9ynjpelhxjjesq", "script": "0014601f9c9ea2c2b3bcb32b87e3b314df292720e7f7", "tx_index": 5489189786020300, "value": 5205828424, "spent": true, "spending_outpoints": [{"tx_index": 5776942886505092, "n": 0}], "n": 1, "type": 0}, "witness": "02483045022100bffe54d375fe1c9194bc26298221597f14d83e648a8391519730f26d2865c83802201555b90bb20af1d8806d1d20778c420be35675f1f4d3f4bf37a7be67985534350121034085134fa091ae6b6c0c6eda885e2a0328b4abe70f7129050793f2b32a1e10d8", "sequence": 4294967295}], "lock_time": 0, "fee": 2787, "ver": 1, "weight": 566, "tx_index": 5776942886505092, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406666, "hash": "3f7eaa33ec6b3015cfbdb1163837f5f47797ea07439e58feee20541aa5ca30a4", "double_spend": false, "out": [{"addr": "3MDLQu27S9JMgkRmQEX6PCrujqBHnwQ8QZ", "script": "a914d6264d6ea3bfebe8c37874ff9349272d1e76a25587", "tx_index": 5776942886505092, "spending_outpoints": [], "spent": false, "value": 3011, "n": 0, "type": 0}, {"addr": "bc1qvq0ee84zc2emevetsl3mx9xl9ynjpelhxjjesq", "script": "0014601f9c9ea2c2b3bcb32b87e3b314df292720e7f7", "tx_index": 5776942886505092, "spending_outpoints": [], "spent": false, "value": 5205822626, "n": 1, "type": 0}], "size": 224} +{"inputs": [{"index": 0, "script": "220020df6d1acc29d7c26f64d541e005979e61c10f17501c361987dfe1c03ce1eca672", "prev_out": {"addr": "3BruxogZPnyMYkSuAogJD2UqtQAEGmga7n", "script": "a9146f907103add8b3e87af8e6901f2740cf9332f36b87", "tx_index": 7756503624835258, "value": 26026188, "spent": true, "spending_outpoints": [{"tx_index": 793107092391462, "n": 0}], "n": 0, "type": 0}, "witness": "040047304402206e4e74651fc4bb32d4ac8a6532d8203cce496b6c9d2a95da6e98f8c30945d7990220698590d7fa3dee6daeb4ed17b478bfb993d6537eb14cf54aa726a15cb6ee2ab7014730440220594b52267972897e86d23e0b9377236f00af7c7874b89131734b1df0ebf932c502204027cc261584008ac429f9de7be7a8362e2d604c5223346c7cfabe455e09fbba01695221021249ce234d4890e7817e3e9b569fad416dee51e9cf1b05025a85e8aa740f756221023b8082d38e6217691e3611ccabbd398fb50005ceb691fc9709bc315f63b6024821026d71504c3ed2a9c06985770cb79030ce1330ba4d80629d076f5c94d3e2d9db3553ae", "sequence": 4294967295}], "lock_time": 0, "fee": 3296, "ver": 1, "weight": 990, "tx_index": 793107092391462, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 3, "time": 1636406666, "hash": "13d7910a9cd03f50235ba5728f011e1e5912c887b1a8e283e4303116149d8a16", "double_spend": false, "out": [{"addr": "3PRzdSHL4HJwE7FUQBj1xrPixfFGfRXpK4", "script": "a914ee7b726493b7eb108fe973f82f8da26d4a96798887", "tx_index": 793107092391462, "spending_outpoints": [], "spent": false, "value": 25944892, "n": 0, "type": 0}, {"addr": "1C71QvJzocSQH96kbx1QkqpbBQudw6EWEa", "script": "76a91479cc3940d763825cddbcd4b223a50d075aa8973288ac", "tx_index": 793107092391462, "spending_outpoints": [], "spent": false, "value": 37000, "n": 1, "type": 0}, {"addr": "3Q3KQKKurW1XdQiwtTFrTnZhrVeJr6Qt8t", "script": "a914f529ad5563def966a300f9d5a8864f0d7dabdec787", "tx_index": 793107092391462, "spending_outpoints": [], "spent": false, "value": 41000, "n": 2, "type": 0}], "size": 438} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1q8wuv0kzvm2ux0f88hksu6xp4shutv74n54mr62", "script": "00143bb8c7d84cdab867a4e7bda1cd183585f8b67ab3", "tx_index": 2883254873436779, "value": 257002, "spent": true, "spending_outpoints": [{"tx_index": 8828150595154990, "n": 0}], "n": 154, "type": 0}, "witness": "0247304402204110e1dee354ce3af70aff84bd844af0b4c6c90cb3cb185bd1640ec70bdaee7a0220525674a1f9439d284529839e25ed89945e4c402843ed5233fbf8d5de6ca24b5f012102269f7479e172c981668f62476039003d0b511bff6e72c4104a6e811978c00e5d", "sequence": 4294967295}], "lock_time": 0, "fee": 885, "ver": 2, "weight": 449, "tx_index": 8828150595154990, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 1, "time": 1636406665, "hash": "c7922141791f7ef4d2a80b0fc69c50b7938f717dfbd7fcf10473a1fbe13fe9fa", "double_spend": false, "out": [{"addr": "1KGdmpw9J8EHobYUoNSBS43RWY31pNMV9D", "script": "76a914c8673331ed0160d151e0ebeb26fb96abe968369588ac", "tx_index": 8828150595154990, "spending_outpoints": [], "spent": false, "value": 256117, "n": 0, "type": 0}], "size": 194} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qnuh6ycr9wcsy6tvakxrhyjuhrwwk5v93u9hmh3", "script": "00149f2fa2606576204d2d9db187724b971b9d6a30b1", "tx_index": 6363709746823483, "value": 130976, "spent": true, "spending_outpoints": [{"tx_index": 8188473317676292, "n": 0}], "n": 0, "type": 0}, "witness": "0247304402206c56933e2d64c29e16f8b566f01db511276c031b935b9ec47ffc21d03471d29b02202dc493d8e79688d1a7c386ebf7013553085d6efb9904622f55c7528406a61bb8012103fed4063a4a480687ccd1c93e9ce5daa84b1ee740e6f1ef90bd3080d87149b9a9", "sequence": 4294967293}], "lock_time": 708833, "fee": 113, "ver": 2, "weight": 449, "rbf": true, "tx_index": 8188473317676292, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 1, "time": 1636406665, "hash": "8509c368a65f201709a9473a79ef1293f4aa7a53424729a99c24a8d21afcbae8", "double_spend": false, "out": [{"addr": "1Hapqi9Un3aifCKKzB3qgyL6abi58Vqdx7", "script": "76a914b5e7ac87dc591425b38dcfd5a606ff91f172c0c788ac", "tx_index": 8188473317676292, "spending_outpoints": [], "spent": false, "value": 130863, "n": 0, "type": 0}], "size": 194} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1q54uxa5aue9k3z64gfhs004j33v4tggnjaaq6076gpnz922ljuplq2cnh46", "script": "0020a5786ed3bcc96d116aa84de0f7d6518b2ab42272ef41a7fb480cc4552bf2e07e", "tx_index": 7083803159099088, "value": 6941659, "spent": true, "spending_outpoints": [{"tx_index": 8092402219407069, "n": 0}], "n": 1, "type": 0}, "witness": "050047304402200b11bead39e35412e642d481d50146f54d398218e28d7835e9b9878d23f4a1dd022065682fdb00a5b99c119c540767b17274a72beb80d5349b6fe0a7364a10925d7b0147304402203abc3b7ee0da612ca226587b3e9305f42f4b4507f0984a6be871f043283fd2d802203e5e9f8d5c09bc6c5edd67f347d38d945503931370e4b4b515dfbfb3ea8fdd6d0147304402203718fb0c4ba3d0826b12d2379ad12e337720e5c396c6b3a8b906795ae1b064ec02201db09b76a21ed3723bee243d3c86f4d40184d0546d86fb898660aa4ee792a36f018b53210242e565130d9969b7475dec742d583f3aa622ae92c584bada583a81dc417e2362210255fc264da1178bd9fea77416c253df00499ed3027d5460035a21c8f4ad7350002102d87d4f977db1da7b37fb9fa993bef7db0278b6207b9d8c72805e159ecec4635521038a51e2fdcf3169e5952e39bcfa67e78eb111c6754da25523866bc349d523c4bc54ae", "sequence": 4294967295}], "lock_time": 0, "fee": 15236, "ver": 1, "weight": 864, "tx_index": 8092402219407069, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406665, "hash": "414ddaaf1cdf7263b7dab585198a50548b35c9fb36a1a88462ecb656bdf9ffe5", "double_spend": false, "out": [{"addr": "39JnkJcRrNHg1iVWdUSEYR1aB8qdUboPVG", "script": "a914538cdb1b9203e23fe1eaecba39a648f5d5063d9a87", "tx_index": 8092402219407069, "spending_outpoints": [], "spent": false, "value": 150700, "n": 0, "type": 0}, {"addr": "bc1qxwm4kgz4rhdjpwjn9f4243c3c6cn83c65jkuhnsxj4krzeryzhzsge9fxj", "script": "002033b75b20551ddb20ba532a6aaac711c6b133c71aa4adcbce06956c31646415c5", "tx_index": 8092402219407069, "spending_outpoints": [], "spent": false, "value": 6775723, "n": 1, "type": 0}], "size": 486} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qm3cgsjhhd4esu9g2q2sggumldwfeavttfu4jmx", "script": "0014dc70884af76d730e150a02a084737f6b939eb16b", "tx_index": 8449127683629488, "value": 64422, "spent": true, "spending_outpoints": [{"tx_index": 5827569795054362, "n": 0}], "n": 54, "type": 0}, "witness": "0247304402207de598bc8bda38767430d94438f0a2ade3d2b30b4c3d6ddcda70f0a61e73e7f102200a1d74f368819b9691054b09b1a5a672f0ba2fef3adc04165951982ec5523278012102d6fdbae7414adb2b9d55710554912a6e77e7a5e3cf63d5fa9ccb0914f6c089bc", "sequence": 4294967295}], "lock_time": 0, "fee": 2179, "ver": 2, "weight": 441, "tx_index": 5827569795054362, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 1, "time": 1636406665, "hash": "bc5169b2519351ea389324c2e7d6ca2e31dff5c272a736cdc1d3d84d9c26a1a5", "double_spend": false, "out": [{"addr": "35x69iPMg5ibw8DxtgwrF3HfpqBBzgeu1Q", "script": "a9142eba456a185f3ee913a0b493b4ee4842ad3be9a787", "tx_index": 5827569795054362, "spending_outpoints": [], "spent": false, "value": 62243, "n": 0, "type": 0}], "size": 192} +{"inputs": [{"index": 0, "script": "2200204974fb2a3cf27ba009c3c16d9cb26cc0c9a99c917b23fb1e3c65c0f3c1e9d88c", "prev_out": {"addr": "38HoeaQ3NPhyArEFszEXmwN2dEMfAbFrak", "script": "a91448651103d795f515db0e8f48daafa24a75337be987", "tx_index": 32500860331032, "value": 42795, "spent": true, "spending_outpoints": [{"tx_index": 4975090293678843, "n": 0}], "n": 0, "type": 0}, "witness": "0300473044022038d43eca93bf8657bc76d9a219e86b11148924a5eb2454296b6b94a53993fd12022077a7e1ca5de7f65b49c121de6a7f42d1d766bd30f87225beb41ab7e9b69bc2d90125512102339f5b3927fa999122f00f2747adf1fd6dc7b53ce5530d83ac25957bdbde0e3051ae", "sequence": 4294967295}, {"index": 1, "script": "2200207e83b96007a58eb6f41faab62a500b0f516ed9d03ef877a6f5a35b9bba9b1fb2", "prev_out": {"addr": "33TrZNmGvXot2xGoWPAjiXqzLRcuuK4BeW", "script": "a914137306ce8924e651bdc8fd55f96729b0c034951087", "tx_index": 294333085624292, "value": 77092, "spent": true, "spending_outpoints": [{"tx_index": 4975090293678843, "n": 1}], "n": 3, "type": 0}, "witness": "0300483045022100e2e29754e1e5251528d32df86c136b712484ae5deadbd2461e645b8bf524a2c402202fce0be4b3d0b928029a14abd0979fc96672b22b00e7cc47e8dc34a76cbac80801255121039e40fe5c14226b51e6d1f137e5f708ee00a56e551dee3eb118f3dbcf8aecca7151ae", "sequence": 4294967295}, {"index": 2, "script": "2200204572c6b481db406fe0e756472e95c63d48123aef4bf09c3770c0eb370906a4a7", "prev_out": {"addr": "3HQB7Errx2X66EU2Lb3Gyg1RGh5cvDpQfo", "script": "a914ac529ba2ccf9eaa743ae3ed96c12cbc771acac7a87", "tx_index": 294333085624292, "value": 34944, "spent": true, "spending_outpoints": [{"tx_index": 4975090293678843, "n": 2}], "n": 6, "type": 0}, "witness": "030047304402204ee76fbf53b342673d87bb0ffc48d300005184c5b2806e875888629dfa8d459e02203316b2acbdf7209c95c6610a7fb11c1b6ec6cc436b5583572ccf91ea866d71840125512103641ec075695814ee47a1b75ea513da217c4d8e13453bbed18820d43f1a2d7e2a51ae", "sequence": 4294967295}, {"index": 3, "script": "2200200bcb6d28d55e04e066b0e172149505a491d787cf6f86e7117d7e138a71e9108f", "prev_out": {"addr": "32MbgTYKjeVD3imAkndu5zJjsrJcK78wm2", "script": "a914074bfc5015d86f8c3d190b34f99d95a8f99f941287", "tx_index": 294333085624292, "value": 45255, "spent": true, "spending_outpoints": [{"tx_index": 4975090293678843, "n": 3}], "n": 42, "type": 0}, "witness": "0300473044022032de14940abc52ede51825a6767e16116e9551068ca8b14fdaca3527fda0845002200e66e7d831d739d3652b3f065e34162939bea21e7f1958933b34aad6453896ff012551210276aed77e763c72e11445a4fde3f58057316c47f71588d3f8e2c72617ea2eaca151ae", "sequence": 4294967295}, {"index": 4, "script": "220020e2e03f77de8eb0b42578a097102f4a280b9de0ddad4014d2b8cf168acefb9ad3", "prev_out": {"addr": "3P3zKH92HvseE6uQj4WHrn1W2httxgxnuw", "script": "a914ea5208cb90d3cee8e6e25919fe266c4f8d3bc69087", "tx_index": 294333085624292, "value": 85144, "spent": true, "spending_outpoints": [{"tx_index": 4975090293678843, "n": 4}], "n": 45, "type": 0}, "witness": "0300483045022100ab36365f7f6421328383a92b72e08804e398ea45b6b0a69de0a921a71ad044b40220310caf6a75553341f073ac08bffcef87599d6f84d4e6fa215e05dc882a05cd370125512102112657bf8ac131d3f456b73dcb2b7a4a0596886b26b7807365dfbfdb70c9dfda51ae", "sequence": 4294967295}, {"index": 5, "script": "220020b83acc01e1844e20b50a0bc79493562847fba8bd4017412902671d222c4d1c57", "prev_out": {"addr": "3HrwHcr5HViLp4emFHeqjDWAtB67uroayj", "script": "a914b1624d3b831448047a72459c54143dae0a4be1aa87", "tx_index": 294333085624292, "value": 238139, "spent": true, "spending_outpoints": [{"tx_index": 4975090293678843, "n": 5}], "n": 65, "type": 0}, "witness": "03004730440220498f1304bd62a43df9007910f02ee00f7a96c727541eba525948c84c84943f8202204f7be4c2d4682f45e8d8ab19a94f8d7df93a30269f3207019e328557a9b1dac101255121037b8b745798ddc3184bc5b00353a51aaefce9fbebfa9f267d999cd1e919584eb651ae", "sequence": 4294967295}, {"index": 6, "script": "22002072bbce89ad83ff32c122e9b98a0fa9cefe661d8b421cc24b6380017a73db5d9b", "prev_out": {"addr": "37VMQuhLopGNkW4TwuWHSU1MWPrCFgZsVQ", "script": "a9143f9c0824c466b233771c2256816a8441fc32b41b87", "tx_index": 294333085624292, "value": 31752, "spent": true, "spending_outpoints": [{"tx_index": 4975090293678843, "n": 6}], "n": 70, "type": 0}, "witness": "0300483045022100ee2c5234674ddbe731fcb5b50b988cd9edcccdb552e190d86ef748c23081d2a102202d89b935137e1edb939a25573b4dfcbac98c218772ff5149a36f0dddbb9b37920125512102d049431550df9b757efdee38412caf8e7bba99a12db1232381b7c8f53f0a128951ae", "sequence": 4294967295}, {"index": 7, "script": "220020e6494787ab1a543130925cfe526cf0925716f947b6bad761ecb92adc441b8445", "prev_out": {"addr": "3PupE33PcHBZXrgPi2CuPbfeJhXLG8nUMp", "script": "a914f3be68ced4db35116f8867e565931cfadb353a2b87", "tx_index": 9006694133789420, "value": 147355, "spent": true, "spending_outpoints": [{"tx_index": 4975090293678843, "n": 7}], "n": 0, "type": 0}, "witness": "0300483045022100914213e7967ab1b27377d347ab6804fbeba5797b0687e48a3954508f49b34fab02202d7855016a74e475837fb74b887b3e078d414af544683325bfff549469c8804301255121035722a436dc6ec744b683fff3c8a1dbc86e1ad905c37da6353bf9851db3cd581451ae", "sequence": 4294967295}, {"index": 8, "script": "2200201bb2259561184cc074b41e9434e26be7cf754258dc0012dd2352c9289e1bb535", "prev_out": {"addr": "39aN8QSCgaj3E6HVGfe56PJmKTCDJU2FuC", "script": "a914567ef5dd32b15c3b2638d11115363a58a751117a87", "tx_index": 8501903251556827, "value": 33369, "spent": true, "spending_outpoints": [{"tx_index": 4975090293678843, "n": 8}], "n": 0, "type": 0}, "witness": "0300483045022100cefce9666c53006a36da5754d2bec4dec9371926aa6088eb46b8e0723b3c6ebe02205bc64483beb59b1f22543761f83238920891e466056438519c13c598d7374fc601255121033eee6117b8eb082400f058e732651e11b5083d425aaabd1b6de601059089941651ae", "sequence": 4294967295}, {"index": 9, "script": "220020008a0a6518a80a2fe7ce15e039eba5071c4b3fe4bff5fbeadfaaa480ecb61e3b", "prev_out": {"addr": "3PMW6Jch4jq4rJ2mrwgbs4gWcLaxGpPBpY", "script": "a914eda1f632b1d14664d270cef07805b50dce37b73287", "tx_index": 8390007950023954, "value": 608021, "spent": true, "spending_outpoints": [{"tx_index": 4975090293678843, "n": 9}], "n": 12, "type": 0}, "witness": "0300473044022067651384539cc779e78e826de98eae9760327e66c58743fdaa408d9f86ce75b7022063da3c473b2b70b97022a530e9b4cef00748517208e68e70ccac89b67f97d7cc01255121024c65f98cea87aacc19db6419ae46dd03d345db6a8d644b80bf421090e8c3567a51ae", "sequence": 4294967295}, {"index": 10, "script": "22002070db32be0bb56d8868d796d6713783a538681d93edd71ea52dd119228eb723bd", "prev_out": {"addr": "3GHBXCqnNJMSRDYDXWQqw17V355T8oVKto", "script": "a914a007ea548f2915acebab30446b2439a9cd3f751587", "tx_index": 8390007950023954, "value": 16360, "spent": true, "spending_outpoints": [{"tx_index": 4975090293678843, "n": 10}], "n": 17, "type": 0}, "witness": "030047304402206aca33ae93faaa88314a0ece30d0a0552f039a82bf8a30f7957d5212c67c2ddf02205f3bf47a45f71574aa9b39709b326b611d725ce97ec62064ab7fb69d33d017c201255121026de6ef4b210f0e62a2e3721c21ad44545edb59b078a775a71ee6d94eb588fc2b51ae", "sequence": 4294967295}, {"index": 11, "script": "220020a2747718bd5a2c0150b2ae9c096681bd2979b5e7a5b968e883a0d9e0814d06ca", "prev_out": {"addr": "3CHXBYjWmBY7hYkHDSNhtfKSeLYhs7vhNQ", "script": "a9147437d31029fd4d9b11ce7ca68624883370192a8587", "tx_index": 8390007950023954, "value": 43333, "spent": true, "spending_outpoints": [{"tx_index": 4975090293678843, "n": 11}], "n": 32, "type": 0}, "witness": "03004830450221009cf67a7c9e67a053d91567c42067df9a9c3298d6e5d6aa92070d2af9980b21df02206c48cd10747ae5f353cc26fa7a04dd66a448939bae560ebfb0c4e7997012b4f50125512103098b84ab45c4845fad382f342fab12cd58f0ec7f702ef1806c03496dbbb8ee9551ae", "sequence": 4294967295}, {"index": 12, "script": "220020db43f5c3ec90c811bf051d47d92013b3aed015dae7e45e7d291227daf73df114", "prev_out": {"addr": "3BthNCnNWPBugsNRDMkezFGmxdvRW8KiTT", "script": "a9146fe6c21f40670c8c21a818e0452800bb141fa11b87", "tx_index": 8390007950023954, "value": 191235, "spent": true, "spending_outpoints": [{"tx_index": 4975090293678843, "n": 12}], "n": 79, "type": 0}, "witness": "030047304402201597dd94e57806c675dbe6ab027e15ea33f51d26a415017980b31d50d9e874af0220116cae044afb5c1f8a17a3f45c1ad77ef650537deb52e2b2f7b9222821dc402901255121029d3e1a4152cb847962a94c5790fd32135856b012c556d8784a9385ef5a816bb951ae", "sequence": 4294967295}, {"index": 13, "script": "220020b089deeb63ea67a5dac6e31b25168b20e1962b6bf763ec3de069dbb245646a2c", "prev_out": {"addr": "3CocBxGQ1oEpVHVMXYAATNWJCj1rLd5Dgd", "script": "a91479e87ba28086e555bffd8343a9bedf75ffabea4f87", "tx_index": 8390007950023954, "value": 158591, "spent": true, "spending_outpoints": [{"tx_index": 4975090293678843, "n": 13}], "n": 89, "type": 0}, "witness": "0300473044022058c18a93de43beaecafaf4a170568a44564af44cea399ae11461ed5150cc35f702205e4b4f30366c51d411476c9147125a846c29852a476da98274ab965a794d5d280125512103044ad128a0f83946522510d8a98d935c2e7841b4ce2e4ad394d80652c9fd058b51ae", "sequence": 4294967295}, {"index": 14, "script": "22002006a0d4b3264856e02dad09e3696afed710bab0963a3ad80c7393e701b337f408", "prev_out": {"addr": "3DHn6ucmKSwEpENb7B4NnKJNeVAJLsQMzo", "script": "a9147f3c67a3851502b366f135121d7a4a6b12e7c9b487", "tx_index": 8728031303224551, "value": 766183, "spent": true, "spending_outpoints": [{"tx_index": 4975090293678843, "n": 14}], "n": 1, "type": 0}, "witness": "0300483045022100d8c843ada444e9edcf6ccfc9460e472b8d1da05186ca36ab5b356b47169dd944022052caa9b623840a7fde1cae130fdf4cab866e9c97212d4ab83fa39525b17a6cc40125512103c50415421a2b9c1a9e321a88d9a51cc98d56550a9ca700c3da71350518d0dd1251ae", "sequence": 4294967295}, {"index": 15, "script": "2200208baa262580cfbadfc5bbc727668f2f8aa5074996e0b006d9891b7a2dba44af92", "prev_out": {"addr": "34cbaViMV2Qy4ddNMiWgMvZg9jGGg7stfQ", "script": "a91420126409eae0e7d4896afbe39f5fcd0f5d1ff0f587", "tx_index": 554421911900092, "value": 50427, "spent": true, "spending_outpoints": [{"tx_index": 4975090293678843, "n": 15}], "n": 12, "type": 0}, "witness": "030047304402205ab0450f9aca689d7a0c7ffeaa87e25d0a2eadf172405402ecbcc9e13d3028b10220741b01278fa272c811e90ae72315c6523cbb753fcab24d7678cd757f33c7d82b0125512103461e22fb61a8dedeff0ce020dceae19d10951e5fea7bb0318fa8b54b550add1d51ae", "sequence": 4294967295}, {"index": 16, "script": "2200207a3f43fb5d27d82396a51a9ee1c2609065570f2155fceea71302767442c40984", "prev_out": {"addr": "3CbTtYw3ua8GihmTUSg9jM3AiG5gJxbpb4", "script": "a914779c90191394483dac8fef86eb8353f398985ca287", "tx_index": 554421911900092, "value": 142795, "spent": true, "spending_outpoints": [{"tx_index": 4975090293678843, "n": 16}], "n": 19, "type": 0}, "witness": "0300473044022042eca56a92c32583a0d9f1da86b5a0c08508f52067ec2229b3ea7ffb49232c7a02202c62f48b897d1e775a7589015e2a72d5cced816c351261db6c6e50f7b94fc2b70125512102d763d3a39854cc69479cede71e5c57d789af8310e59c3c949b69ba3807b5e97751ae", "sequence": 4294967295}, {"index": 17, "script": "220020dfedc317cfc6a24633483825ffcd2d44f6f60ddf6f0e4e36ffe1ab336c300c79", "prev_out": {"addr": "39ipodwGbuYb4mqprWcBf6jefxS1osYFPc", "script": "a91458188e7436ef093b781b6ee900407facb37570a187", "tx_index": 554421911900092, "value": 76127, "spent": true, "spending_outpoints": [{"tx_index": 4975090293678843, "n": 17}], "n": 30, "type": 0}, "witness": "0300473044022037712bbac4975dce0e24941357f2221b0e4c09b0c7f3a3a7ff68635734369c7702205bb3d22e13fd358ae57ce6555e1a282cb84afefd8a24030420370ca8be5e13ad012551210365cbb77b03bf5e70bb1af4cb2eee09be9f7d148e9fe421c43bf92c69f00c360051ae", "sequence": 4294967295}, {"index": 18, "script": "220020d48451a52261c103ea8369e21500bf97e07afcf10725389a06f49e85b9b4c9ca", "prev_out": {"addr": "3KAbSZJ5roRAr6j2EthbQCx7eqy4wxzwYZ", "script": "a914bfb15928a0d4c1dea0905420eac577d98005f10487", "tx_index": 554421911900092, "value": 158594, "spent": true, "spending_outpoints": [{"tx_index": 4975090293678843, "n": 18}], "n": 64, "type": 0}, "witness": "0300473044022042e4a59c768b31459f12beeba9e7e77c514308485cab974c1403fd7f16d87c860220128b5c6edb3d245c11c3d6a39c01fb90ccbbecba1284124bad8b5a1cddf3e89501255121025136df6366d580b86917466f0fba7dc696b949a18135690a04c6f7d16521ac7051ae", "sequence": 4294967295}, {"index": 19, "script": "2200201968d6c7a132ffe0c14abe3ed4d4e5af40b153f9a51fecba9f0f6ea8ade7f2b9", "prev_out": {"addr": "3LiFuDkK8Fs2CGPbmgCUbmeGJkKCHUsGe5", "script": "a914d0a679322758637071d21b5e3100c07baf6206ba87", "tx_index": 554421911900092, "value": 158737, "spent": true, "spending_outpoints": [{"tx_index": 4975090293678843, "n": 19}], "n": 71, "type": 0}, "witness": "030047304402202bef57d2374425b0c0092d7b5d28565815fb584a6852d96ee45bf0b57affb2c602200d401de23a9e52de0fd22ae6d28fcdc2a1f887d9991bcf2b6b95c572bfa97cd201255121032c445de4be8e77b19ba3fd4b9092c391ae545131dfaf80fc3e3371c71a45bb9551ae", "sequence": 4294967295}, {"index": 20, "script": "220020106d3aa5db4d8dbc07ddc49638937c9891c3711098f405c95db39179da6ef7f7", "prev_out": {"addr": "3MFvXUGv3CgPjLt3K6fcdrjQGaiH2GpJuZ", "script": "a914d6a39c5b6e746777ddf5cc82ab79996d10cd749787", "tx_index": 554421911900092, "value": 77975, "spent": true, "spending_outpoints": [{"tx_index": 4975090293678843, "n": 20}], "n": 92, "type": 0}, "witness": "030047304402203717c2d8a77e4ad6468a76e301a6fc6f8de0363dbb0aaa19da244ffaf8caac71022019e98dbd5bf3c3b01484f443d8e31aac2cb59e48bf70c4616ece639402b1ad1501255121027d8d06bd167560a85e28fa9747a21f4231a1e1d96cdad66bbf0d809b244f599151ae", "sequence": 4294967295}, {"index": 21, "script": "22002044dd4644e217bfd213e446b948b04c8633e457a26acf8590cd932d44e6d931dc", "prev_out": {"addr": "3M7cenJG6rWFKqtYAui8TMKigR9dcPgvhr", "script": "a914d5115cd6baca9239e0ba5cc86ee61eceb705727f87", "tx_index": 45243477940213, "value": 327300, "spent": true, "spending_outpoints": [{"tx_index": 4975090293678843, "n": 21}], "n": 2, "type": 0}, "witness": "0300473044022069da987eed1e545d8c841dda88b3b2e4478e294aded49de6b968393f5fe8176202207c7361dfe1887fce999e27b79e63e2789ecb4b4ac6dee87fbfc3a54053146e1301255121039d9065ce82cb02908844c62931f513eb7e24a85d5400ae50437c0907ba152f2651ae", "sequence": 4294967295}, {"index": 22, "script": "22002098df6c5b92a737ff6aa02ba80370a40e63114e7bb9df0daa0464c48f0a827800", "prev_out": {"addr": "35bA5szQ86WsU97AxKpKxMsjW3GYgKSMH7", "script": "a9142ac4d1de4a1038638f2687a37061e7648781462687", "tx_index": 8181246253700225, "value": 79453, "spent": true, "spending_outpoints": [{"tx_index": 4975090293678843, "n": 22}], "n": 0, "type": 0}, "witness": "0300483045022100e35124d3668203bbc44ec006e8d0691269ef062828200b856527f0bd54385d890220644e8ed153043f2b31b6aafb680eed8b9f849cab598ab88a0eac0f52e2dacbf30125512103ef919034f4d014533efb2e5f5b5eeeaf31a5dd3e10ad379a23b9026e9c0ae12751ae", "sequence": 4294967295}, {"index": 23, "script": "220020085823a7f643d107699b8b8a3695df4214707eb806898dc4e760263e18ffddae", "prev_out": {"addr": "35xfzPG5jvGsf6SNQLmH1gQ9GLRYH3N1LY", "script": "a9142ed684c5d310d992ecd4be7e382aca342a74070c87", "tx_index": 8454580226845276, "value": 75065, "spent": true, "spending_outpoints": [{"tx_index": 4975090293678843, "n": 23}], "n": 40, "type": 0}, "witness": "03004730440220619e52db35e868af8d16ef338614c277e7227d6e2ebdbfe65813f8fc9af7749002207f77f21b63ec8bcb36a8bd0b4e76e5e5c5fb49cf93ab0c50f5f5e98de118b6fd0125512102c01c33a774cc613306cd63c6d33b18ad39a80378299a542e9051ab7211304ede51ae", "sequence": 4294967295}, {"index": 24, "script": "2200203faca313be14bf30d2e81545e962132a25d12229e6e6107885d0074ca148fc27", "prev_out": {"addr": "3BB859Kmhu2H9zGL99gK2Na1jgKww5hv18", "script": "a9146809e94be99f5b6e31176d2625f829fda63ae05087", "tx_index": 8454580226845276, "value": 40987, "spent": true, "spending_outpoints": [{"tx_index": 4975090293678843, "n": 24}], "n": 131, "type": 0}, "witness": "0300483045022100d91e78615501f984c0baef583b2ed4f708e9a25835a38680fe1a6737c6e7dcf502201f58e874404f975925ab7ea31104a3ee067b31830558a2e9760d8898736865300125512103931c0e76e444135014f7416e1ea780da286133a97014e015f0c9e1b94670f0d351ae", "sequence": 4294967295}, {"index": 25, "script": "22002071c8ad7c175ed8cd01133f01550a62685551c1cfee0a6b879d8516c8afbb9499", "prev_out": {"addr": "3Qt9oJh7ag2R5fD6XAFtw9NSWEjw7QoduY", "script": "a914fe660ae13fcc6357d4accf7efec72e0f9965dff987", "tx_index": 8314188688386386, "value": 61696, "spent": true, "spending_outpoints": [{"tx_index": 4975090293678843, "n": 25}], "n": 3, "type": 0}, "witness": "030047304402203eaf74b1a7f89d6ebd509a704d6f71dd5036d71f5a65b3d4c563fea5dd54b28502204db08601d18d1de30442e850c7017177c2b35fd424a7e8f5b61ae57b365b3f030125512102cc8acfa76e9efa0e20a4a305926d83abb9b7bdf3456a39cda6486310f676ea6751ae", "sequence": 4294967295}, {"index": 26, "script": "22002046e88135e588927bd2fcaae6568657d6baba3d17815c8841717a637427aa3540", "prev_out": {"addr": "3QSVQSGoFVjoR4QAtFuGEG8poAn6bQo8Tu", "script": "a914f98b97f02f0096120f5a7b1a89ce8ab04b8a7aa987", "tx_index": 8314188688386386, "value": 237832, "spent": true, "spending_outpoints": [{"tx_index": 4975090293678843, "n": 26}], "n": 54, "type": 0}, "witness": "030048304502210083ee0ac55f65fba7edb1319a80a357587cb8601a608a5cd195696e31881377750220427cfecf62acb4557eeadba9e6fcf22276743a8913bcdffef45a694f2fab39f4012551210232baef8050160d18647cf0af61d08c50ef28fac6b7d0eb2404c7e244d8c6c27251ae", "sequence": 4294967295}, {"index": 27, "script": "2200200569a4ff3a6a9b68c6e9bedefcb30a4f446d0d1cb01d0ca01b7613282440d6fa", "prev_out": {"addr": "3KUQWrMzCfPM2ps86ED6yZfJSLQKPdcvNY", "script": "a914c30fb70de03f758555bf93c75c354fcc6e19dbf787", "tx_index": 8314188688386386, "value": 31711, "spent": true, "spending_outpoints": [{"tx_index": 4975090293678843, "n": 27}], "n": 59, "type": 0}, "witness": "030047304402201ccbe557fbf8ed7497d9e9d1c75d9e20cf72959680232cb8cc545e88bef5b2010220403c0cc68d08ad9b6380c19f5a6098fe9a5bca639c07a614e271821aeb1d31f301255121037b4b19274e3c5497110da216fe33c78d2d9c8f0c09a8d382ac0862920b2e030851ae", "sequence": 4294967295}, {"index": 28, "script": "22002084476fa956133df07f129ae4d6fd09c63b912f02afcbfa9792928af25d94f303", "prev_out": {"addr": "3HpYM9ahKUJC5GACpAVgzwh6Y1Zhaf9YaD", "script": "a914b0ee5235ff8ea738020e26402310377dbb773a9b87", "tx_index": 8314188688386386, "value": 38249, "spent": true, "spending_outpoints": [{"tx_index": 4975090293678843, "n": 28}], "n": 108, "type": 0}, "witness": "030047304402205105261d0a51d792bf1800f0e40504268bbd5901b1039d92ab5ec900feaa67fa02206b48d4617e20f6ee65d8036a79edb52e1c33e489e4a2e6d9074474a0d6ad9d3b0125512103f6b7f324ce1e7562f7d168f685662682cfd4a399c7a8a3dbdf23eb7d2570a56c51ae", "sequence": 4294967295}, {"index": 29, "script": "22002043ac4c9da701d82150200dcf5b58c187042aed74bddf97024808b138a757d99a", "prev_out": {"addr": "3Akyf6bcFFFHFRJ2kvrbqD32WKJro6CvX9", "script": "a9146378e77167d273c3b592e43021573f58c52deb8b87", "tx_index": 8314188688386386, "value": 45994, "spent": true, "spending_outpoints": [{"tx_index": 4975090293678843, "n": 29}], "n": 109, "type": 0}, "witness": "03004730440220280bb0919c5e922b18d0de98cc997f35195ff95b7ae0b81ae99e5b82285406690220494892d235e3a826382778db2bb478210c044dd9e05e640c1f046af436a5933001255121036d815a2aa73d4642c70245536fddbcfa905096737aee7719c0de2f4ed994025051ae", "sequence": 4294967295}, {"index": 30, "script": "220020ce50479ba6662fe6fe86691ede4b9df67a7d1e255b8e6ae0f5c8b8c130b144e9", "prev_out": {"addr": "3BKPqZALpH7VR4fvYgPRZqVnKsXNwDQNfR", "script": "a914699a664970c4eaca0831027246aa6144ce4d2f9e87", "tx_index": 8314188688386386, "value": 55494, "spent": true, "spending_outpoints": [{"tx_index": 4975090293678843, "n": 30}], "n": 136, "type": 0}, "witness": "03004730440220247e16cddd45281a6fe39f68b7d58f0a9edb808f3cdfef94b751a99b0798069802202641459c631b0db069889c7c0616b6cdbdbbd05a368ddc445cd10767ed64fc7f0125512103d5dd234e94bc724a21bc54315fd666b4b8cd611050eac2553cf95104a286f97f51ae", "sequence": 4294967295}], "lock_time": 0, "fee": 42694, "ver": 1, "weight": 13672, "tx_index": 4975090293678843, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 31, "vout_sz": 5, "time": 1636406665, "hash": "fe958df37b69194476545746c08f03c872389fa1c2bfa28a2fd91771cd8b668d", "double_spend": false, "out": [{"addr": "bc1qa2macar5typv9zuhx2lcz9qlpycwaxwtj4x2mwves5pt0huakezq3zsn5x", "script": "0020eab7dc74745902c28b9732bf81141f0930ee99cb954cadb9998502b7df9db644", "tx_index": 4975090293678843, "spending_outpoints": [], "spent": false, "value": 14019, "n": 0, "type": 0}, {"addr": "bc1qtczfa9jhvnz00rea59kfpy67klcduavr206s3z", "script": "00145e049e965764c4f78f3da16c90935eb7f0de7583", "tx_index": 4975090293678843, "spending_outpoints": [], "spent": false, "value": 67160, "n": 1, "type": 0}, {"addr": "394VMjFjkV3iufWPYE9tnpi3Gqhrf5L9oY", "script": "a91450d88441d34dff9ede462a97cb19d5715d52cba687", "tx_index": 4975090293678843, "spending_outpoints": [], "spent": false, "value": 110818, "n": 2, "type": 0}, {"addr": "39hzB4DJQn4thtMwUD5BFAGFyd3NQGNkAV", "script": "a91457eff62a69aa56ae759790f819b111c01958fc5487", "tx_index": 4975090293678843, "spending_outpoints": [], "spent": false, "value": 333313, "n": 3, "type": 0}, {"addr": "bc1qdkt96arx9tlhfwsep48txa7382sur6ld4wpk0gcfyqvg8annzcvsmdeqak", "script": "00206d965d74662aff74ba190d4eb377d13aa1c1ebedab8367a309201883f6731619", "tx_index": 4975090293678843, "spending_outpoints": [], "spent": false, "value": 3610000, "n": 4, "type": 0}], "size": 6031} +{"inputs": [{"index": 0, "script": "483045022100df3810d9a5087cd80961b584daa4058ec996d22a8e328b445a5cf877417914d1022045caf9fb9ae66f0bdcd4b58caa249c3eda2f16b39b8a8328ee4ecc84fb29d5a20121021c09f9e62673d7e710eee4ace007cd16f06af2577d9ccd8ba66efb54ed236a8a", "prev_out": {"addr": "122KkpncnHhenbHg2FBERjdtZFQDt1CQqD", "script": "76a9140b3832b7ef3b51b11fe6f8025c7ddfffcd64eecc88ac", "tx_index": 4049912259546813, "value": 1294474, "spent": true, "spending_outpoints": [{"tx_index": 3467530916498381, "n": 0}], "n": 0, "type": 0}, "witness": "", "sequence": 4294967295}], "lock_time": 0, "fee": 3588, "ver": 2, "weight": 760, "tx_index": 3467530916498381, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 1, "time": 1636406665, "hash": "1a4b2d88e5b2a0588ee03895a7b718c09dd7c8c16d016f800e6b5e34a49b8d62", "double_spend": false, "out": [{"addr": "3EbfMmsqrL87KstoLYnX9Mwdy4b2WykaY1", "script": "a9148d96637ae7fd775e8cd938071850c09e09d3a25287", "tx_index": 3467530916498381, "spending_outpoints": [], "spent": false, "value": 1290886, "n": 0, "type": 0}], "size": 190} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qwklhepndyr4y8c0k5yq5rttrgw3y4cuu9mf2q3", "script": "001475bf7c866d20ea43e1f6a10141ad6343a24ae39c", "tx_index": 4466052845830699, "value": 3331565, "spent": true, "spending_outpoints": [{"tx_index": 1246015209249282, "n": 0}], "n": 6, "type": 0}, "witness": "02483045022100f1df20e7377f5067d1cb7354f6e687fc9f040366589583c15f93e2a8bff74f330220300e0c0310c8e34bb69c0a8fdfdc669abcc79813b8409cb63c4d2c104ff78b1901210279133d72083660b974fad60f034a4d2bf93dd501abc8953245e2335ac65e7261", "sequence": 4294967293}], "lock_time": 0, "fee": 137, "ver": 1, "weight": 450, "rbf": true, "tx_index": 1246015209249282, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 1, "time": 1636406665, "hash": "284d553cd415b218bc0d9095a1870341ca8a33137a3dc4f39a15d0742ff46923", "double_spend": false, "out": [{"addr": "1Gmiqnd39mHWoLXmdbJtK1kftE3yGVchUh", "script": "76a914acff1dc6465f7015d9a1c7cd5e116fb85ffaddd788ac", "tx_index": 1246015209249282, "spending_outpoints": [], "spent": false, "value": 3331428, "n": 0, "type": 0}], "size": 195} +{"inputs": [{"index": 0, "script": "4730440220753c5f466a879dc385c15c5f91de3f534474d2f5c03ad3a3d0c2bc78fe94324902202181a63dc88c11525b6d03a6b04e57d8accc8fb3f4e046295126e3ce5dcad57f0121034fa9b5216445203c6f13eb5235ac0c8e8586390903875c1a2c3c0fa796c9d264", "prev_out": {"addr": "184AxFAXXeKyDqdm7bdnd45dQSRCTZ6tvP", "script": "76a9144d626fb0a4067790eb32628e13ec925269a6b8ff88ac", "tx_index": 3075610536567571, "value": 1761006, "spent": true, "spending_outpoints": [{"tx_index": 8536831366526581, "n": 0}], "n": 0, "type": 0}, "witness": "", "sequence": 4294967295}], "lock_time": 0, "fee": 1589, "ver": 1, "weight": 900, "tx_index": 8536831366526581, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 2, "time": 1636406664, "hash": "37a76d1840dab2e8850e1b33c09fdca4f6d2999307ab6c37b1a9b3df889fa1f2", "double_spend": false, "out": [{"addr": "1Pz1YvvVHfK6fF6UvtMxwKk8JjhoLJjR3y", "script": "76a914fc1aefc5a108e7bb25785f2b85a4bb5e505d33c088ac", "tx_index": 8536831366526581, "spending_outpoints": [], "spent": false, "value": 391820, "n": 0, "type": 0}, {"addr": "1EyUbaxkmsSMLyJUpt9EM8z2o2oo4HPsjW", "script": "76a9149947f71cc04f951468790e3c4b599ac28a9f488a88ac", "tx_index": 8536831366526581, "spending_outpoints": [], "spent": false, "value": 1367597, "n": 1, "type": 0}], "size": 225} +{"inputs": [{"index": 0, "script": "", "prev_out": {"addr": "bc1qwfgdjyy95aay2686fn74h6a4nu9eev6np7q4fn204dkj3274frlqrskvx0", "script": "00207250d91085a77a4568fa4cfd5bebb59f0b9cb3530f8154cd4fab6d28abd548fe", "tx_index": 6652334005111816, "value": 128047669, "spent": true, "spending_outpoints": [{"tx_index": 2043666895665144, "n": 0}], "n": 1, "type": 0}, "witness": "0400483045022100fd201fd65f56662d0b28fe0045576ec8941cb15714659c160b68d70f5d03cbcf02205c0198ad17021cbcaa8ca329b4a7775bb6ecbea7f23438c66daa6f14149468240147304402200d9a2876a6a3f95c872fc205ad48888e57b422a69b0f8021e1720d582b3bb9c102203f6aab3218a9a9cc6dc86686b8944dd4d24d1107407c76c5ae00cdf1f9db5a2e01695221030fac04165b606dea3b8f81ada5eb66ca181d5215c873fcf46623ea7cf8e98b1b2102b7836a2a9d3ff095415383cb23a5f4f1badd75e44adb17537962eafe3ded3b602102f8cb472df1ae03cfa6b65b013add7862c7d3ac3684a8a92a44192faace228aee53ae", "sequence": 4294967295}], "lock_time": 0, "fee": 2700, "ver": 1, "weight": 903, "tx_index": 2043666895665144, "relayed_by": "0.0.0.0", "block_height": null, "block_index": null, "vin_sz": 1, "vout_sz": 3, "time": 1636406664, "hash": "25ae12836f28ffc3b03c18331823fccd9dcd3765f50eae7bf8c7bfd73aa2153a", "double_spend": false, "out": [{"addr": "1GUGdgevQPh7KWHRii6MPLzZi6bHCA8ixE", "script": "76a914a9b22ac470233c6e881490dd22017bf68f91cae688ac", "tx_index": 2043666895665144, "spending_outpoints": [], "spent": false, "value": 29448, "n": 0, "type": 0}, {"addr": "1CyHD4i3CrdFqYTt71eFsoKGpstE3hxsdL", "script": "76a914834e350d8793e485843d208f6bb52ccba0cf3f4988ac", "tx_index": 2043666895665144, "spending_outpoints": [], "spent": false, "value": 55675, "n": 1, "type": 0}, {"addr": "bc1qel7tps3wu6zqztaanczvt76hffwh7k06jd8r9xh2v3ztpa5ty5dsz358ys", "script": "0020cffcb0c22ee684012fbd9e04c5fb574a5d7f59fa934e329aea6444b0f68b251b", "tx_index": 2043666895665144, "spending_outpoints": [], "spent": false, "value": 127959846, "n": 2, "type": 0}], "size": 417} diff --git a/regression-test/data/dynamic_table/dynamic_bigint_contact_phone.json b/regression-test/data/dynamic_table/dynamic_bigint_contact_phone.json new file mode 100644 index 00000000000000..35da2fd2304b9d --- /dev/null +++ b/regression-test/data/dynamic_table/dynamic_bigint_contact_phone.json @@ -0,0 +1,4 @@ +{"name":"name1", "age": 25, "name2": "xxx","contact": {"phone": 13966668888, "address": "address1"}} +{"name":"name2", "age": 30, "contact": {"phone": 13966668886}} +{"name":"name3", "age": 25, "name2": "xxx","contact": {"phone": 13966668889, "address": "address3", "fax": 12345}} +{"name":"name4", "age": 25, "contact": {"phone": 13966668880, "address": "address4"}} diff --git a/regression-test/data/dynamic_table/dynamic_date_birthday.json b/regression-test/data/dynamic_table/dynamic_date_birthday.json new file mode 100644 index 00000000000000..231771fdcbd5ca --- /dev/null +++ b/regression-test/data/dynamic_table/dynamic_date_birthday.json @@ -0,0 +1,4 @@ +{"name":"name1", "age": 25, "name2": "xxx","contact": {"birthday": "1993-05-09", "address": "address1"}} +{"name":"name2", "age": 30, "contact": {"birthday": "2000-05-09"}} +{"name":"name3", "age": 25, "name2": "xxx","contact": {"birthday": "1999-12-01", "address": "address3", "fax": 12345}} +{"name":"name4", "age": 25, "contact": {"birthday": "1997-06-06", "address": "address4"}} \ No newline at end of file diff --git a/regression-test/data/dynamic_table/dynamic_feishu_alarm.json b/regression-test/data/dynamic_table/dynamic_feishu_alarm.json new file mode 100644 index 00000000000000..ed8cee0199b4fb --- /dev/null +++ b/regression-test/data/dynamic_table/dynamic_feishu_alarm.json @@ -0,0 +1,116 @@ +{"msg_type":"post","content":{"post":{"zh_cn": {"title":"teamcity publisher","content":[[{"tag": "text", "text": "BUILD_STARTED"},{"tag": "text", "text":"801"},{"tag":"text","text":"IncubatorDoris_IncubatorDorisBeUt_BeUt"},{"tag":"text","text":"16"},{"tag":"a","herf":"http://43.129.232.36:8111/viewType.html?buildTypeId=IncubatorDoris_IncubatorDorisBeUt_BeUt","text":"teamcity"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_SelectdbStable_AsanRegression_Asan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3313&buildTypeId=RegressionDoris_SelectdbStable_AsanRegression_Asan"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3403&buildTypeId=RegressionDoris_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3406&buildTypeId=RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_SelectdbStable_AsanRegression_Asan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3409&buildTypeId=RegressionDoris_SelectdbStable_AsanRegression_Asan"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_SelectdbStable_AsanRegression_Asan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3411&buildTypeId=RegressionDoris_SelectdbStable_AsanRegression_Asan"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_SelectdbStable_AsanRegression_Asan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3413&buildTypeId=RegressionDoris_SelectdbStable_AsanRegression_Asan"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3407&buildTypeId=RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_SelectdbStable_AsanRegression_Asan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3415&buildTypeId=RegressionDoris_SelectdbStable_AsanRegression_Asan"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_SelectdbStable_AsanRegression_Asan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3419&buildTypeId=RegressionDoris_SelectdbStable_AsanRegression_Asan"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3420&buildTypeId=RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3423&buildTypeId=RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3424&buildTypeId=RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3435&buildTypeId=RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_DorisMaster_MasterTestCompile_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3438&buildTypeId=RegressionDoris_DorisMaster_MasterTestCompile_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3436&buildTypeId=RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3437&buildTypeId=RegressionDoris_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_SelectdbStable_AsanRegression_Asan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3440&buildTypeId=RegressionDoris_SelectdbStable_AsanRegression_Asan"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_DorisMaster_MasterVecAsanRegression_VecAsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3450&buildTypeId=RegressionDoris_DorisMaster_MasterVecAsanRegression_VecAsan"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3446&buildTypeId=RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3451&buildTypeId=RegressionDoris_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_SelectdbStable_AsanRegression_Asan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3453&buildTypeId=RegressionDoris_SelectdbStable_AsanRegression_Asan"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3456&buildTypeId=RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3457&buildTypeId=RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_DorisMaster_MasterTestCompile_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3459&buildTypeId=RegressionDoris_DorisMaster_MasterTestCompile_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_DorisMaster_MasterTestCompile_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3460&buildTypeId=RegressionDoris_DorisMaster_MasterTestCompile_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_DorisMaster_MasterTestCompile_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3461&buildTypeId=RegressionDoris_DorisMaster_MasterTestCompile_CompileAndUpdate"},{"tag":"text","text":"triggerman: chengyuxuan\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_DorisMaster_MasterTestCompile_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3462&buildTypeId=RegressionDoris_DorisMaster_MasterTestCompile_CompileAndUpdate"},{"tag":"text","text":"triggerman: chengyuxuan\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3458&buildTypeId=RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3464&buildTypeId=RegressionDoris_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: chengyuxuan\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3467&buildTypeId=RegressionDoris_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: chengyuxuan\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_DorisMaster_MasterTestCompile_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3468&buildTypeId=RegressionDoris_DorisMaster_MasterTestCompile_CompileAndUpdate"},{"tag":"text","text":"triggerman: chengyuxuan\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3466&buildTypeId=RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: chengyuxuan\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3469&buildTypeId=RegressionDoris_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3470&buildTypeId=RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan"},{"tag":"text","text":"triggerman: chengyuxuan\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_DorisMaster_MasterTestCompile_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3474&buildTypeId=RegressionDoris_DorisMaster_MasterTestCompile_CompileAndUpdate"},{"tag":"text","text":"triggerman: chengyuxuan\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3473&buildTypeId=RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: chengyuxuan\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3476&buildTypeId=RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan"},{"tag":"text","text":"triggerman: chengyuxuan\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_DorisMaster_MasterTestCompile_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3478&buildTypeId=RegressionDoris_DorisMaster_MasterTestCompile_CompileAndUpdate"},{"tag":"text","text":"triggerman: chengyuxuan\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_SelectdbStable_AsanRegression_Asan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3480&buildTypeId=RegressionDoris_SelectdbStable_AsanRegression_Asan"},{"tag":"text","text":"triggerman: chengyuxuan\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3482&buildTypeId=RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3483&buildTypeId=RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3484&buildTypeId=RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3485&buildTypeId=RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3486&buildTypeId=RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3487&buildTypeId=RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_VecUbsanRegression_VecUbsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3489&buildTypeId=RegressionDoris_Selectdb101_VecUbsanRegression_VecUbsan"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3490&buildTypeId=RegressionDoris_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_DorisMaster_MasterVecAsanRegression_VecAsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3481&buildTypeId=RegressionDoris_DorisMaster_MasterVecAsanRegression_VecAsan"},{"tag":"text","text":"triggerman: chengyuxuan\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_DorisMaster_MasterTestCompile_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3493&buildTypeId=RegressionDoris_DorisMaster_MasterTestCompile_CompileAndUpdate"},{"tag":"text","text":"triggerman: chengyuxuan\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3492&buildTypeId=RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan"},{"tag":"text","text":"triggerman: chengyuxuan\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_SelectdbStable_AsanRegression_Asan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3491&buildTypeId=RegressionDoris_SelectdbStable_AsanRegression_Asan"},{"tag":"text","text":"triggerman: chengyuxuan\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3495&buildTypeId=RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3496&buildTypeId=RegressionDoris_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_DorisMaster_MasterVecAsanRegression_VecAsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3494&buildTypeId=RegressionDoris_DorisMaster_MasterVecAsanRegression_VecAsan"},{"tag":"text","text":"triggerman: chengyuxuan\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_DorisMaster_MasterTestCompile_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3497&buildTypeId=RegressionDoris_DorisMaster_MasterTestCompile_CompileAndUpdate"},{"tag":"text","text":"triggerman: gavin\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3500&buildTypeId=RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: gavin\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_VecReleaseRegression_VecRelease\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3504&buildTypeId=RegressionDoris_Selectdb101_VecReleaseRegression_VecRelease"},{"tag":"text","text":"triggerman: gavin\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_VecUbsanRegression_VecUbsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3502&buildTypeId=RegressionDoris_Selectdb101_VecUbsanRegression_VecUbsan"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3503&buildTypeId=RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan"},{"tag":"text","text":"triggerman: gavin\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_DorisMaster_VecUbsanRegression_VecUbsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3510&buildTypeId=RegressionDoris_DorisMaster_VecUbsanRegression_VecUbsan"},{"tag":"text","text":"triggerman: zhangchunping\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_DorisMaster_VecUbsanRegression_VecUbsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3512&buildTypeId=RegressionDoris_DorisMaster_VecUbsanRegression_VecUbsan"},{"tag":"text","text":"triggerman: zhangchunping\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_DorisMaster_VecUbsanRegression_VecUbsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3514&buildTypeId=RegressionDoris_DorisMaster_VecUbsanRegression_VecUbsan"},{"tag":"text","text":"triggerman: zhangchunping\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_DorisMaster_VecUbsanRegression_VecUbsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3516&buildTypeId=RegressionDoris_DorisMaster_VecUbsanRegression_VecUbsan"},{"tag":"text","text":"triggerman: zhangchunping\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_DorisMaster_MasterVecAsanRegression_VecAsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3520&buildTypeId=RegressionDoris_DorisMaster_MasterVecAsanRegression_VecAsan"},{"tag":"text","text":"triggerman: flywheelsadmin\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3521&buildTypeId=RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan"},{"tag":"text","text":"triggerman: gavin\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3522&buildTypeId=RegressionDoris_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3523&buildTypeId=RegressionDoris_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_DorisMaster_MasterTestCompile_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3527&buildTypeId=RegressionDoris_DorisMaster_MasterTestCompile_CompileAndUpdate"},{"tag":"text","text":"triggerman: gavin\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_VecUbsanRegression_VecUbsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3525&buildTypeId=RegressionDoris_Selectdb101_VecUbsanRegression_VecUbsan"},{"tag":"text","text":"triggerman: gavin\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3528&buildTypeId=RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: gavin\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_SelectdbStable_AsanRegression_Asan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3529&buildTypeId=RegressionDoris_SelectdbStable_AsanRegression_Asan"},{"tag":"text","text":"triggerman: gavin\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_VecUbsanRegression_VecUbsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3530&buildTypeId=RegressionDoris_Selectdb101_VecUbsanRegression_VecUbsan"},{"tag":"text","text":"triggerman: gavin\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3531&buildTypeId=RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3534&buildTypeId=RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan"},{"tag":"text","text":"triggerman: gavin\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3535&buildTypeId=RegressionDoris_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_DorisMaster_MasterTestCompile_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3536&buildTypeId=RegressionDoris_DorisMaster_MasterTestCompile_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_SelectdbStable_AsanRegression_Asan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3538&buildTypeId=RegressionDoris_SelectdbStable_AsanRegression_Asan"},{"tag":"text","text":"triggerman: gavin\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_DorisMaster_VecUbsanRegression_VecUbsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3540&buildTypeId=RegressionDoris_DorisMaster_VecUbsanRegression_VecUbsan"},{"tag":"text","text":"triggerman: flywheelsadmin\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_DorisMaster_MasterVecAsanRegression_VecAsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3543&buildTypeId=RegressionDoris_DorisMaster_MasterVecAsanRegression_VecAsan"},{"tag":"text","text":"triggerman: gavin\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_DorisMaster_MasterTestCompile_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3544&buildTypeId=RegressionDoris_DorisMaster_MasterTestCompile_CompileAndUpdate"},{"tag":"text","text":"triggerman: gavin\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3541&buildTypeId=RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: gavin\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3545&buildTypeId=RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_SelectdbStable_AsanRegression_Asan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3542&buildTypeId=RegressionDoris_SelectdbStable_AsanRegression_Asan"},{"tag":"text","text":"triggerman: gavin\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3546&buildTypeId=RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3547&buildTypeId=RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3548&buildTypeId=RegressionDoris_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: gavin\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3549&buildTypeId=RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan"},{"tag":"text","text":"triggerman: luwei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3550&buildTypeId=RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: luwei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3551&buildTypeId=RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan"},{"tag":"text","text":"triggerman: luwei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3552&buildTypeId=RegressionDoris_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: gavin\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3553&buildTypeId=RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan"},{"tag":"text","text":"triggerman: luwei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3554&buildTypeId=RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan"},{"tag":"text","text":"triggerman: luwei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3555&buildTypeId=RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan"},{"tag":"text","text":"triggerman: luwei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3556&buildTypeId=RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: luwei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3557&buildTypeId=RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: luwei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3558&buildTypeId=RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: luwei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3559&buildTypeId=RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: luwei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3560&buildTypeId=RegressionDoris_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: luwei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3562&buildTypeId=RegressionDoris_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: luwei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: SUCCESS\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3563&buildTypeId=RegressionDoris_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: luwei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3561&buildTypeId=RegressionDoris_Selectdb101_MasterVecAsanRegression_VecAsan"},{"tag":"text","text":"triggerman: luwei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8111\/viewLog.html?buildId=3565&buildTypeId=RegressionDoris_Selectdb101_TestCompileMaster_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhanglei\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: Selectdb_SelectdbSemiStructure_Compile_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8112\/viewLog.html?buildId=3676&buildTypeId=Selectdb_SelectdbSemiStructure_Compile_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhangchunping\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: Selectdb_SelectdbSemiStructure_VecUbsanRegression_VecUbsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8112\/viewLog.html?buildId=3679&buildTypeId=Selectdb_SelectdbSemiStructure_VecUbsanRegression_VecUbsan"},{"tag":"text","text":"triggerman: zhangchunping\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: Selectdb_SelectdbSemiStructure_VecAsanRegression_VecAsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8112\/viewLog.html?buildId=3677&buildTypeId=Selectdb_SelectdbSemiStructure_VecAsanRegression_VecAsan"},{"tag":"text","text":"triggerman: zhangchunping\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: Selectdb_SelectdbSemiStructure_VecAsanRegression_VecAsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8112\/viewLog.html?buildId=3681&buildTypeId=Selectdb_SelectdbSemiStructure_VecAsanRegression_VecAsan"},{"tag":"text","text":"triggerman: zhangchunping\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: Selectdb_SelectdbSemiStructure_VecUbsanRegression_VecUbsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8112\/viewLog.html?buildId=3680&buildTypeId=Selectdb_SelectdbSemiStructure_VecUbsanRegression_VecUbsan"},{"tag":"text","text":"triggerman: zhangchunping\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: Selectdb_SelectdbSemiStructure_Compile_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8112\/viewLog.html?buildId=3682&buildTypeId=Selectdb_SelectdbSemiStructure_Compile_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhangchunping\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: Selectdb_SelectdbSemiStructure_Compile_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8112\/viewLog.html?buildId=3685&buildTypeId=Selectdb_SelectdbSemiStructure_Compile_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhangchunping\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: Selectdb_SelectdbSemiStructure_Compile_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8112\/viewLog.html?buildId=3686&buildTypeId=Selectdb_SelectdbSemiStructure_Compile_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhangchunping\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: Selectdb_SelectdbSemiStructure_VecAsanRegression_VecAsan\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8112\/viewLog.html?buildId=3691&buildTypeId=Selectdb_SelectdbSemiStructure_VecAsanRegression_VecAsan"},{"tag":"text","text":"triggerman: zhangchunping\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: Selectdb_SelectdbSemiStructure_Compile_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8112\/viewLog.html?buildId=3693&buildTypeId=Selectdb_SelectdbSemiStructure_Compile_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhangchunping\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: Selectdb_SelectdbSemiStructure_Compile_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8112\/viewLog.html?buildId=3694&buildTypeId=Selectdb_SelectdbSemiStructure_Compile_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhangchunping\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: Selectdb_SelectdbSemiStructure_Compile_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8112\/viewLog.html?buildId=3695&buildTypeId=Selectdb_SelectdbSemiStructure_Compile_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhangchunping\n"}]]}}}} +{"msg_type":"post","content":{"post":{"zh_cn":{"title":"BUILD_FINISHED","content":[[{"tag":"text","text":"status: FAILURE\n"},{"tag":"text","text":"state: finished\n"},{"tag":"text","text":"project: Selectdb_SelectdbSemiStructure_Compile_CompileAndUpdate\n"},{"tag":"text","text":"U can click: "},{"tag":"a","text":"teamcity url \n","href":"http:\/\/152.136.199.195:8112\/viewLog.html?buildId=3696&buildTypeId=Selectdb_SelectdbSemiStructure_Compile_CompileAndUpdate"},{"tag":"text","text":"triggerman: zhangchunping\n"}]]}}}} diff --git a/regression-test/data/dynamic_table/dynamic_github_events.json b/regression-test/data/dynamic_table/dynamic_github_events.json new file mode 100644 index 00000000000000..665622bdec8e84 --- /dev/null +++ b/regression-test/data/dynamic_table/dynamic_github_events.json @@ -0,0 +1,13 @@ +{"type": "PushEvent", "actor": {"avatar_url": "https://avatars.githubusercontent.com/u/93110249?", "display_login": "Lakshmipatil2021", "id": 93110249, "login": "Lakshmipatil2021", "url": "https://api.github.com/users/Lakshmipatil2021"}, "repo": {"id": 429298592, "name": "revacprogramming/pps-test1-Lakshmipatil2021", "url": "https://api.github.com/repos/revacprogramming/pps-test1-Lakshmipatil2021"}, "created_at": "2022-01-04T07:00:00Z", "payload": {"pull_request": {"updated_at": "", "user": {"login": ""}, "number": 0, "title": "", "state": "", "author_association": "", "head": {"ref": "", "sha": ""}, "base": {"ref": "", "sha": ""}}, "action": "", "ref": "refs/heads/main", "ref_type": "", "size": 1, "distinct_size": 1}} +{"type": "MemberEvent", "actor": {"avatar_url": "https://avatars.githubusercontent.com/u/95751520?", "display_login": "KStevenT", "id": 95751520, "login": "KStevenT", "url": "https://api.github.com/users/KStevenT"}, "repo": {"id": 443103546, "name": "KStevenT/HTML_ExternalWorkshop", "url": "https://api.github.com/repos/KStevenT/HTML_ExternalWorkshop"}, "created_at": "2022-01-04T07:00:00Z", "payload": {"pull_request": {"updated_at": "", "user": {"login": ""}, "number": 0, "title": "", "state": "", "author_association": "", "head": {"ref": "", "sha": ""}, "base": {"ref": "", "sha": ""}}, "action": "added", "ref": "", "ref_type": "", "size": 0, "distinct_size": 0}} +{"type": "PushEvent", "actor": {"avatar_url": "https://avatars.githubusercontent.com/u/36798903?", "display_login": "Soumojit28", "id": 36798903, "login": "Soumojit28", "url": "https://api.github.com/users/Soumojit28"}, "repo": {"id": 444318240, "name": "Soumojit28/Oxytocin", "url": "https://api.github.com/repos/Soumojit28/Oxytocin"}, "created_at": "2022-01-04T07:00:00Z", "payload": {"pull_request": {"updated_at": "", "user": {"login": ""}, "number": 0, "title": "", "state": "", "author_association": "", "head": {"ref": "", "sha": ""}, "base": {"ref": "", "sha": ""}}, "action": "", "ref": "refs/heads/main", "ref_type": "", "size": 1, "distinct_size": 1}} +{"type": "PushEvent", "actor": {"avatar_url": "https://avatars.githubusercontent.com/u/41898282?", "display_login": "github-actions", "id": 41898282, "login": "github-actions[bot]", "url": "https://api.github.com/users/github-actions[bot]"}, "repo": {"id": 443434940, "name": "diogoaraujo017/diogoaraujo017", "url": "https://api.github.com/repos/diogoaraujo017/diogoaraujo017"}, "created_at": "2022-01-04T07:00:00Z", "payload": {"pull_request": {"updated_at": "", "user": {"login": ""}, "number": 0, "title": "", "state": "", "author_association": "", "head": {"ref": "", "sha": ""}, "base": {"ref": "", "sha": ""}}, "action": "", "ref": "refs/heads/output", "ref_type": "", "size": 1, "distinct_size": 1}} +{"type": "PushEvent", "actor": {"avatar_url": "https://avatars.githubusercontent.com/u/76250197?", "display_login": "Aman-Sonwani", "id": 76250197, "login": "Aman-Sonwani", "url": "https://api.github.com/users/Aman-Sonwani"}, "repo": {"id": 438308983, "name": "Aman-Sonwani/crwn-clothing", "url": "https://api.github.com/repos/Aman-Sonwani/crwn-clothing"}, "created_at": "2022-01-04T07:00:00Z", "payload": {"pull_request": {"updated_at": "", "user": {"login": ""}, "number": 0, "title": "", "state": "", "author_association": "", "head": {"ref": "", "sha": ""}, "base": {"ref": "", "sha": ""}}, "action": "", "ref": "refs/heads/master", "ref_type": "", "size": 1, "distinct_size": 1}} +{"type": "PushEvent", "actor": {"avatar_url": "https://avatars.githubusercontent.com/u/93110249?", "display_login": "Lakshmipatil2021", "id": 93110249, "login": "Lakshmipatil2021", "url": "https://api.github.com/users/Lakshmipatil2021"}, "repo": {"id": 429298592, "name": "revacprogramming/pps-test1-Lakshmipatil2021", "url": "https://api.github.com/repos/revacprogramming/pps-test1-Lakshmipatil2021"}, "created_at": "2022-01-04T07:00:00Z", "payload": {"pull_request": {"updated_at": "", "user": {"login": ""}, "number": 0, "title": "", "state": "", "author_association": "", "head": {"ref": "", "sha": ""}, "base": {"ref": "", "sha": ""}}, "action": "", "ref": "refs/heads/main", "ref_type": "", "size": 1, "distinct_size": 1}} +{"type": "MemberEvent", "actor": {"avatar_url": "https://avatars.githubusercontent.com/u/95751520?", "display_login": "KStevenT", "id": 95751520, "login": "KStevenT", "url": "https://api.github.com/users/KStevenT"}, "repo": {"id": 443103546, "name": "KStevenT/HTML_ExternalWorkshop", "url": "https://api.github.com/repos/KStevenT/HTML_ExternalWorkshop"}, "created_at": "2022-01-04T07:00:00Z", "payload": {"pull_request": {"updated_at": "", "user": {"login": ""}, "number": 0, "title": "", "state": "", "author_association": "", "head": {"ref": "", "sha": ""}, "base": {"ref": "", "sha": ""}}, "action": "added", "ref": "", "ref_type": "", "size": 0, "distinct_size": 0}} +{"type": "PushEvent", "actor": {"avatar_url": "https://avatars.githubusercontent.com/u/36798903?", "display_login": "Soumojit28", "id": 36798903, "login": "Soumojit28", "url": "https://api.github.com/users/Soumojit28"}, "repo": {"id": 444318240, "name": "Soumojit28/Oxytocin", "url": "https://api.github.com/repos/Soumojit28/Oxytocin"}, "created_at": "2022-01-04T07:00:00Z", "payload": {"pull_request": {"updated_at": "", "user": {"login": ""}, "number": 0, "title": "", "state": "", "author_association": "", "head": {"ref": "", "sha": ""}, "base": {"ref": "", "sha": ""}}, "action": "", "ref": "refs/heads/main", "ref_type": "", "size": 1, "distinct_size": 1}} +{"type": "PushEvent", "actor": {"avatar_url": "https://avatars.githubusercontent.com/u/41898282?", "display_login": "github-actions", "id": 41898282, "login": "github-actions[bot]", "url": "https://api.github.com/users/github-actions[bot]"}, "repo": {"id": 443434940, "name": "diogoaraujo017/diogoaraujo017", "url": "https://api.github.com/repos/diogoaraujo017/diogoaraujo017"}, "created_at": "2022-01-04T07:00:00Z", "payload": {"pull_request": {"updated_at": "", "user": {"login": ""}, "number": 0, "title": "", "state": "", "author_association": "", "head": {"ref": "", "sha": ""}, "base": {"ref": "", "sha": ""}}, "action": "", "ref": "refs/heads/output", "ref_type": "", "size": 1, "distinct_size": 1}} +{"type": "PushEvent", "actor": {"avatar_url": "https://avatars.githubusercontent.com/u/76250197?", "display_login": "Aman-Sonwani", "id": 76250197, "login": "Aman-Sonwani", "url": "https://api.github.com/users/Aman-Sonwani"}, "repo": {"id": 438308983, "name": "Aman-Sonwani/crwn-clothing", "url": "https://api.github.com/repos/Aman-Sonwani/crwn-clothing"}, "created_at": "2022-01-04T07:00:00Z", "payload": {"pull_request": {"updated_at": "", "user": {"login": ""}, "number": 0, "title": "", "state": "", "author_association": "", "head": {"ref": "", "sha": ""}, "base": {"ref": "", "sha": ""}}, "action": "", "ref": "refs/heads/master", "ref_type": "", "size": 1, "distinct_size": 1}} +{"type": "WatchEvent", "actor": {"avatar_url": "https://avatars.githubusercontent.com/u/36922874?", "display_login": "AcezukyRockon", "id": 36922874, "login": "AcezukyRockon", "url": "https://api.github.com/users/AcezukyRockon"}, "repo": {"id": 32921736, "name": "audacity/audacity", "url": "https://api.github.com/repos/audacity/audacity"}, "created_at": "2022-01-04T07:00:01Z", "payload": {"pull_request": {"updated_at": "", "user": {"login": ""}, "number": 0, "title": "", "state": "", "author_association": "", "head": {"ref": "", "sha": ""}, "base": {"ref": "", "sha": ""}}, "action": "started", "ref": "", "ref_type": "", "size": 0, "distinct_size": 0}} +{"type": "CreateEvent", "actor": {"avatar_url": "https://avatars.githubusercontent.com/u/97084193?", "display_login": "jwlee00", "id": 97084193, "login": "jwlee00", "url": "https://api.github.com/users/jwlee00"}, "repo": {"id": 444318272, "name": "jwlee00/web1", "url": "https://api.github.com/repos/jwlee00/web1"}, "created_at": "2022-01-04T07:00:03Z", "payload": {"pull_request": {"updated_at": "", "user": {"login": ""}, "number": 0, "title": "", "state": "", "author_association": "", "head": {"ref": "", "sha": ""}, "base": {"ref": "", "sha": ""}}, "action": "", "ref": "main", "ref_type": "branch", "size": 0, "distinct_size": 0}} +{"type": "IssueCommentEvent", "actor": {"avatar_url": "https://avatars.githubusercontent.com/u/37936606?", "display_login": "github-learning-lab", "id": 37936606, "login": "github-learning-lab[bot]", "url": "https://api.github.com/users/github-learning-lab[bot]"}, "repo": {"id": 444316209, "name": "sanjaycod/merge-conflicts", "url": "https://api.github.com/repos/sanjaycod/merge-conflicts"}, "created_at": "2022-01-04T07:00:03Z", "payload": {"pull_request": {"updated_at": "", "user": {"login": ""}, "number": 0, "title": "", "state": "", "author_association": "", "head": {"ref": "", "sha": ""}, "base": {"ref": "", "sha": ""}}, "action": "created", "ref": "", "ref_type": "", "size": 0, "distinct_size": 0}} \ No newline at end of file diff --git a/regression-test/data/dynamic_table/dynamic_simple_type_confiic_data.json b/regression-test/data/dynamic_table/dynamic_simple_type_confiic_data.json new file mode 100644 index 00000000000000..62b8bd7aacaeea --- /dev/null +++ b/regression-test/data/dynamic_table/dynamic_simple_type_confiic_data.json @@ -0,0 +1,4 @@ +{"name":"name1", "age": 25, "name2": "xxx","contact": {"phone": 13966668888, "address": "address1"}} +{"name":"name2", "age": 30, "contact": {"phone": 13966668886}} +{"name":"name3", "age": 25, "name2": "xxx","contact": {"phone": 13966668889, "address": "address3", "fax": 12345}} +{"name":"name4", "age": 25, "contact": {"phone": "type conflic", "address": "address4"}} \ No newline at end of file diff --git a/regression-test/data/dynamic_table/dynamic_simple_type_conflic_data.json b/regression-test/data/dynamic_table/dynamic_simple_type_conflic_data.json new file mode 100644 index 00000000000000..b2d70210908de2 --- /dev/null +++ b/regression-test/data/dynamic_table/dynamic_simple_type_conflic_data.json @@ -0,0 +1,4 @@ +{"name":"name1", "age": 25, "name2": "xxx","contact": {"phone": 13966668888, "address": "address1"}} +{"name":"name2", "age": 30, "contact": {"phone": 13966668886}} +{"name":"name3", "age": 25, "name2": "xxx","contact": {"phone": 13966668889, "address": "address3", "fax": 12345}} +{"name":"name4", "age": 25, "contact": {"phone": "conflic data", "address": "address4"}} \ No newline at end of file diff --git a/regression-test/data/dynamic_table/dynamic_string_birthday.json b/regression-test/data/dynamic_table/dynamic_string_birthday.json new file mode 100644 index 00000000000000..e9941bf0292763 --- /dev/null +++ b/regression-test/data/dynamic_table/dynamic_string_birthday.json @@ -0,0 +1,4 @@ +{"name":"name1", "age": 25, "name2": "xxx","contact": {"birthday": "1993-05-09", "address": "address1"}} +{"name":"name2", "age": 30, "contact": {"birthday": "2000-05-09"}} +{"name":"name3", "age": 25, "name2": "xxx","contact": {"birthday": "1999-12-01", "address": "address3", "fax": 12345}} +{"name":"name4", "age": 25, "contact": {"birthday": "1997-06-06", "address": "address4"}} diff --git a/regression-test/data/dynamic_table/dynamic_string_contact_phone.json b/regression-test/data/dynamic_table/dynamic_string_contact_phone.json new file mode 100644 index 00000000000000..f7132e2a7e58da --- /dev/null +++ b/regression-test/data/dynamic_table/dynamic_string_contact_phone.json @@ -0,0 +1,4 @@ +{"name":"name11", "age": 25, "name2": "xxx","contact": {"phone": "13966668888", "address": "address1"}} +{"name":"name21", "age": 30, "contact": {"phone": "13966668886"}} +{"name":"name31", "age": 25, "name2": "xxx","contact": {"phone": "13966668889", "address": "address3", "fax": 12345}} +{"name":"name41", "age": 25, "contact": {"phone": "13966668880", "address": "address4"}} \ No newline at end of file diff --git a/regression-test/data/dynamic_table/dynamic_timestamp_birthday.json b/regression-test/data/dynamic_table/dynamic_timestamp_birthday.json new file mode 100644 index 00000000000000..75d00cf7ef2bc6 --- /dev/null +++ b/regression-test/data/dynamic_table/dynamic_timestamp_birthday.json @@ -0,0 +1,4 @@ +{"name":"name5", "age": 25, "name2": "xxx","contact": {"birthday": 736920330, "address": "address1"}} +{"name":"name6", "age": 30, "contact": {"birthday": 957845130}} +{"name":"name7", "age": 25, "name2": "xxx","contact": {"birthday": 944021130, "address": "address3", "fax": 12345}} +{"name":"name8", "age": 25, "contact": {"birthday": 865569930, "address": "address4"}} \ No newline at end of file diff --git a/regression-test/data/dynamic_table/es_nested.json b/regression-test/data/dynamic_table/es_nested.json new file mode 100644 index 00000000000000..b810bd9087fd7d --- /dev/null +++ b/regression-test/data/dynamic_table/es_nested.json @@ -0,0 +1,1015 @@ +{"title": "Display Progress Bar at the Time of Processing", "qid": "1000000", "answers": [{"date": "2009-06-16T09:55:57.320", "user": "Micha\u0142 Niklas (22595)"}, {"date": "2009-06-17T12:34:22.643", "user": "Jack Njiri (77153)"}], "tag": ["vb6", "progress-bar"], "user": "Jash", "creationDate": "2009-06-16T07:28:42.770"} +{"title": "PHP Sort array by field?", "qid": "10000005", "answers": [{"date": "2012-04-03T19:28:39.140", "user": "meagar (229044)"}], "tag": ["php", "arrays", "sorting"], "user": "Michael Ecklund (804104)", "creationDate": "2012-04-03T19:25:46.213"} +{"title": "Arrays in PHP seems to drop elements", "qid": "10000007", "answers": [{"date": "2012-04-03T19:34:49.030", "user": "Jaros\u0142aw Gomu\u0142ka (1256609)"}, {"date": "2012-04-03T19:36:06.097", "user": "RyanS (1310604)"}], "tag": ["php", "arrays"], "user": "farley (1311218)", "creationDate": "2012-04-03T19:26:05.400"} +{"title": "RESTful servlet URLs - servlet-mapping in web.xml", "qid": "10000008", "answers": [{"date": "2012-04-03T19:44:28.383", "user": "matsev (303598)"}], "tag": ["java", "rest", "servlets", "spring-mvc", "url-pattern"], "user": "John Strickler (292614)", "creationDate": "2012-04-03T19:26:09.137"} +{"title": "Descriptor conversion problem", "qid": "1000001", "answers": [{"date": "2009-06-16T07:39:12.020", "user": "laalto (101361)"}, {"date": "2009-06-16T07:50:54.450", "user": "anon"}, {"date": "2009-08-04T12:54:42.657", "user": "frankster (147813)"}], "tag": ["c++", "symbian"], "user": "rahulm (123536)", "creationDate": "2009-06-16T07:28:52.333"} +{"title": "How to De-Authenticate a Windows Auth user with PHP", "qid": "10000014", "answers": [{"date": "2012-04-11T06:02:38.890", "user": "Rob Allen (23060)"}], "tag": ["php", "windows", "iis-7", "windows-authentication"], "user": "Neal (561731)", "creationDate": "2012-04-03T19:26:28.813"} +{"title": "Are arrays in MongoDB documents always kept in order?", "qid": "10000019", "answers": [{"date": "2012-04-03T19:30:25.147", "user": "Blacksad (820664)"}], "tag": ["mongodb"], "user": "Adam Monsen (156060)", "creationDate": "2012-04-03T19:26:50.907"} +{"title": "What is SEGV_MAPERR?", "qid": "1000002", "answers": [{"date": "2009-06-16T07:33:12.713", "user": "Sev (83819)"}, {"date": "2015-01-23T18:36:18.230", "user": "ahcox (506073)"}], "tag": ["core", "coredump"], "user": "Geek (102040)", "creationDate": "2009-06-16T07:29:24.343"} +{"title": "AJAX post to google spreadsheet", "qid": "10000020", "answers": [{"date": "2012-04-04T16:00:38.320", "user": "Stuart Nelson (1227292)"}, {"date": "2014-07-06T09:00:37.170", "user": "mhawksey (1027723)"}], "tag": ["jquery", "google-apps-script"], "user": "Stuart Nelson (1227292)", "creationDate": "2012-04-03T19:26:51.433"} +{"title": "Are these LAMP permissions secure?", "qid": "10000023", "answers": [{"date": "2012-04-04T12:56:34.433", "user": "larsks (147356)"}], "tag": ["linux", "apache", "security", "ubuntu", "permissions"], "user": "Trent Scott (600873)", "creationDate": "2012-04-03T19:26:57.033"} +{"title": "Handlebars EACH iterator error", "qid": "10000024", "answers": [{"date": "2012-04-11T09:33:37.620", "user": "joevallender (426171)"}], "tag": ["javascript", "handlebars.js"], "user": "CoryDorning (322551)", "creationDate": "2012-04-03T19:26:57.520"} +{"title": "Is there a way to set a MKMapView map to an alpha lower to 1 and its markers to 1?", "qid": "10000030", "answers": [], "tag": ["ios", "mkmapview", "mkannotationview"], "user": "annie (591510)", "creationDate": "2012-04-03T19:27:30.390"} +{"title": "How to perform 500 identical assignments in Visual Studio\u2019s Immediate window?", "qid": "10000031", "answers": [{"date": "2012-04-03T19:35:29.543", "user": "Doc Brown (220984)"}], "tag": ["visual-studio-2010"], "user": "romkyns (33080)", "creationDate": "2012-04-03T19:27:37.830"} +{"title": "Slide table right/left with jQuery", "qid": "10000033", "answers": [{"date": "2012-04-03T21:06:06.747", "user": "Kris Krause (139547)"}, {"date": "2012-04-11T10:10:16.387", "user": "rekire (995926)"}], "tag": ["jquery", "table", "slide"], "user": "rekire (995926)", "creationDate": "2012-04-03T19:27:46.377"} +{"title": "Problems with class loading during deserialization of type from another assembly", "qid": "1000004", "answers": [{"date": "2009-06-17T03:44:55.057", "user": "Dmitriy Matveev (53481)"}], "tag": ["java", ".net", "serialization", "ikvm"], "user": "Dmitriy Matveev (53481)", "creationDate": "2009-06-16T07:30:22.533"} +{"title": "How to close a tab when a form embedded in it closed?", "qid": "10000045", "answers": [{"date": "2012-04-03T19:34:57.267", "user": "Amen Ayach (1209153)"}], "tag": ["c#", "winforms"], "user": "qwr qwr (1291744)", "creationDate": "2012-04-03T19:28:56.193"} +{"title": ".htaccess treats .js files as php", "qid": "10000049", "answers": [{"date": "2012-04-03T19:37:19.590", "user": "anubhava (548225)"}, {"date": "2012-04-03T19:59:16.133", "user": "Kristoffer Sall-Storgaard (3287)"}], "tag": ["php", ".htaccess"], "user": "fatman (812303)", "creationDate": "2012-04-03T19:29:10.220"} +{"title": "Is there a java library to bind XML (LOM) to XML+RDF?", "qid": "10000064", "answers": [{"date": "2012-04-04T11:23:51.137", "user": "William Greenly (611714)"}, {"date": "2013-06-12T05:37:24.770", "user": "po5i (1303826)"}, {"date": "2015-12-10T18:50:07.830", "user": "Enayat (2500344)"}], "tag": ["java", "xml", "xslt", "rdf"], "user": "po5i (1303826)", "creationDate": "2012-04-03T19:30:55.117"} +{"title": "Error with antlr grammer", "qid": "10000067", "answers": [], "tag": ["antlr", "antlr3", "antlrworks"], "user": "Mujtaba Sheikh (793926)", "creationDate": "2012-04-03T19:31:14.073"} +{"title": "Extending javascript function scope", "qid": "10000069", "answers": [{"date": "2012-04-03T19:35:38.780", "user": "Kevin Bowersox (714969)"}, {"date": "2012-04-03T19:54:31.080", "user": "Adam Shiemke (302132)"}, {"date": "2012-04-03T20:00:10.937", "user": "Juan Mendes (227299)"}], "tag": ["javascript", "dynamic", "scope"], "user": "6502 (320726)", "creationDate": "2012-04-03T19:31:17.377"} +{"title": "how to handle android request of username & password in jax-ws", "qid": "10000072", "answers": [{"date": "2012-04-05T18:00:38.157", "user": "enrmarc (434171)"}], "tag": ["android", "web-services", "ksoap2"], "user": "Gandhi Ishan (1237728)", "creationDate": "2012-04-03T19:31:30.920"} +{"title": "Which FRP package to choose?", "qid": "10000074", "answers": [{"date": "2012-04-03T20:44:59.417", "user": "ehird (1097181)"}, {"date": "2012-04-03T20:49:20.210", "user": "Orclev (13739)"}], "tag": ["haskell", "frp", "reactive-banana"], "user": "plc (1386599)", "creationDate": "2012-04-03T19:31:51.743"} +{"title": "HTML parsing returns no data although they are read", "qid": "10000081", "answers": [], "tag": ["java", "html", "parsing", "scope", "jericho-html-parser"], "user": "py_script (163085)", "creationDate": "2012-04-03T19:32:33.197"} +{"title": "Javascript event handler with parameters", "qid": "10000083", "answers": [{"date": "2012-04-03T19:41:07.750", "user": "jfriend00 (816620)"}, {"date": "2012-04-03T19:50:19.740", "user": "jbabey (386152)"}, {"date": "2015-01-05T13:54:51.723", "user": "Knight Yoshi (2150728)"}], "tag": ["javascript", "events", "event-handling", "handler"], "user": "sebas2day (1257069)", "creationDate": "2012-04-03T19:32:36.860"} +{"title": "WPF TabControl vs. Pages", "qid": "10000092", "answers": [{"date": "2012-04-03T19:51:10.190", "user": "MatthiasG (350749)"}, {"date": "2012-04-03T20:37:34.397", "user": "Frisbee (607314)"}], "tag": ["wpf", "tabcontrol"], "user": "landoncz (704430)", "creationDate": "2012-04-03T19:33:24.567"} +{"title": "Minimization with constraint on all parameters in R", "qid": "10000098", "answers": [{"date": "2012-04-03T20:20:22.173", "user": "Ben Bolker (190277)"}, {"date": "2012-04-03T23:55:21.697", "user": "flodel (1201032)"}], "tag": ["r"], "user": "eykanal (168775)", "creationDate": "2012-04-03T19:34:05.553"} +{"title": "MVC or event-driven component-oriented web frameworks?", "qid": "100001", "answers": [{"date": "2008-09-19T06:15:41.137", "user": "Misplaced (13710)"}, {"date": "2008-09-19T06:28:51.183", "user": "Justin Bozonier (9401)"}, {"date": "2008-09-19T06:29:53.460", "user": "Petr Macek (15045)"}, {"date": "2008-09-19T07:25:27.850", "user": "n1x0nad"}, {"date": "2008-09-19T10:10:05.303", "user": "Mladen Mihajlovic (11421)"}, {"date": "2009-02-27T00:27:14.007", "user": "Saem (68131)"}], "tag": ["web-frameworks"], "user": "Pablo Marambio (18552)", "creationDate": "2008-09-19T06:10:16.207"} +{"title": "how to store a uint32_t in a plist", "qid": "10000102", "answers": [{"date": "2012-04-03T19:37:52.570", "user": "Sebastian Fl\u00fcckiger (1146393)"}, {"date": "2012-04-03T19:38:06.627", "user": "DRVic (1232878)"}, {"date": "2012-04-03T19:42:27.287", "user": "Costique (246310)"}], "tag": ["iphone", "ios", "plist", "uint32"], "user": "C.Johns (807400)", "creationDate": "2012-04-03T19:34:13.163"} +{"title": "How to use zend mail to manipulate the mail message?", "qid": "10000103", "answers": [{"date": "2012-04-04T06:12:02.333", "user": "b.b3rn4rd (1055200)"}], "tag": ["php", "zend-framework", "zend-mail"], "user": "Leo Chan (1280996)", "creationDate": "2012-04-03T19:34:16.847"} +{"title": "How to use key and values from a hashmap in ArrayAdapter?", "qid": "10000108", "answers": [{"date": "2012-04-03T19:54:17.460", "user": "CommonsWare (115145)"}], "tag": ["android"], "user": "user803271 (803271)", "creationDate": "2012-04-03T19:34:40.650"} +{"title": "Creating a custom toggle with UIButton in Interface Builder", "qid": "10000120", "answers": [{"date": "2012-04-03T20:50:54.983", "user": "LJ Wilson (585320)"}], "tag": ["ios", "uikit", "interface-builder"], "user": "user1137704 (1137704)", "creationDate": "2012-04-03T19:35:25.833"} +{"title": "Re-using Java generic collections in Scala without trait Object", "qid": "10000126", "answers": [{"date": "2012-04-03T20:23:36.340", "user": "Didier Dupont (754787)"}], "tag": ["java", "scala", "generics", "collections", "trait"], "user": "Nikolaos (195489)", "creationDate": "2012-04-03T19:35:51.187"} +{"title": "jQuery Droppable - Make an Update Statement after an element gets dropped", "qid": "10000127", "answers": [{"date": "2012-04-03T19:43:51.873", "user": "Tuan (360053)"}, {"date": "2013-12-14T14:49:24.160", "user": "user3102186 (3102186)"}], "tag": ["php", "javascript", "jquery", "ajax", "jquery-ui"], "user": "user1124288 (1124288)", "creationDate": "2012-04-03T19:35:51.760"} +{"title": "wierd js / canvas issue - code example doesn't work locally", "qid": "10000128", "answers": [{"date": "2012-04-04T09:03:08.930", "user": "dantuch (575659)"}], "tag": ["javascript", "html5", "canvas"], "user": "dantuch (575659)", "creationDate": "2012-04-03T19:36:05.553"} +{"title": "Is there an existing iOS component to type in a UITextView?", "qid": "10000135", "answers": [], "tag": ["iphone", "ios", "ipad", "user-interface"], "user": "scompt.com (111777)", "creationDate": "2012-04-03T19:36:56.257"} +{"title": "Running web.py app with custom cmd options", "qid": "10000139", "answers": [{"date": "2012-04-03T20:04:17.830", "user": "dcrosta (124745)"}], "tag": ["python", "web.py"], "user": "behas (524865)", "creationDate": "2012-04-03T19:37:28.590"} +{"title": "Why does this simple query take forever?", "qid": "10000141", "answers": [{"date": "2012-04-03T19:45:10.973", "user": "Jaros\u0142aw Gomu\u0142ka (1256609)"}, {"date": "2012-04-03T20:02:38.753", "user": "Eugen Rieck (1100552)"}, {"date": "2012-04-04T06:14:35.740", "user": "Ankit Sharma (1311977)"}], "tag": ["mysql", "subquery", "where-in"], "user": "ademers (140212)", "creationDate": "2012-04-03T19:37:31.170"} +{"title": "Handling back and home button differently", "qid": "10000143", "answers": [{"date": "2012-04-03T19:41:45.783", "user": "lexmiir (284618)"}], "tag": ["android"], "user": "dutt (197657)", "creationDate": "2012-04-03T19:37:45.237"} +{"title": "Example of MVC in java/jdk", "qid": "10000149", "answers": [{"date": "2012-04-03T19:42:17.077", "user": "hvgotcodes (305644)"}, {"date": "2012-04-03T19:44:00.663", "user": "tenorsax (1048330)"}, {"date": "2012-04-03T19:51:16.463", "user": "Ulises Layera (1056488)"}, {"date": "2012-04-03T20:02:21.137", "user": "user282172 (282172)"}, {"date": "2012-04-04T18:05:13.037", "user": "Alonso Dominguez (748883)"}, {"date": "2012-08-18T12:43:08.753", "user": "padman (1032875)"}], "tag": ["java", "model-view-controller"], "user": "Martin Prakash (1311203)", "creationDate": "2012-04-03T19:38:03.103"} +{"title": "Regarding creating a data set in accordance with a given data format", "qid": "10000150", "answers": [{"date": "2012-04-03T22:50:40.917", "user": "flodel (1201032)"}], "tag": ["r"], "user": "user288609 (288609)", "creationDate": "2012-04-03T19:38:05.257"} +{"title": "Warning: Cannot modify header information - headers already sent by (output started at /home/", "qid": "10000152", "answers": [{"date": "2012-04-03T19:42:19.340", "user": "Lynn Crumbling (656243)"}], "tag": ["warnings", "wordpress-theming"], "user": "Mohan Ahire (1301857)", "creationDate": "2012-04-03T19:38:19.173"} +{"title": "Could not load file or assembly 'ConsoleApplication1'", "qid": "10000154", "answers": [{"date": "2012-04-03T20:02:02.620", "user": "Ami Schreiber (1424549)"}], "tag": ["c#", "visual-studio-2010"], "user": "user1259236 (1259236)", "creationDate": "2012-04-03T19:38:29.530"} +{"title": "Popover UI in Snow Leopard", "qid": "10000156", "answers": [{"date": "2012-04-03T20:47:12.987", "user": "trudyscousin (454697)"}], "tag": ["osx", "user-interface", "osx-snow-leopard"], "user": "pepsi (683200)", "creationDate": "2012-04-03T19:38:45.010"} +{"title": "Modify columns in a data frame in R more cleanly - maybe using with() or apply()?", "qid": "10000157", "answers": [{"date": "2012-04-03T19:45:15.047", "user": "Ben Bolker (190277)"}, {"date": "2012-04-03T20:15:17.560", "user": "Eduardo Leoni (143377)"}], "tag": ["r", "coding-style", "apply"], "user": "Mittenchops (1052117)", "creationDate": "2012-04-03T19:38:50.430"} +{"title": "MDI Child.show() displays the form in a weird manner", "qid": "1000016", "answers": [{"date": "2009-06-16T09:04:33.693", "user": "ChrisF (59303)"}], "tag": ["c#", ".net", "winforms", "mdi"], "user": "mustafabar (64964)", "creationDate": "2009-06-16T07:35:19.060"} +{"title": "What would happen if the decider is not running", "qid": "10000161", "answers": [{"date": "2012-04-03T21:35:14.073", "user": "Tomas Markauskas (110825)"}, {"date": "2012-07-15T06:55:22.463", "user": "instanceOfObject (934796)"}, {"date": "2013-09-05T20:27:13.513", "user": "Nate (1085691)"}], "tag": ["amazon-web-services", "amazon-swf"], "user": "priya (1004443)", "creationDate": "2012-04-03T19:39:08.217"} +{"title": "I am getting an error when calling obliqueRF from the obliqueRF package in CRAN, what could it be or how can I look into it more?", "qid": "10000164", "answers": [{"date": "2012-04-16T14:55:20.460", "user": "Palace Chan (970171)"}], "tag": ["r"], "user": "Palace Chan (970171)", "creationDate": "2012-04-03T19:39:13.960"} +{"title": "Using Batch Script connect to oracle db run a select command and output all data to a flat file", "qid": "10000165", "answers": [{"date": "2012-04-03T20:15:19.883", "user": "RobW (110275)"}, {"date": "2014-11-14T06:53:25.560", "user": "AVA (1143066)"}], "tag": ["oracle", "batch-file"], "user": "ak77 (1299304)", "creationDate": "2012-04-03T19:39:23.490"} +{"title": "Jquery toggle the visibility of a UI element, but make it invisible if no part of that div is clicked", "qid": "10000167", "answers": [{"date": "2012-04-03T19:41:45.940", "user": "Jasper (752738)"}, {"date": "2012-04-03T19:43:22.643", "user": "ShankarSangoli (772055)"}], "tag": ["jquery", "toggle"], "user": "prashn64 (1279534)", "creationDate": "2012-04-03T19:39:44.160"} +{"title": "Data URI for CSV file in firefox not putting .csv extension", "qid": "10000173", "answers": [{"date": "2012-04-24T18:13:51.347", "user": "Brad (1354463)"}], "tag": ["javascript", "data-uri"], "user": "test123 (916075)", "creationDate": "2012-04-03T19:40:14.457"} +{"title": "What are the different ways to use directories in Windows?", "qid": "10000174", "answers": [{"date": "2012-04-03T20:29:50.610", "user": "markyd13 (1308831)"}], "tag": ["c#", "windows", "directory-structure"], "user": "om471987 (988830)", "creationDate": "2012-04-03T19:40:14.753"} +{"title": "Display products of similar category RoR", "qid": "10000176", "answers": [{"date": "2012-04-03T20:56:50.083", "user": "JamesSwift (1273175)"}], "tag": ["ruby-on-rails"], "user": "noob (793116)", "creationDate": "2012-04-03T19:40:34.113"} +{"title": "Changing from arrays TO struct containing arrays", "qid": "10000180", "answers": [{"date": "2012-04-03T19:45:54.780", "user": "DRVic (1232878)"}, {"date": "2012-04-03T19:53:11.843", "user": "Rob\u1d69 (8747)"}], "tag": ["c++", "arrays", "deque"], "user": "george mano (846504)", "creationDate": "2012-04-03T19:41:13.613"} +{"title": "changing title of page doesn't work with facebook meta tags", "qid": "10000187", "answers": [{"date": "2012-04-20T06:04:22.477", "user": "Adam B (1345639)"}], "tag": ["php", "facebook", "joomla"], "user": "TomasJ (1291672)", "creationDate": "2012-04-03T19:41:45.347"} +{"title": "How to I get the UTF-8 data into a QString", "qid": "10000194", "answers": [{"date": "2012-04-03T19:57:50.047", "user": "Troubadour (74465)"}], "tag": ["qt", "utf-8"], "user": "RM1970 (282918)", "creationDate": "2012-04-03T19:42:06.030"} +{"title": "How to get a webpage to fit to the iPhone screen in Xcode", "qid": "10000195", "answers": [{"date": "2012-04-03T19:47:05.420", "user": "Phillip Mills (784753)"}, {"date": "2012-04-03T19:47:25.637", "user": "mr_kurrupt (726031)"}, {"date": "2012-04-03T20:52:58.040", "user": "Paul Hunter (605197)"}], "tag": ["iphone", "objective-c", "parsing", "webpage"], "user": "teambold (1286873)", "creationDate": "2012-04-03T19:42:12.787"} +{"title": "Is there a way to check if all the elements in an array are null in php", "qid": "10000202", "answers": [{"date": "2012-04-03T19:46:46.900", "user": "JKirchartz (276250)"}, {"date": "2012-04-03T19:48:58.727", "user": "pp19dd (415324)"}, {"date": "2012-04-03T19:50:08.710", "user": "zzzzBov (497418)"}, {"date": "2012-04-03T19:50:37.320", "user": "anubhava (548225)"}], "tag": ["php", "arrays"], "user": "Vishesh Joshi (1272431)", "creationDate": "2012-04-03T19:42:34.487"} +{"title": "Dapper Oracle Number(10,0) is returned as Decimal Parser error", "qid": "10000203", "answers": [{"date": "2012-04-05T17:35:27.100", "user": "Shuaib (137773)"}], "tag": ["c#", "oracle", "dapper"], "user": "Shuaib (137773)", "creationDate": "2012-04-03T19:42:39.417"} +{"title": "how to find distance between two markers in openlayers?", "qid": "10000207", "answers": [{"date": "2012-04-04T08:48:29.663", "user": "tonio (29655)"}], "tag": ["map", "openlayers"], "user": "Ramesh Kotha (342073)", "creationDate": "2012-04-03T19:43:04.453"} +{"title": "MIPS code acting funny - simple case regarding print statements", "qid": "10000211", "answers": [{"date": "2012-04-03T22:25:37.123", "user": "Patrik (296642)"}, {"date": "2012-04-03T22:25:48.037", "user": "markgz (583570)"}], "tag": ["mips"], "user": "spatara (1198431)", "creationDate": "2012-04-03T19:43:21.367"} +{"title": "Binding a TextBlock to a field in Local Database in Wp7", "qid": "10000214", "answers": [{"date": "2012-04-03T19:46:44.687", "user": "Nico Schertler (1210053)"}, {"date": "2012-04-03T20:06:16.707", "user": "Faster Solutions (890018)"}], "tag": ["windows-phone-7", "windows-phone"], "user": "Vikas Raturi (1311255)", "creationDate": "2012-04-03T19:43:29.813"} +{"title": "Python Input validation", "qid": "10000220", "answers": [{"date": "2012-04-03T19:47:40.693", "user": "Alex Vidal (237211)"}, {"date": "2012-04-03T19:59:40.187", "user": "katzenversteher (1145832)"}], "tag": ["python", "input", "validation"], "user": "GeneralZero (798064)", "creationDate": "2012-04-03T19:43:58.197"} +{"title": "Remotely Executing an Independent .exe on an Apache Server [CGI]", "qid": "10000223", "answers": [{"date": "2012-04-03T21:31:39.363", "user": "daxim (46395)"}], "tag": ["windows", "perl", "apache", "cgi", "executable"], "user": "Sam F (1279860)", "creationDate": "2012-04-03T19:44:16.683"} +{"title": "Square Subsequence", "qid": "10000226", "answers": [{"date": "2012-04-05T20:11:09.423", "user": "Ina (825050)"}, {"date": "2012-04-05T20:42:49.077", "user": "mbeckish (21727)"}, {"date": "2012-04-05T21:59:56.073", "user": "Jeffrey Sax (923873)"}, {"date": "2015-05-13T12:35:57.560", "user": "coder101 (2749191)"}], "tag": ["string", "algorithm", "dynamic-programming"], "user": "Avinash (1276881)", "creationDate": "2012-04-03T19:44:27.717"} +{"title": "how to repeat group section in one page with using crystal reports?", "qid": "10000228", "answers": [{"date": "2012-04-03T20:19:21.837", "user": "paulmelnikow (893113)"}], "tag": ["crystal-reports", "crystal-reports-2008"], "user": "Sumit Prajapati (1194668)", "creationDate": "2012-04-03T19:44:28.730"} +{"title": "Windows Service vs Windows Application - Best Practice", "qid": "1000023", "answers": [{"date": "2009-06-16T07:42:52.917", "user": "Sev (83819)"}, {"date": "2009-06-16T07:43:51.997", "user": "AlexDrenea (39624)"}, {"date": "2009-06-16T07:43:54.197", "user": "blowdart (2525)"}], "tag": ["c#", "windows", "winforms", "windows-services"], "user": "Mugunth (90165)", "creationDate": "2009-06-16T07:36:09.467"} +{"title": "assembly hex representation from two bytes", "qid": "10000230", "answers": [{"date": "2012-04-04T00:29:22.243", "user": "dwelch (16007)"}], "tag": ["assembly", "x86", "nasm"], "user": "aseed (775685)", "creationDate": "2012-04-03T19:44:34.550"} +{"title": "How to select text from a multiline textbox with the line breaks in Jquery?", "qid": "10000231", "answers": [{"date": "2012-04-03T19:47:03.160", "user": "Jasper (752738)"}, {"date": "2012-04-03T19:53:22.453", "user": "jornare (1249477)"}], "tag": ["jquery"], "user": "developer747 (1110437)", "creationDate": "2012-04-03T19:44:51.537"} +{"title": "Does the Facebook Comments Social Plugin have an API where comments can be added?", "qid": "10000234", "answers": [{"date": "2012-04-03T20:27:20.233", "user": "Shawn E Carter (912623)"}, {"date": "2013-07-25T00:40:17.783", "user": "ericpeters0n (1655825)"}, {"date": "2016-01-18T08:20:39.257", "user": "Artem (2585940)"}], "tag": ["facebook", "facebook-graph-api", "comments", "facebook-comments"], "user": "Ajay Pondicherry (1311108)", "creationDate": "2012-04-03T19:45:10.900"} +{"title": "What is best practice for coding an email contact button on your site", "qid": "10000240", "answers": [{"date": "2012-04-03T19:47:21.397", "user": "Diodeus (12579)"}, {"date": "2012-04-03T19:55:26.260", "user": "Rodolfo (594338)"}, {"date": "2012-04-03T20:02:48.593", "user": "Stan (717810)"}], "tag": ["javascript", "html", "email", "href", "mailto"], "user": "Orb Hitter (1281912)", "creationDate": "2012-04-03T19:45:37.213"} +{"title": "Run multiple string replaces with fewer calls to .replace()", "qid": "10000244", "answers": [{"date": "2012-04-03T19:51:22.860", "user": "ControlAltDel (1291492)"}, {"date": "2012-04-03T19:52:52.690", "user": "Mizuho (1288984)"}], "tag": ["java-6"], "user": "Webnet (197606)", "creationDate": "2012-04-03T19:46:03.360"} +{"title": "Entitymodifiers runs but show no change", "qid": "10000246", "answers": [{"date": "2012-04-04T11:09:44.967", "user": "JohnEye (1084813)"}], "tag": ["java", "android", "andengine"], "user": "bos (788134)", "creationDate": "2012-04-03T19:46:22.627"} +{"title": "How does resharper recognise what files to include for its intellisense?", "qid": "10000247", "answers": [{"date": "2014-03-15T20:26:17.627", "user": "Dem0n13 (3274248)"}], "tag": ["c#", "resharper", "intellisense"], "user": "Jack Wester (820956)", "creationDate": "2012-04-03T19:46:27.557"} +{"title": "WCF 1 Sesssion = 1 Thread?", "qid": "10000248", "answers": [{"date": "2012-04-03T20:46:41.830", "user": "Andriy Buday (232881)"}, {"date": "2012-04-03T21:11:08.127", "user": "David Nelson (46783)"}], "tag": [".net", "wcf", "session"], "user": "Banshee (365624)", "creationDate": "2012-04-03T19:46:27.793"} +{"title": "Failed to Login as 'Domain\\ComputerName' pyodbc with py2exe", "qid": "10000256", "answers": [{"date": "2012-04-03T20:15:09.997", "user": "Bryan (366335)"}, {"date": "2012-04-03T20:36:46.660", "user": "Anthony Kong (58129)"}], "tag": ["python", "sql-server", "py2exe", "pyodbc"], "user": "kbsurfer (228499)", "creationDate": "2012-04-03T19:46:53.530"} +{"title": "stream connection using httpwebrequest", "qid": "10000261", "answers": [{"date": "2012-04-03T21:24:21.690", "user": "JamieSee (1015164)"}], "tag": [".net", "vb.net", "httpwebrequest", "twitter", "http-streaming"], "user": "vbNewbie (425481)", "creationDate": "2012-04-03T19:47:14.420"} +{"title": "How to get text from 'td' tags from 'table' tag on html page using Mechanize", "qid": "10000267", "answers": [{"date": "2012-04-03T21:28:09.830", "user": "Dru (830554)"}], "tag": ["ruby", "mechanize"], "user": "megas (458137)", "creationDate": "2012-04-03T19:47:28.053"} +{"title": "How to find properties are not modified or change?", "qid": "10000271", "answers": [{"date": "2012-04-03T19:52:52.860", "user": "Khan (212566)"}, {"date": "2012-04-03T20:20:34.187", "user": "Adam Tuliper - MSFT (371637)"}], "tag": ["asp.net-mvc-3", "c#-4.0", "object"], "user": "updev (602183)", "creationDate": "2012-04-03T19:47:39.397"} +{"title": "How can detect text file line breaks in php?", "qid": "10000272", "answers": [{"date": "2012-04-03T19:50:54.107", "user": "jnylen (106302)"}, {"date": "2012-04-03T19:57:58.910", "user": "Nishchal Gautam (1267177)"}], "tag": ["php", "arrays", "string"], "user": "AMIN Gholibeigian (1143736)", "creationDate": "2012-04-03T19:47:39.597"} +{"title": "How to focus radio control using Javascript in IE?", "qid": "1000028", "answers": [{"date": "2009-06-16T07:41:07.053", "user": "Canavar (55351)"}, {"date": "2009-06-16T07:59:14.513", "user": "Thevs (8559)"}, {"date": "2009-06-16T08:16:33.987", "user": "Alsciende (119195)"}], "tag": ["javascript", "internet-explorer"], "user": "Roy Tang (18494)", "creationDate": "2009-06-16T07:38:33.703"} +{"title": "How to use unicode chars in a web with a reliable rendering", "qid": "10000280", "answers": [{"date": "2012-04-04T01:44:01.707", "user": "Michael Mullany (271353)"}, {"date": "2012-04-04T03:07:07.817", "user": "Jukka K. Korpela (1084437)"}], "tag": ["unicode", "font-face", "google-font-api"], "user": "fguillen (316700)", "creationDate": "2012-04-03T19:48:49.427"} +{"title": "How can I add a virtual \"count\" column to a select query in rails?", "qid": "10000282", "answers": [{"date": "2012-04-03T19:58:47.677", "user": "oFca (1028956)"}, {"date": "2012-04-03T21:17:10.730", "user": "tsherif (1308624)"}, {"date": "2012-08-16T11:46:11.510", "user": "Luke Ehresman (456295)"}], "tag": ["ruby-on-rails", "activerecord"], "user": "patrick (594763)", "creationDate": "2012-04-03T19:48:55.857"} +{"title": "How to change fontsize in direct.label?", "qid": "10000286", "answers": [{"date": "2012-05-10T01:12:05.117", "user": "Eric Fail (1305688)"}, {"date": "2012-05-15T18:51:25.523", "user": "Eric Fail (1305688)"}], "tag": ["r", "ggplot2", "font-size"], "user": "Peter Ellis (1181097)", "creationDate": "2012-04-03T19:49:11.987"} +{"title": "I want to display on children categories name of a particular category", "qid": "10000287", "answers": [{"date": "2012-04-03T19:52:43.857", "user": "mikevoermans (961847)"}], "tag": ["php", "wordpress"], "user": "user602697 (602697)", "creationDate": "2012-04-03T19:49:14.747"} +{"title": "How do I loop through every object in a class (like VB For Each X in Y) in MATLAB?", "qid": "10000289", "answers": [{"date": "2012-04-04T16:45:53.807", "user": "Geoff Olynyk (1311028)"}], "tag": ["matlab", "com", "interop", "foreach", "com-interop"], "user": "Geoff Olynyk (1311028)", "creationDate": "2012-04-03T19:49:20.753"} +{"title": "jquery asp load content", "qid": "10000295", "answers": [{"date": "2012-04-03T19:56:51.140", "user": "Cos Callis (681009)"}, {"date": "2012-04-03T20:00:45.787", "user": "Anthony Potts (22777)"}, {"date": "2012-04-03T20:01:08.470", "user": "Shyju (40521)"}, {"date": "2012-04-03T20:24:53.407", "user": "daniloquio (354756)"}], "tag": ["jquery", "asp.net"], "user": "forX (1001919)", "creationDate": "2012-04-03T19:49:42.347"} +{"title": "WriteInt-RandomAccessFile - java", "qid": "10000296", "answers": [{"date": "2012-04-03T19:55:43.870", "user": "ControlAltDel (1291492)"}, {"date": "2012-04-03T20:11:34.767", "user": "Eugene Retunsky (871953)"}], "tag": ["java", "random-access"], "user": "bachurim09 (438728)", "creationDate": "2012-04-03T19:49:51.127"} +{"title": "UIControlledApplication does not work", "qid": "10000297", "answers": [{"date": "2012-04-04T02:58:33.803", "user": "Victor Chekalin (989259)"}], "tag": ["revit", "revit-api"], "user": "PANANO (1305719)", "creationDate": "2012-04-03T19:49:56.323"} +{"title": "ARM MMU operation in various operating modes", "qid": "10000298", "answers": [{"date": "2012-04-07T14:33:01.470", "user": "unixsmurf (563188)"}], "tag": ["linux", "arm", "mmu"], "user": "Prabagaran (744829)", "creationDate": "2012-04-03T19:50:00.503"} +{"title": "Jquery grow effect like spray", "qid": "10000299", "answers": [{"date": "2012-04-03T19:53:22.453", "user": "Rory McCrossan (519413)"}, {"date": "2012-08-30T18:56:11.433", "user": "Robin Maben (448232)"}], "tag": ["jquery", "spray"], "user": "Sam Miller (1311291)", "creationDate": "2012-04-03T19:50:03.047"} +{"title": "What is a metaclass in Python?", "qid": "100003", "answers": [{"date": "2008-09-19T06:26:10.537", "user": "Jerub (14648)"}, {"date": "2008-09-19T06:32:58.397", "user": "Matthias Kestenholz (317346)"}, {"date": "2008-09-19T06:45:40.020", "user": "Antti Rasinen (8570)"}, {"date": "2008-09-19T07:01:58.623", "user": "Thomas Wouters (17624)"}, {"date": "2014-02-24T21:20:49.270", "user": "Craig (1489354)"}, {"date": "2015-08-10T23:28:09.000", "user": "Aaron Hall (541136)"}, {"date": "2016-03-01T19:48:34.813", "user": "Ethan Furman (208880)"}, {"date": "2011-06-21T16:30:26.837", "user": "kindall (416467)"}, {"date": "2011-07-05T11:29:50.927", "user": "e-satis (9951)"}, {"date": "2011-08-08T19:35:40.520", "user": "espeed (161085)"}], "tag": ["python", "oop", "metaclass", "python-datamodel"], "user": "e-satis (9951)", "creationDate": "2008-09-19T06:10:46.830"} +{"title": "Unknown GDB Error", "qid": "10000303", "answers": [{"date": "2012-04-03T22:06:44.920", "user": "Malek_Jundi (705559)"}], "tag": ["iphone"], "user": "user1120133 (1120133)", "creationDate": "2012-04-03T19:50:11.830"} +{"title": "PHP remove similar arrays based on several associations in an associative array", "qid": "10000305", "answers": [{"date": "2012-04-03T20:05:52.447", "user": "Alexander (417685)"}, {"date": "2012-04-03T20:08:07.720", "user": "BlindAndFurious (1234194)"}, {"date": "2012-04-03T20:13:40.400", "user": "MatthiasLaug (778166)"}, {"date": "2012-04-03T20:15:36.887", "user": "jornare (1249477)"}], "tag": ["php", "filter", "associative-array", "multidimensional-array"], "user": "CamSyl (961814)", "creationDate": "2012-04-03T19:50:18.350"} +{"title": "Prevent HTML5 video changing Chrome's icon and title", "qid": "10000308", "answers": [{"date": "2012-04-05T21:11:22.380", "user": "Francisc (383148)"}], "tag": ["html5", "google-chrome", "html5-video", "favicon"], "user": "mbeasley (984239)", "creationDate": "2012-04-03T19:50:27.273"} +{"title": "codeigniter controller not recognizing passed variable", "qid": "10000328", "answers": [{"date": "2012-04-03T20:51:26.777", "user": "Catfish (222403)"}, {"date": "2012-04-03T21:27:33.827", "user": "user1297515 (1297515)"}, {"date": "2012-04-03T21:27:47.040", "user": "David Lawrence (915872)"}], "tag": ["php", "javascript", "html", "codeigniter"], "user": "daniel.tosaba (653874)", "creationDate": "2012-04-03T19:51:42.670"} +{"title": "How to send Request.Form", "qid": "10000331", "answers": [{"date": "2012-04-03T20:13:50.727", "user": "pylover (680372)"}, {"date": "2012-04-03T20:24:50.613", "user": "James Johnson (879420)"}], "tag": ["c#", "asp.net"], "user": "Thiago (552422)", "creationDate": "2012-04-03T19:52:00.770"} +{"title": "is it possible to configure content in the html file when using requirejs optimizer?", "qid": "10000333", "answers": [{"date": "2012-04-09T06:26:34.717", "user": "Yauheni Leichanok (1074847)"}], "tag": ["node.js", "requirejs"], "user": "skinnybrit51 (3476108)", "creationDate": "2012-04-03T19:52:18.317"} +{"title": "How to use debug version of libc", "qid": "10000335", "answers": [{"date": "2012-04-04T06:12:55.057", "user": "Employed Russian (50617)"}, {"date": "2013-11-16T15:13:50.940", "user": "mtlynch (90388)"}], "tag": ["linux", "gdb", "libc", "ldd"], "user": "Gabriel Southern (937324)", "creationDate": "2012-04-03T19:52:25.263"} +{"title": "ignore the joomla tag or consider them as valid tag in netbeans", "qid": "10000336", "answers": [{"date": "2012-04-09T18:21:08.480", "user": "Ben Sandberg (1988919)"}], "tag": ["php", "netbeans", "joomla", "dtd"], "user": "Ahmad (1104402)", "creationDate": "2012-04-03T19:52:26.477"} +{"title": "Using DateTime?.Value.TimeOfDay in LINQ Query", "qid": "10000338", "answers": [{"date": "2012-04-03T20:07:47.173", "user": "jason (45914)"}], "tag": ["sql-server", "asp.net-mvc", "linq", "entity-framework", "timespan"], "user": "Umagon (1311269)", "creationDate": "2012-04-03T19:52:41.503"} +{"title": "C++ WriteProcessMemory Without Variables", "qid": "10000340", "answers": [{"date": "2012-04-03T20:03:43.507", "user": "Jerry Coffin (179910)"}, {"date": "2012-04-03T22:39:06.090", "user": "Rob Kennedy (33732)"}], "tag": ["c++", "windows"], "user": "Tprice88 (1218395)", "creationDate": "2012-04-03T19:52:48.130"} +{"title": "php urlencode encodes wrong?", "qid": "10000341", "answers": [{"date": "2012-04-03T20:37:12.060", "user": "Crashspeeder (752829)"}], "tag": ["php", "urlencode"], "user": "Jonathan (1248410)", "creationDate": "2012-04-03T19:52:49.617"} +{"title": "Capturing a sql paramter and display it in the asp.net report", "qid": "10000346", "answers": [{"date": "2012-04-03T20:53:48.353", "user": "Dave D (1254874)"}], "tag": ["asp.net"], "user": "Risho (234188)", "creationDate": "2012-04-03T19:53:01.363"} +{"title": "Using node parameters in named templates using XSLT 2.0", "qid": "10000350", "answers": [{"date": "2012-04-03T21:09:52.913", "user": "Michael Kay (415448)"}], "tag": ["xslt", "xslt-2.0"], "user": "LokiPatera (13428)", "creationDate": "2012-04-03T19:53:10.767"} +{"title": "Ajax queue Backbone js", "qid": "10000352", "answers": [{"date": "2012-04-03T20:12:01.197", "user": "abraham (26406)"}, {"date": "2012-04-04T08:18:24.703", "user": "nikoshr (1071630)"}], "tag": ["ruby-on-rails", "ajax", "backbone.js", "ruby-on-rails-3.2"], "user": "Tim Brunsmo (1015190)", "creationDate": "2012-04-03T19:53:20.100"} +{"title": "Oracle query with multiple tables", "qid": "10000355", "answers": [{"date": "2012-04-03T20:07:49.373", "user": "Viehzeug (657322)"}, {"date": "2012-04-03T20:08:14.647", "user": "Dave Costa (6568)"}], "tag": ["oracle"], "user": "wholee1 (725505)", "creationDate": "2012-04-03T19:53:24.840"} +{"title": "Revert (or undo saved changes) a WorkItem to an older version in TFS API", "qid": "10000356", "answers": [{"date": "2012-04-03T21:23:44.663", "user": "M.Radwan -MVP (386323)"}, {"date": "2012-04-03T22:23:06.123", "user": "Tarun Arora (377771)"}, {"date": "2012-04-05T00:26:08.093", "user": "Qwerty (1287052)"}], "tag": ["tfs", "tfs2010", "tfs-sdk"], "user": "user1060500 (1060500)", "creationDate": "2012-04-03T19:53:24.807"} +{"title": "Determine which function was called", "qid": "10000358", "answers": [{"date": "2012-04-03T19:57:39.583", "user": "Taymon (1064659)"}, {"date": "2012-04-03T20:01:01.637", "user": "Raymond Hettinger (1001643)"}, {"date": "2012-04-03T20:02:28.253", "user": "max (336527)"}, {"date": "2012-04-03T20:04:35.520", "user": "kindall (416467)"}], "tag": ["python", "function"], "user": "user1308523 (1308523)", "creationDate": "2012-04-03T19:53:30.127"} +{"title": "strcat and malloc", "qid": "10000359", "answers": [{"date": "2012-04-03T19:56:56.990", "user": "RyanS (1310604)"}, {"date": "2012-04-03T19:58:31.857", "user": "Luca Rocchi (282484)"}], "tag": ["c", "string", "malloc"], "user": "user1305850 (1305850)", "creationDate": "2012-04-03T19:53:31.877"} +{"title": "What sorting technique will you use?", "qid": "1000036", "answers": [{"date": "2009-06-16T07:49:19.273", "user": "paxdiablo (14860)"}, {"date": "2009-06-16T07:49:57.213", "user": "Dutow (73657)"}, {"date": "2009-06-16T08:02:48.703", "user": "DShook (370)"}, {"date": "2009-06-16T08:10:20.813", "user": "Roddy (1737)"}, {"date": "2009-06-16T08:20:10.203", "user": "bill (121958)"}, {"date": "2009-06-16T08:30:09.580", "user": "henrikpp (1442)"}, {"date": "2009-06-16T08:30:33.603", "user": "Martin Schuhfu\u00df (123219)"}, {"date": "2009-06-16T08:40:07.083", "user": "finnw (12048)"}, {"date": "2009-06-16T08:50:31.790", "user": "Christoffer (15514)"}, {"date": "2009-06-16T09:39:52.360", "user": "Skizz (1898)"}], "tag": ["c", "algorithm", "sorting", "word"], "user": "mzk", "creationDate": "2009-06-16T07:40:16.557"} +{"title": "Java - TCP Server can't read from TCP Client", "qid": "10000361", "answers": [{"date": "2012-04-03T19:58:43.997", "user": "Tudor (808486)"}], "tag": ["java", "tcp"], "user": "newtonrd (1311275)", "creationDate": "2012-04-03T19:53:59.440"} +{"title": "Java android client communication with C# server", "qid": "10000365", "answers": [{"date": "2012-04-03T20:04:57.470", "user": "Matthew (507793)"}, {"date": "2012-04-03T20:13:26.720", "user": "JMarsch (67038)"}, {"date": "2012-04-03T22:02:44.903", "user": "TommyN (636509)"}, {"date": "2012-04-03T22:13:49.623", "user": "Jon O (429108)"}], "tag": ["c#", "android", "client"], "user": "Ahmed (1185422)", "creationDate": "2012-04-03T19:54:15.383"} +{"title": "jquery append truncate", "qid": "10000368", "answers": [{"date": "2012-04-03T19:55:34.717", "user": "Colin (30433)"}, {"date": "2012-04-03T19:56:09.147", "user": "Jasper (752738)"}, {"date": "2012-04-03T19:56:18.737", "user": "Alex Vidal (237211)"}], "tag": ["jquery"], "user": "Nate Pet (996431)", "creationDate": "2012-04-03T19:54:18.320"} +{"title": "MySQL error 1248, Creating proper query. Beginner Q", "qid": "10000372", "answers": [{"date": "2012-04-03T19:57:13.853", "user": "Michael Berkowski (541091)"}, {"date": "2012-04-04T06:07:40.600", "user": "Ankit Sharma (1311977)"}], "tag": ["mysql"], "user": "user1311286", "creationDate": "2012-04-03T19:54:29.850"} +{"title": "How to prevent errors during include if file not exist (without @)", "qid": "10000374", "answers": [{"date": "2012-04-03T20:05:07.980", "user": "Nathan (1272799)"}, {"date": "2012-04-03T20:05:47.830", "user": "Matthew Blancarte (614152)"}, {"date": "2012-04-03T20:13:11.943", "user": "Stan (717810)"}], "tag": ["php"], "user": "Vitalii Plodistov (983066)", "creationDate": "2012-04-03T19:54:35.203"} +{"title": "CORS in grails - All requests fail?", "qid": "10000376", "answers": [{"date": "2012-04-03T20:07:54.613", "user": "Igor Artamonov (222467)"}, {"date": "2012-04-03T20:31:57.817", "user": "Stefan Kendall (78182)"}, {"date": "2012-04-03T23:58:41.883", "user": "pablomolnar (705117)"}], "tag": ["javascript", "ajax", "grails", "groovy", "cors"], "user": "Stefan Kendall (78182)", "creationDate": "2012-04-03T19:54:42.950"} +{"title": "How to index wikipedia files in .xml format into solr", "qid": "10000378", "answers": [{"date": "2012-04-03T20:27:14.163", "user": "Dan Fitch (27614)"}], "tag": ["xml", "solr", "indexing", "wikipedia"], "user": "Satyam Roy (1197755)", "creationDate": "2012-04-03T19:54:44.417"} +{"title": "Whats the least upper bound of the growth rate using big-Oh notation of these two functions", "qid": "1000038", "answers": [{"date": "2009-06-16T07:45:12.320", "user": "Dutow (73657)"}, {"date": "2009-06-16T07:50:55.383", "user": "PaulJWilliams (71399)"}, {"date": "2012-08-02T04:59:35.320", "user": "friendlyautomaton (1570376)"}], "tag": ["big-o"], "user": "erickreutz (112957)", "creationDate": "2009-06-16T07:40:56.073"} +{"title": "problems using simple modal in chrome when zoom is applied", "qid": "10000381", "answers": [{"date": "2012-04-24T02:45:52.930", "user": "jkriss (1352697)"}], "tag": ["jquery", "simplemodal"], "user": "user1311194 (1311194)", "creationDate": "2012-04-03T19:54:51.237"} +{"title": "Can I get these curved corners with CSS?", "qid": "10000382", "answers": [{"date": "2012-04-03T19:57:55.117", "user": "awiebe (888715)"}, {"date": "2012-04-03T20:03:36.177", "user": "Sven Bieder (1133145)"}, {"date": "2012-04-03T20:04:27.627", "user": "Eric J. (141172)"}, {"date": "2012-04-03T20:15:32.243", "user": "Victor Nitu (965912)"}], "tag": ["css", "html5"], "user": "Thomas Clayson (414972)", "creationDate": "2012-04-03T19:54:52.107"} +{"title": "VB.NET Cannot connect to Oracle Server", "qid": "10000383", "answers": [{"date": "2012-04-03T20:01:30.890", "user": "johanvdw (545346)"}, {"date": "2012-04-04T03:42:18.110", "user": "Andrei Dvoynos (1295965)"}], "tag": ["vb.net", "oracle"], "user": "Jeremy F. (538029)", "creationDate": "2012-04-03T19:55:10.023"} +{"title": "Theming using resources without Blend vomitting", "qid": "10000385", "answers": [{"date": "2012-04-03T22:20:41.557", "user": "Harry Mexican (855551)"}, {"date": "2012-04-03T23:43:03.173", "user": "Mike Post (20788)"}], "tag": ["wpf", "expression-blend", "blend"], "user": "Harry Mexican (855551)", "creationDate": "2012-04-03T19:55:25.243"} +{"title": ".off not unbinding animationend event", "qid": "10000398", "answers": [{"date": "2012-04-03T19:58:19.907", "user": "ShankarSangoli (772055)"}, {"date": "2012-04-03T20:11:23.350", "user": "scurker (139054)"}], "tag": ["jquery", "css3", "css-animations"], "user": "user834418 (834418)", "creationDate": "2012-04-03T19:56:29.740"} +{"title": "Visual studio does not load class into editor if you check it out while debugging the solution", "qid": "10000399", "answers": [{"date": "2012-06-11T10:10:40.647", "user": "Clara Onager (1400368)"}], "tag": ["visual-studio-2010", "vb.net-2010"], "user": "Stephen Simpson (1294001)", "creationDate": "2012-04-03T19:56:32.067"} +{"title": "Data binding to SelectedItem in a WPF Treeview", "qid": "1000040", "answers": [{"date": "2009-06-16T08:04:28.467", "user": "Thomas Levesque (98713)"}, {"date": "2013-04-19T14:38:22.023", "user": "karma (2299633)"}, {"date": "2013-05-30T15:05:21.640", "user": "Paul Solomenchuk (1934361)"}, {"date": "2013-08-16T03:59:06.357", "user": "Evgeny Bechkalo (419292)"}, {"date": "2015-02-13T16:10:42.823", "user": "Fahad Owais (4564116)"}, {"date": "2015-05-26T14:34:08.410", "user": "JustinMichel (1469095)"}, {"date": "2015-10-20T09:39:29.733", "user": "Chaitanya Kadamati (4402011)"}, {"date": "2010-08-10T09:36:43.280", "user": "nabeelfarid (288746)"}, {"date": "2010-08-20T21:43:03.857", "user": "Delta (327104)"}, {"date": "2011-02-04T14:15:19.370", "user": "bstoney (70716)"}, {"date": "2011-02-25T14:29:47.633", "user": "Steve Greatrex (261782)"}, {"date": "2011-06-13T04:48:04.487", "user": "Wes (539993)"}, {"date": "2011-07-12T01:38:48.643", "user": "Arthur Nunes (702828)"}, {"date": "2011-07-20T20:27:34.377", "user": "Devgig (331850)"}, {"date": "2011-08-22T22:23:33.640", "user": "Bas (668272)"}], "tag": ["c#", "wpf", "mvvm", "treeview", "selecteditem"], "user": "Natrium (59119)", "creationDate": "2009-06-16T07:41:35.650"} +{"title": "MediaPlayer, ProgressBar", "qid": "10000400", "answers": [{"date": "2012-04-03T20:02:11.693", "user": "JRaymond (947304)"}, {"date": "2012-04-03T20:39:51.017", "user": "Peter Ajtai (186636)"}, {"date": "2015-07-13T09:16:40.110", "user": "Fedor Tsyganov (2899437)"}], "tag": ["android", "seekbar"], "user": "pouzzler (926696)", "creationDate": "2012-04-03T19:56:37.307"} +{"title": "python database location", "qid": "10000401", "answers": [{"date": "2012-04-03T20:02:00.123", "user": "Andrew Clark (505154)"}], "tag": ["python"], "user": "Garret (1250937)", "creationDate": "2012-04-03T19:56:38.893"} +{"title": "eclipse indigo cannot create new server jboss 5.1", "qid": "10000402", "answers": [{"date": "2012-04-03T21:38:24.603", "user": "Aaron (1054558)"}, {"date": "2012-12-29T17:35:42.420", "user": "nevenc (800710)"}, {"date": "2014-09-15T15:32:38.400", "user": "user1881310 (1881310)"}], "tag": ["eclipse", "java-ee", "jboss", "application-server"], "user": "Alina Danila (2003095)", "creationDate": "2012-04-03T19:56:43.780"} +{"title": "VB.NET IDE Debugger exits on \"Exit Sub\"", "qid": "10000403", "answers": [{"date": "2013-06-06T09:29:21.480", "user": "JMan (1903386)"}], "tag": ["vb.net", "treeview", "solidworks"], "user": "Superhuman (548805)", "creationDate": "2012-04-03T19:56:43.890"} +{"title": "Set up Bundles for TextMate: Location for run command", "qid": "10000404", "answers": [{"date": "2012-05-07T19:55:22.400", "user": "CMDadabo (1361634)"}], "tag": ["textmate", "sml", "textmatebundles"], "user": "atb (1224798)", "creationDate": "2012-04-03T19:56:45.277"} +{"title": "LDAP Connector stops working when using INI config instead of PHP array", "qid": "10000406", "answers": [{"date": "2012-04-03T20:17:16.917", "user": "Kh\u00f4i (1310668)"}], "tag": ["zend-framework", "ldap", "ini"], "user": "Brad Morris (868032)", "creationDate": "2012-04-03T19:56:51.687"} +{"title": "Binding to a property of a current item from another binded list", "qid": "1000041", "answers": [{"date": "2009-06-16T08:21:12.730", "user": "agnieszka (40872)"}], "tag": ["c#", ".net", "data-binding"], "user": "agnieszka (40872)", "creationDate": "2009-06-16T07:42:20.267"} +{"title": "Smart pointers & destructor", "qid": "10000412", "answers": [{"date": "2012-04-03T20:02:08.487", "user": "StAlphonzo (976731)"}, {"date": "2012-04-03T20:07:51.973", "user": "gymbrall (263053)"}, {"date": "2012-04-03T20:21:43.517", "user": "Mooing Duck (845092)"}], "tag": ["class", "boost", "destructor", "smart-pointers"], "user": "fex (1235520)", "creationDate": "2012-04-03T19:57:28.097"} +{"title": "Console scripts execution from Java program", "qid": "10000423", "answers": [{"date": "2012-04-03T20:38:59.747", "user": "Luca (1252169)"}], "tag": ["java", "linux", "bash"], "user": "glaz666 (59692)", "creationDate": "2012-04-03T19:58:26.817"} +{"title": "Mongoid foreign key in embedded document", "qid": "10000425", "answers": [{"date": "2012-04-03T21:36:21.417", "user": "Tyler Brock (216314)"}], "tag": ["ruby-on-rails", "mongodb", "mongoid"], "user": "Matteo Pagliazzi (969528)", "creationDate": "2012-04-03T19:58:29.880"} +{"title": "How does one include the server hostname in a django error email?", "qid": "10000428", "answers": [{"date": "2012-04-03T20:02:20.747", "user": "jvc26 (781909)"}, {"date": "2012-04-03T20:09:18.857", "user": "Furbeenator (965668)"}, {"date": "2012-04-03T21:33:55.510", "user": "sdolan (186868)"}], "tag": ["python", "django"], "user": "Endophage (432193)", "creationDate": "2012-04-03T19:58:36.713"} +{"title": "Strange behaviour with Microsoft.WindowsCE.Forms", "qid": "1000043", "answers": [{"date": "2009-06-16T15:08:11.603", "user": "ctacke (13154)"}, {"date": "2010-02-02T15:35:18.413", "user": "Robin (264462)"}, {"date": "2010-06-07T23:30:13.977", "user": "Miros (285853)"}], "tag": ["c#", "visual-studio-2008", "compact-framework"], "user": "mrtaikandi (34623)", "creationDate": "2009-06-16T07:42:55.787"} +{"title": "C# equivalent of C++/CLI data types", "qid": "10000433", "answers": [{"date": "2012-04-03T20:04:01.137", "user": "Tibi (794075)"}, {"date": "2012-04-03T20:05:07.283", "user": "rscarvalho (581429)"}], "tag": ["c#", "function", "c++-cli", "data-type-conversion"], "user": "user1298416 (1298416)", "creationDate": "2012-04-03T19:58:48.960"} +{"title": "jquery \"onload\" click link", "qid": "10000435", "answers": [{"date": "2012-04-03T19:59:57.020", "user": "Rory McCrossan (519413)"}, {"date": "2014-11-15T15:36:47.630", "user": "user4255991 (4255991)"}], "tag": ["jquery", "onload"], "user": "Paul (1141084)", "creationDate": "2012-04-03T19:58:52.730"} +{"title": "Is there a Python method to calculate lognormal mean and variance?", "qid": "10000436", "answers": [{"date": "2012-04-03T20:59:47.360", "user": "Anthony Kong (58129)"}, {"date": "2012-04-03T21:33:30.783", "user": "Joe Kington (325565)"}], "tag": ["python", "matlab", "statistics"], "user": "Jason (814661)", "creationDate": "2012-04-03T19:58:58.690"} +{"title": "Mixing TCP and UDP", "qid": "10000437", "answers": [{"date": "2012-04-03T20:01:16.583", "user": "awiebe (888715)"}, {"date": "2012-04-03T21:07:12.247", "user": "dAm2K (1250381)"}, {"date": "2015-05-01T06:06:57.263", "user": "gabhijit (2845044)"}], "tag": ["networking", "tcp", "udp"], "user": "newprogrammer (861183)", "creationDate": "2012-04-03T19:59:00.037"} +{"title": "Flask-Login package is broken by importing Google App Engine's testbed", "qid": "10000441", "answers": [{"date": "2012-04-03T20:13:57.277", "user": "dragonx (1026572)"}], "tag": ["python", "google-app-engine", "unit-testing", "flask"], "user": "Brian M. Hunt (19212)", "creationDate": "2012-04-03T19:59:19.007"} +{"title": "Ruby on Rails fb_graph failing with undefined method bytesize when executed from delayed_job", "qid": "10000443", "answers": [{"date": "2013-04-19T15:07:36.437", "user": "Andrey Prihodko (1379611)"}], "tag": ["ruby-on-rails", "ruby", "delayed-job", "httparty", "fb-graph"], "user": "aaronrussell (151409)", "creationDate": "2012-04-03T19:59:37.223"} +{"title": "How to check for end of tag in Python using minidom?", "qid": "10000445", "answers": [{"date": "2012-04-03T20:09:36.283", "user": "Anthony Kong (58129)"}, {"date": "2012-04-03T20:35:29.110", "user": "kindall (416467)"}], "tag": ["python"], "user": "JohnX (689878)", "creationDate": "2012-04-03T19:59:53.153"} +{"title": "How can I import specific blueprint components into Compass?", "qid": "10000453", "answers": [{"date": "2012-04-04T10:59:56.940", "user": "Maxime Fabre (598404)"}], "tag": ["sass", "compass-sass", "blueprint-css"], "user": "Jim England (1311311)", "creationDate": "2012-04-03T20:00:13.453"} +{"title": "Locking rows in in innoDB for multiple queries", "qid": "10000459", "answers": [{"date": "2012-04-03T20:16:18.467", "user": "Flo Doe (1264310)"}], "tag": ["php", "mysql", "sql"], "user": "qitch (860667)", "creationDate": "2012-04-03T20:00:50.937"} +{"title": "mochijson2 examples!", "qid": "1000046", "answers": [{"date": "2009-06-16T08:22:28.673", "user": "jitter (122428)"}, {"date": "2009-06-16T11:27:20.163", "user": "tim (2986)"}, {"date": "2009-06-17T06:08:22.490", "user": "rik.the.vik (45570)"}, {"date": "2013-08-27T22:22:34.727", "user": "neowulf33 (1216965)"}], "tag": ["json", "erlang"], "user": "ErJab (123545)", "creationDate": "2009-06-16T07:43:01.763"} +{"title": "Lazy loading of Twitter profile images not working", "qid": "10000463", "answers": [{"date": "2012-04-03T20:29:14.353", "user": "Matthias Bauch (457406)"}], "tag": ["iphone", "objective-c", "xcode", "osx"], "user": "Richard Knop (95944)", "creationDate": "2012-04-03T20:01:07.580"} +{"title": "How can I convert an Apple IMA4 CAF file recorded with AVAudioRecorder to a WAV file using Core Audio Converter Services?", "qid": "10000464", "answers": [], "tag": ["iphone", "wav", "avaudiorecorder", "caf", "ima4"], "user": "user1092719 (1092719)", "creationDate": "2012-04-03T20:01:08.270"} +{"title": "Good programming habits with return statements", "qid": "10000468", "answers": [{"date": "2012-04-03T20:03:02.837", "user": "hvgotcodes (305644)"}, {"date": "2012-04-03T20:03:59.810", "user": "RyanS (1310604)"}, {"date": "2012-04-03T20:05:52.447", "user": "DRVic (1232878)"}, {"date": "2012-04-03T20:06:24.613", "user": "StAlphonzo (976731)"}, {"date": "2012-04-03T20:13:52.227", "user": "Taymon (1064659)"}, {"date": "2012-04-03T20:23:29.517", "user": "Cliff (10631)"}, {"date": "2012-04-03T21:00:59.283", "user": "Cratylus (384706)"}, {"date": "2012-04-03T21:54:35.920", "user": "ach (1311394)"}], "tag": ["java"], "user": "stzzz1 (1311189)", "creationDate": "2012-04-03T20:01:29.743"} +{"title": "Clear buffers for C# performance test?", "qid": "10000469", "answers": [{"date": "2012-04-03T20:14:28.107", "user": "zmbq (871910)"}], "tag": ["c#", "sql-server", "performance", ".net-4.0", "buffer"], "user": "Royi Namir (859154)", "creationDate": "2012-04-03T20:01:30.233"} +{"title": "git repository not recognized during rails deploy with capistrano", "qid": "10000489", "answers": [{"date": "2012-04-03T20:06:07.143", "user": "Mizuho (1288984)"}, {"date": "2012-04-03T20:06:44.053", "user": "Nic (356746)"}, {"date": "2012-04-04T19:13:04.083", "user": "J K (1034602)"}, {"date": "2012-10-26T13:37:06.047", "user": "user1777247 (1777247)"}], "tag": ["ruby-on-rails", "git", "deployment", "capistrano"], "user": "J K (1034602)", "creationDate": "2012-04-03T20:02:44.133"} +{"title": "How to turn off/on memcache in Code Igniter", "qid": "10000491", "answers": [{"date": "2012-04-04T07:40:49.660", "user": "landons (206881)"}], "tag": ["php", "codeigniter", "libmemcache"], "user": "Salman Khimani (459690)", "creationDate": "2012-04-03T20:02:49.963"} +{"title": "Try to select an option in a spinner from the db", "qid": "10000492", "answers": [{"date": "2012-04-03T20:13:18.920", "user": "pouzzler (926696)"}], "tag": ["android", "database", "android-spinner"], "user": "Aaron (708678)", "creationDate": "2012-04-03T20:02:50.540"} +{"title": "Remove protocol and result with full base_url from html input string", "qid": "10000494", "answers": [{"date": "2012-04-03T23:03:19.083", "user": "Robbie (459517)"}], "tag": ["php", "regex", "while-loop", "preg-replace"], "user": "msmithng (982892)", "creationDate": "2012-04-03T20:02:55.287"} +{"title": "iframes and IE8 emulation", "qid": "10000496", "answers": [{"date": "2012-04-04T08:22:18.793", "user": "Erik Dahlstr\u00f6m (109374)"}], "tag": ["internet-explorer-8", "svg", "emulation"], "user": "ssawchenko (592756)", "creationDate": "2012-04-03T20:02:57.963"} +{"title": "How come non-globals from included files are usable in relative urls and unusable in full urls of included php files?", "qid": "10000498", "answers": [{"date": "2012-04-03T20:09:13.623", "user": "jnylen (106302)"}], "tag": ["php"], "user": "Roy (806061)", "creationDate": "2012-04-03T20:03:12.420"} +{"title": "process hanging on java process builder start", "qid": "10000499", "answers": [], "tag": ["java"], "user": "Ricardo Garza V. (1217187)", "creationDate": "2012-04-03T20:03:29.027"} +{"title": "Java - Connect to RDP server in Windows", "qid": "10000501", "answers": [{"date": "2012-04-03T20:09:09.263", "user": "kevingreen (288915)"}], "tag": ["java", "windows", "remote-desktop", "rdp", "mstsc"], "user": "eoinzy (652410)", "creationDate": "2012-04-03T20:03:34.867"} +{"title": "Bad behavior with printf and multiple strings", "qid": "10000502", "answers": [{"date": "2012-04-03T20:07:34.020", "user": "Mat (635608)"}, {"date": "2012-04-03T20:20:27.133", "user": "Rob\u1d69 (8747)"}], "tag": ["c++", "printf", "inet"], "user": "Michael S. (309171)", "creationDate": "2012-04-03T20:03:35.047"} +{"title": "How to use sorl-thumbnail without django?", "qid": "10000504", "answers": [{"date": "2012-04-03T22:55:25.363", "user": "John (310431)"}, {"date": "2012-04-03T23:04:02.127", "user": "Gareth Rees (68063)"}], "tag": ["python", "django", "sorl-thumbnail"], "user": "Andrew (421010)", "creationDate": "2012-04-03T20:03:36.583"} +{"title": "Field 'Invoice_Date' cannot be modified", "qid": "10000515", "answers": [{"date": "2012-04-03T20:38:54.660", "user": "Ken White (62576)"}], "tag": ["delphi", "ms-access", "delphi-7"], "user": "BlueOcean (1311241)", "creationDate": "2012-04-03T20:04:09.703"} +{"title": "IE position of centred text on A tag", "qid": "10000516", "answers": [{"date": "2012-04-03T20:09:29.233", "user": "Tony (455797)"}], "tag": ["css"], "user": "user1209203 (1209203)", "creationDate": "2012-04-03T20:04:12.003"} +{"title": "\"Red Cross\" problem on MenuStrip and ToolStrip", "qid": "1000052", "answers": [{"date": "2009-06-16T07:45:58.607", "user": "Pondidum (1500)"}, {"date": "2009-06-16T07:59:15.403", "user": "Jason Punyon (6212)"}, {"date": "2009-06-16T08:07:41.490", "user": "Igal Tabachnik (8205)"}, {"date": "2009-06-16T08:08:14.263", "user": "Dun3 (66466)"}, {"date": "2014-03-04T19:32:41.337", "user": "user922020 (922020)"}], "tag": ["c#", "multithreading", "toolstrip", "menustrip"], "user": "ThePower (67258)", "creationDate": "2009-06-16T07:44:25.443"} +{"title": "Running two python scripts parallel with boost::python", "qid": "10000524", "answers": [{"date": "2012-04-03T21:56:12.877", "user": "rotoglup (70881)"}], "tag": ["c++", "parallel-processing", "boost-python", "cpython"], "user": "Esbj\u00f6rn Olsson (1311256)", "creationDate": "2012-04-03T20:04:28.330"} +{"title": "javascript - fetch additional fields from mysql and display in table", "qid": "10000526", "answers": [{"date": "2012-04-03T23:06:24.730", "user": "cha55son (595130)"}], "tag": ["php", "javascript", "mysql", "forms"], "user": "Smudger (940173)", "creationDate": "2012-04-03T20:04:39.547"} +{"title": "Do I need to escape text/plain or text/javascript?", "qid": "10000528", "answers": [{"date": "2012-04-03T20:06:10.123", "user": "Matthew Flaschen (47773)"}], "tag": ["php", "javascript", "security", "xss"], "user": "qwertymk (465546)", "creationDate": "2012-04-03T20:04:45.597"} +{"title": "Is there a 'one-shot' way to pull data from MySql using Perl?", "qid": "10000530", "answers": [{"date": "2012-04-03T20:29:52.653", "user": "ikegami (589924)"}], "tag": ["mysql", "perl", "dbi"], "user": "silkfield (1009504)", "creationDate": "2012-04-03T20:04:50.997"} +{"title": "run function when click a button", "qid": "10000534", "answers": [{"date": "2012-04-03T20:07:08.280", "user": "RyanS (1310604)"}, {"date": "2012-04-03T20:13:11.753", "user": "Steen (694408)"}], "tag": ["javascript"], "user": "Amr Salah Shalaby (1297774)", "creationDate": "2012-04-03T20:05:11.327"} +{"title": "How does Google Docs manage to get paste on click to work?", "qid": "10000537", "answers": [{"date": "2012-04-03T20:24:33.687", "user": "epascarello (14104)"}, {"date": "2012-04-03T20:52:40.100", "user": "Victor Nitu (965912)"}], "tag": ["javascript", "clipboard", "google-docs"], "user": "mjtko (928027)", "creationDate": "2012-04-03T20:05:24.787"} +{"title": "Conjugate gradient 2D image reconstruction Matlab", "qid": "10000538", "answers": [{"date": "2012-04-10T12:57:51.680", "user": "mars (1324117)"}], "tag": ["image", "matlab", "gradient", "3d-reconstruction"], "user": "shizzle (951732)", "creationDate": "2012-04-03T20:05:25.537"} +{"title": "PHP \"Exception not found\"", "qid": "10000539", "answers": [{"date": "2012-04-03T20:18:38.117", "user": "kDjakman (1295480)"}, {"date": "2012-04-03T21:07:20.993", "user": "hakre (367456)"}], "tag": ["php", "exception"], "user": "didi_X8 (261952)", "creationDate": "2012-04-03T20:05:34.553"} +{"title": "db4o querying subobject", "qid": "1000054", "answers": [{"date": "2009-09-11T00:40:16.140", "user": "mr_georg (26070)"}], "tag": ["db4o"], "user": "Fred (55046)", "creationDate": "2009-06-16T07:45:10.887"} +{"title": "Command Line Interface Ruby", "qid": "10000540", "answers": [{"date": "2012-04-03T20:13:12.070", "user": "Andrew Marshall (211563)"}], "tag": ["ruby"], "user": "Billjk (1247509)", "creationDate": "2012-04-03T20:05:41.683"} +{"title": "Workaround for .NET NetworkStream.Length lack of suppport", "qid": "10000541", "answers": [{"date": "2012-04-03T20:07:44.690", "user": "Jon Skeet (22656)"}], "tag": ["c#", "asyncsocket", ".net"], "user": "kmarks2 (467170)", "creationDate": "2012-04-03T20:05:44.507"} +{"title": "Hiding the layout of a select box", "qid": "10000543", "answers": [{"date": "2012-04-03T20:14:04.407", "user": "Engineer (1113426)"}], "tag": ["html", "layout", "drop-down-menu"], "user": "lucaspdallo (1311312)", "creationDate": "2012-04-03T20:05:49.060"} +{"title": "Extra blue section in popover between the navigation bar title and the view controller's view", "qid": "10000544", "answers": [{"date": "2012-04-04T23:27:19.263", "user": "bneely (947934)"}], "tag": ["ios", "uiviewcontroller", "uinavigationcontroller", "uipopovercontroller"], "user": "bneely (947934)", "creationDate": "2012-04-03T20:05:49.993"} +{"title": "WMB ESQL passing constants to passthru", "qid": "10000547", "answers": [{"date": "2012-04-18T18:49:34.220", "user": "Nishant (156775)"}, {"date": "2012-05-08T19:29:44.020", "user": "Saurabh Patil (578046)"}, {"date": "2013-07-20T08:16:20.373", "user": "Mukesh Kumar (2601767)"}], "tag": ["messagebroker", "passthru", "embedded-sql"], "user": "Saurabh Patil (578046)", "creationDate": "2012-04-03T20:05:56.693"} +{"title": "tcl use variable in namespace name", "qid": "10000548", "answers": [{"date": "2012-04-03T21:04:15.553", "user": "kostix (720999)"}], "tag": ["tcl"], "user": "ilya1725 (224982)", "creationDate": "2012-04-03T20:06:00.110"} +{"title": "Backbone + Rails collection fetching", "qid": "10000549", "answers": [{"date": "2012-04-03T22:04:45.223", "user": "Paul (215086)"}], "tag": ["ruby-on-rails", "backbone.js"], "user": "clem (507475)", "creationDate": "2012-04-03T20:06:00.900"} +{"title": "iOS sine wave generation - audible clicking", "qid": "10000552", "answers": [{"date": "2012-04-03T20:19:01.157", "user": "Wouter Huysentruit (1300910)"}, {"date": "2012-04-03T21:09:20.413", "user": "hotpaw2 (341750)"}, {"date": "2012-04-05T05:20:14.717", "user": "Shannon (395461)"}], "tag": ["ios", "core-audio", "audiounit", "synthesis", "synthesizer"], "user": "Adam Mordas (1311279)", "creationDate": "2012-04-03T20:06:13.223"} +{"title": "sql select statement in vb returning value when its supposed to be null", "qid": "10000554", "answers": [{"date": "2012-04-03T20:34:07.283", "user": "Joel Coehoorn (3043)"}], "tag": ["sql", "vb.net", "ms-access"], "user": "ken (783690)", "creationDate": "2012-04-03T20:06:20.827"} +{"title": "Word shows trays that are not installed with an exclamation mark", "qid": "1000056", "answers": [{"date": "2011-05-15T17:48:21.910", "user": "Nitin Unni (628317)"}], "tag": [".net", "printing", "ms-word", "tray"], "user": "Savas (123546)", "creationDate": "2009-06-16T07:45:20.807"} +{"title": "Multiple stored procedures within a stored procedure and waiting", "qid": "10000561", "answers": [{"date": "2012-04-03T20:27:34.293", "user": "Justin Cave (10397)"}], "tag": ["sql", "stored-procedures"], "user": "PopeScooby (1311315)", "creationDate": "2012-04-03T20:07:10.700"} +{"title": "How do I tell unobstructive validation in MVC 3 to use a different model?", "qid": "10000562", "answers": [{"date": "2012-04-06T16:27:04.687", "user": "Francesco Abbruzzese (473010)"}, {"date": "2012-04-10T00:21:57.327", "user": "Esteban (544283)"}], "tag": ["asp.net-mvc-3", "unobtrusive-javascript"], "user": "Jonathan (62686)", "creationDate": "2012-04-03T20:07:12.043"} +{"title": "Check if ValueListBoxes are answered in GWT", "qid": "10000564", "answers": [{"date": "2012-04-03T21:38:36.377", "user": "Goran Nastov (1100282)"}], "tag": ["java", "gwt", "listbox"], "user": "Jamie Hush (2719613)", "creationDate": "2012-04-03T20:07:19.450"} +{"title": "Interfaces: profit of using", "qid": "10000578", "answers": [{"date": "2012-04-03T20:11:00.977", "user": "Jon Skeet (22656)"}, {"date": "2012-04-03T20:31:57.570", "user": "trutheality (771837)"}], "tag": ["java", "php", "interface"], "user": "Zapadlo (618020)", "creationDate": "2012-04-03T20:08:07.630"} +{"title": "Using solr for indexing different types of data", "qid": "1000058", "answers": [{"date": "2009-06-16T11:42:56.900", "user": "KenE (43783)"}], "tag": ["indexing", "lucene", "solr"], "user": "Markus Lux (18597)", "creationDate": "2009-06-16T07:45:39.277"} +{"title": "(Un)setting a cookie in mod_rewrite", "qid": "10000587", "answers": [{"date": "2012-04-03T20:54:08.493", "user": "pagid (116932)"}], "tag": ["mod-rewrite", "cookies"], "user": "pagid (116932)", "creationDate": "2012-04-03T20:08:37.067"} +{"title": "Detect \"Kinks\" in Parallel Lines to Bezier Curves", "qid": "10000590", "answers": [{"date": "2012-04-03T22:28:56.327", "user": "comingstorm (210211)"}], "tag": ["c#", "math", "bezier-curve"], "user": "Spencer Ruport (52551)", "creationDate": "2012-04-03T20:08:41.777"} +{"title": "How to load yml files instead xliff for translating a Symfony application", "qid": "10000591", "answers": [{"date": "2012-04-03T20:40:20.603", "user": "Elnur Abdurrakhimov (745188)"}], "tag": ["php", "symfony2", "translation"], "user": "George Gkirtsou (1294631)", "creationDate": "2012-04-03T20:08:46.500"} +{"title": "Strange DB2 Scopes", "qid": "10000592", "answers": [{"date": "2012-04-03T20:25:27.490", "user": "Steve Kass (139164)"}], "tag": ["sql", "select", "scope", "db2", "ibm"], "user": "Is7aq (1230594)", "creationDate": "2012-04-03T20:08:58.037"} +{"title": "C# print labels in Zebra - Server side/Client Side", "qid": "10000593", "answers": [{"date": "2012-04-04T03:27:32.303", "user": "Yosem (410219)"}, {"date": "2012-04-18T14:42:24.860", "user": "cDecker32 (1015064)"}, {"date": "2012-05-02T18:44:27.180", "user": "JohnyMoraes (1028306)"}, {"date": "2012-05-11T18:44:12.320", "user": "bashman (1390068)"}], "tag": ["c#", "asp.net", "windows-server-2008", "intranet", "zebra-printers"], "user": "JohnyMoraes (1028306)", "creationDate": "2012-04-03T20:08:59.883"} +{"title": "Which construct is better suited for this situation, an if-else or a switch?", "qid": "10000596", "answers": [{"date": "2012-04-03T20:12:35.143", "user": "RyanS (1310604)"}, {"date": "2012-04-03T20:17:56.713", "user": "David R\u00f6nnqvist (608157)"}, {"date": "2012-04-03T20:20:10.910", "user": "e.James (33686)"}, {"date": "2012-04-03T20:23:23.897", "user": "Nilesh (418074)"}], "tag": ["iphone", "objective-c", "xcode", "if-statement", "switch-statement"], "user": "Joey (1224762)", "creationDate": "2012-04-03T20:09:03.787"} +{"title": "If Both Checkboxes flag false do?", "qid": "10000597", "answers": [{"date": "2012-04-03T20:11:44.700", "user": "phoog (385844)"}, {"date": "2012-04-03T20:11:47.653", "user": "scwagner (3981)"}, {"date": "2012-04-03T20:12:08.107", "user": "user1308752 (1308752)"}, {"date": "2012-04-03T20:12:27.470", "user": "SwDevMan81 (95573)"}, {"date": "2012-04-03T20:15:32.923", "user": "user1308520 (1308520)"}], "tag": ["c#", "visual-studio-2008", "checkbox", "messagebox"], "user": "xSCM (1301674)", "creationDate": "2012-04-03T20:09:05.853"} +{"title": "Build error on Zapp when running iPhone app (with KIF testsuites)", "qid": "10000600", "answers": [{"date": "2012-04-06T18:31:42.897", "user": "Dexter (529793)"}, {"date": "2012-05-04T17:42:02.657", "user": "Dexter (529793)"}], "tag": ["ios", "continuous-integration", "integration-testing", "kif-framework"], "user": "Dexter (529793)", "creationDate": "2012-04-03T20:09:10.387"} +{"title": "Magento - module conventions mysql4 or resource", "qid": "10000603", "answers": [{"date": "2012-04-03T21:11:59.360", "user": "Alan Storm (4668)"}], "tag": ["magento"], "user": "Marty Wallace (1189880)", "creationDate": "2012-04-03T20:09:27.450"} +{"title": "Designing a DAO model for an existing project", "qid": "10000605", "answers": [{"date": "2012-04-03T20:26:50.033", "user": "Eugene Retunsky (871953)"}], "tag": ["java", "dao"], "user": "Mr Gravity (86798)", "creationDate": "2012-04-03T20:09:32.147"} +{"title": "C++ linked-list traversal", "qid": "10000608", "answers": [{"date": "2012-04-03T20:10:44.830", "user": "Oliver Charlesworth (129570)"}, {"date": "2012-04-03T20:14:12.787", "user": "Ogre Psalm33 (13140)"}, {"date": "2012-04-03T20:15:10.197", "user": "DRVic (1232878)"}, {"date": "2012-04-03T20:15:37.573", "user": "Kevin Anderson (83839)"}, {"date": "2012-04-03T20:16:59.443", "user": "nate_weldon (1209369)"}], "tag": ["c++", "linked-list"], "user": "user1290709 (1290709)", "creationDate": "2012-04-03T20:09:37.030"} +{"title": "batch delete records in database table", "qid": "10000609", "answers": [{"date": "2012-04-03T20:11:17.530", "user": "cagcowboy (19629)"}, {"date": "2012-04-03T20:11:42.413", "user": "hkutluay (840566)"}], "tag": ["sql", "oracle"], "user": "Brad (26130)", "creationDate": "2012-04-03T20:09:41.853"} +{"title": "Get selected words from Rich-Text box from Add-in", "qid": "10000610", "answers": [{"date": "2012-04-09T21:13:29.263", "user": "Meyer Denney (500975)"}], "tag": ["add-in", "infopath", "selectedtext"], "user": "Karthik (1311164)", "creationDate": "2012-04-03T20:09:50.573"} +{"title": "My dynamically created ListViewItems are not displaying in my ListView", "qid": "10000613", "answers": [{"date": "2012-04-04T08:05:35.387", "user": "las (1285148)"}], "tag": ["c#", ".net", "listview", "dynamic", "listviewitem"], "user": "B. Clay Shannon (875317)", "creationDate": "2012-04-03T20:10:00.713"} +{"title": "Writing a small C program to shutdown windows in entered time", "qid": "10000617", "answers": [{"date": "2012-04-03T20:14:01.600", "user": "Jerry Coffin (179910)"}, {"date": "2012-04-03T20:17:27.403", "user": "Alex Reynolds (19410)"}], "tag": ["c", "windows"], "user": "muntasir2000 (1205536)", "creationDate": "2012-04-03T20:10:46.557"} +{"title": "Show keybinding with yasnippet", "qid": "10000619", "answers": [{"date": "2012-04-04T08:42:14.777", "user": "kindahero (399964)"}], "tag": ["emacs", "yasnippet"], "user": "Niclas Nilsson (934836)", "creationDate": "2012-04-03T20:10:50.113"} +{"title": "how do I split a string into array of string?", "qid": "10000621", "answers": [{"date": "2012-04-03T20:29:28.607", "user": "Karl Bielefeldt (389146)"}, {"date": "2012-04-03T20:50:25.937", "user": "ipc (1176973)"}, {"date": "2012-04-03T20:56:01.767", "user": "l3x (1275169)"}, {"date": "2012-04-03T21:09:30.250", "user": "Joey Adams (149391)"}, {"date": "2012-04-03T21:58:46.200", "user": "Morpfh (1240985)"}], "tag": ["c", "string", "split"], "user": "Jack (800123)", "creationDate": "2012-04-03T20:10:58.857"} +{"title": "What are the downsides to rebasing topic branches instead of merging?", "qid": "10000624", "answers": [{"date": "2012-04-03T20:14:44.783", "user": "Chris (576139)"}, {"date": "2012-04-03T20:40:56.070", "user": "Karl Bielefeldt (389146)"}], "tag": ["git", "branching-and-merging", "git-rebase", "git-merge"], "user": "Eric (546561)", "creationDate": "2012-04-03T20:11:07.047"} +{"title": "Creating a grid array of co ordinates", "qid": "10000628", "answers": [{"date": "2012-04-03T20:29:20.203", "user": "Alexander (417685)"}, {"date": "2012-04-03T20:31:30.470", "user": "ninjagecko (711085)"}, {"date": "2012-04-03T20:41:11.400", "user": "rlemon (829835)"}], "tag": ["javascript"], "user": "Dave (1076743)", "creationDate": "2012-04-03T20:11:27.467"} +{"title": "Writing a function to allocate an upper triangular matrix", "qid": "10000635", "answers": [{"date": "2012-04-03T20:20:32.347", "user": "DRVic (1232878)"}, {"date": "2012-04-03T20:26:31.610", "user": "Medran (254530)"}], "tag": ["c++", "multidimensional-array", "matrix"], "user": "CornucopiaBeebee (1075573)", "creationDate": "2012-04-03T20:11:53.703"} +{"title": "Redirecting domain names to the same domain?", "qid": "10000637", "answers": [{"date": "2012-04-03T20:39:18.677", "user": "Firoz Ansari (1100452)"}, {"date": "2012-04-04T19:38:19.890", "user": "gijs007 (889861)"}], "tag": ["redirect", "apache2"], "user": "gijs007 (889861)", "creationDate": "2012-04-03T20:11:58.137"} +{"title": "EOFError when running subprocess with fabric", "qid": "10000642", "answers": [{"date": "2012-05-03T17:12:10.737", "user": "Morgan (203747)"}], "tag": ["python", "ssh", "subprocess", "fabric"], "user": "Jesse Aldridge (88696)", "creationDate": "2012-04-03T20:12:09.010"} +{"title": "mySQL hierarchical grouping sort", "qid": "10000643", "answers": [{"date": "2012-04-03T20:31:04.790", "user": "Eric J. (141172)"}, {"date": "2012-04-03T20:34:18.797", "user": "Neil (182705)"}, {"date": "2012-04-03T20:39:56.237", "user": "scwagner (3981)"}], "tag": ["mysql"], "user": "ack (32840)", "creationDate": "2012-04-03T20:12:17.077"} +{"title": "How to easily create a parser for custom formatted data in Python", "qid": "10000649", "answers": [{"date": "2012-04-03T20:14:40.660", "user": "Platinum Azure (129655)"}, {"date": "2012-04-03T20:17:36.950", "user": "modchan (472695)"}, {"date": "2012-04-03T20:36:00.333", "user": "9000 (223424)"}], "tag": ["python", "parsing"], "user": "Samuel (155857)", "creationDate": "2012-04-03T20:12:56.810"} +{"title": "Making an iPad nib load in a universal app", "qid": "10000651", "answers": [{"date": "2012-04-03T20:20:03.483", "user": "0x7fffffff (716216)"}, {"date": "2012-12-10T12:04:35.020", "user": "David Attaie (1705963)"}], "tag": ["ios", "ipad", "xib", "universal"], "user": "tallybear (1038091)", "creationDate": "2012-04-03T20:13:05.767"} +{"title": "ivy - how to download all sources with just adding one line", "qid": "10000655", "answers": [{"date": "2012-04-04T23:15:28.563", "user": "Mark O'Connor (256618)"}], "tag": ["ivy"], "user": "Dean Hiller (517781)", "creationDate": "2012-04-03T20:13:13.380"} +{"title": "how to logout after getting authenticated by single sign on provider?", "qid": "1000066", "answers": [{"date": "2009-08-02T10:03:07.663", "user": "dhaval (119031)"}], "tag": ["logout", "rpxnow"], "user": "dhaval (119031)", "creationDate": "2009-06-16T07:49:20.363"} +{"title": "Querying a variable from a MATLAB struct array", "qid": "10000660", "answers": [{"date": "2012-04-03T21:01:11.983", "user": "Pablo (334852)"}], "tag": ["arrays", "matlab", "struct"], "user": "user1093562 (1093562)", "creationDate": "2012-04-03T20:13:24.597"} +{"title": "+= operator within .css method in jQuery", "qid": "10000662", "answers": [{"date": "2012-04-03T20:15:53.953", "user": "Andrew Whitaker (497356)"}, {"date": "2012-04-03T20:15:57.827", "user": "Deleteman (955697)"}, {"date": "2012-04-03T20:16:26.700", "user": "Keith (114547)"}, {"date": "2012-04-03T20:16:32.223", "user": "gabitzish (499497)"}, {"date": "2012-04-03T20:16:46.013", "user": "ShankarSangoli (772055)"}], "tag": ["jquery"], "user": "jsuissa (1163095)", "creationDate": "2012-04-03T20:13:27.000"} +{"title": "Google Chrome - context.canvas.width/context.canvas.width causes \"Blue layer\"", "qid": "10000666", "answers": [{"date": "2012-04-03T20:23:31.267", "user": "Jim Schubert (151445)"}, {"date": "2012-04-17T22:45:58.430", "user": "Johnny Sterlak (904512)"}], "tag": ["javascript", "google-chrome", "canvas", "html5-canvas"], "user": "ctdeveloper (1154278)", "creationDate": "2012-04-03T20:13:48.837"} +{"title": "Xcode image/pixel manipulation realtime", "qid": "10000670", "answers": [{"date": "2012-04-03T20:52:21.847", "user": "awiebe (888715)"}], "tag": ["xcode", "image"], "user": "Scott Walker (838813)", "creationDate": "2012-04-03T20:13:59.667"} +{"title": "Make an tag move onto a new line, without using \"display:block\"", "qid": "10000674", "answers": [{"date": "2012-04-03T20:18:00.740", "user": "Ricardo Casta\u00f1eda (1021122)"}, {"date": "2012-04-03T20:19:12.770", "user": "David Nguyen (735556)"}, {"date": "2012-04-03T20:20:12.960", "user": "Khan (212566)"}], "tag": ["css"], "user": "Caroline Elisa (767761)", "creationDate": "2012-04-03T20:14:07.807"} +{"title": "Save rake background task to log? (Using Resque)", "qid": "10000678", "answers": [{"date": "2012-04-03T20:19:49.850", "user": "Robin (584713)"}], "tag": ["ruby-on-rails", "ruby-on-rails-3", "logging", "rake"], "user": "Stpn (861181)", "creationDate": "2012-04-03T20:14:27.403"} +{"title": "Is it possible to use the Microsoft Kinect SDK with Metro Style applications?", "qid": "10000683", "answers": [{"date": "2012-04-04T06:22:51.077", "user": "louis.luo (762062)"}, {"date": "2012-04-10T16:08:33.790", "user": "wikimix (1037615)"}], "tag": ["windows-8", "kinect", "microsoft-metro"], "user": "Giohji (984024)", "creationDate": "2012-04-03T20:14:55.777"} +{"title": "MySQL Sub Query join query to exisiting query", "qid": "10000685", "answers": [{"date": "2012-04-03T20:17:56.620", "user": "Michael Berkowski (541091)"}], "tag": ["mysql"], "user": "Michael Stevens (1298457)", "creationDate": "2012-04-03T20:15:04.767"} +{"title": "Is C++ not a fully OOP Language?", "qid": "1000069", "answers": [{"date": "2009-06-16T07:52:30.717", "user": "Marco van de Voort (99354)"}, {"date": "2009-06-16T07:52:40.250", "user": "unwind (28169)"}, {"date": "2009-06-16T07:53:12.293", "user": "Sev (83819)"}, {"date": "2009-06-16T07:54:24.147", "user": "LeopardSkinPillBoxHat (22489)"}, {"date": "2009-06-16T07:59:59.690", "user": "Degvik (26276)"}, {"date": "2009-06-16T08:00:54.933", "user": "Aditya Sehgal (95321)"}, {"date": "2009-06-16T08:11:29.453", "user": "knittl (112968)"}, {"date": "2009-06-16T08:20:49.673", "user": "pmr (105672)"}, {"date": "2011-11-22T16:53:05.780", "user": "ALOK KUMAR mca sathyabama univ (1060252)"}], "tag": ["c++"], "user": "Gojo Mal", "creationDate": "2009-06-16T07:50:05.980"} +{"title": "Enabling MMU in Linux", "qid": "10000693", "answers": [{"date": "2012-04-03T20:26:18.647", "user": "wallyk (198536)"}, {"date": "2012-04-04T12:31:30.083", "user": "Igor Skochinsky (422797)"}, {"date": "2014-09-26T23:37:59.273", "user": "shingaridavesh (979683)"}], "tag": ["linux", "arm", "mmu"], "user": "Prabagaran (744829)", "creationDate": "2012-04-03T20:15:28.170"} +{"title": "Mapping extension content types in Apache CXF JAX-RS", "qid": "10000699", "answers": [{"date": "2012-04-06T21:21:12.083", "user": "Donal Fellows (301832)"}, {"date": "2012-04-27T11:55:09.713", "user": "praseodym (203036)"}, {"date": "2013-10-31T11:17:47.343", "user": "thibr (455985)"}], "tag": ["mapping", "cxf", "content-type", "jax-rs"], "user": "Garret Wilson (421049)", "creationDate": "2012-04-03T20:15:40.103"} +{"title": "Logging Application Block - Logging the caller", "qid": "100007", "answers": [{"date": "2008-09-19T06:38:11.817", "user": "Tom Carr (14954)"}, {"date": "2008-09-19T10:24:25.330", "user": "lotsoffreetime (18248)"}], "tag": ["c#", "logging", "enterprise-library", "application-blocks"], "user": "Odd (11908)", "creationDate": "2008-09-19T06:12:37.777"} +{"title": "Read whole file in blocks in c#", "qid": "10000701", "answers": [{"date": "2012-04-03T20:22:53.513", "user": "ClassicThunder (730573)"}, {"date": "2012-04-03T20:26:31.620", "user": "Jmyster (1070216)"}], "tag": ["c#", "swift-mt"], "user": "MadBoy (218540)", "creationDate": "2012-04-03T20:15:56.793"} +{"title": "Will else-is resolve if the if statement above it is chosen?", "qid": "10000703", "answers": [{"date": "2012-04-03T20:17:53.517", "user": "jason (45914)"}, {"date": "2012-04-03T20:18:48.807", "user": "idish (1203043)"}, {"date": "2012-04-03T20:19:45.293", "user": "Oliver Charlesworth (129570)"}, {"date": "2012-04-03T20:20:25.730", "user": "Jerry Coffin (179910)"}, {"date": "2012-04-03T20:23:57.410", "user": "nate_weldon (1209369)"}], "tag": ["c++", "if-statement"], "user": "Portaljacker (468539)", "creationDate": "2012-04-03T20:16:04.143"} +{"title": "How do I delete a bad commit, while keeping later commits?", "qid": "10000716", "answers": [{"date": "2012-04-03T20:19:20.700", "user": "Stuart Golodetz (499449)"}, {"date": "2012-04-03T20:22:16.277", "user": "Alex Vidal (237211)"}, {"date": "2012-04-03T20:41:51.737", "user": "stewe (511300)"}, {"date": "2012-04-03T20:47:31.990", "user": "GoZoner (1286639)"}], "tag": ["git"], "user": "Matt Fenwick (894284)", "creationDate": "2012-04-03T20:16:54.520"} +{"title": "Deleting from a small table referenced by a large table", "qid": "10000718", "answers": [{"date": "2012-04-03T20:27:32.717", "user": "Firoz Ansari (1100452)"}, {"date": "2012-04-03T20:29:59.293", "user": "Randy (318749)"}, {"date": "2012-04-03T20:31:01.653", "user": "Michael Fredrickson (643591)"}, {"date": "2012-04-03T20:40:29.123", "user": "HLGEM (9034)"}], "tag": ["sql", "sql-server", "performance", "sql-delete"], "user": "Ryan (17917)", "creationDate": "2012-04-03T20:17:10.457"} +{"title": "visual studio swprintf is making all my %s formatters want wchar_t * instead of char *", "qid": "10000723", "answers": [{"date": "2012-04-03T20:25:31.237", "user": "Neil (182705)"}, {"date": "2012-04-03T20:54:45.763", "user": "Anders (3501)"}, {"date": "2014-11-22T00:36:42.877", "user": "paveo (4280617)"}], "tag": ["visual-studio", "printf"], "user": "Medran (254530)", "creationDate": "2012-04-03T20:17:22.630"} +{"title": "Calling MySQL functions in Lithium", "qid": "10000727", "answers": [{"date": "2012-04-03T22:07:41.343", "user": "ton.yeung (860947)"}], "tag": ["php", "mysql", "crud", "lithium"], "user": "drelkata (1125391)", "creationDate": "2012-04-03T20:17:35.683"} +{"title": "Facebook Auth Dialog - Adjusting the text displayed", "qid": "10000728", "answers": [{"date": "2012-04-03T20:44:20.463", "user": "Ben Carey (1046010)"}, {"date": "2012-04-04T08:30:07.797", "user": "James Arnold (1014570)"}], "tag": ["php", "facebook", "api", "authentication"], "user": "christian.thomas (710495)", "creationDate": "2012-04-03T20:17:36.590"} +{"title": "Array driving me loop(y)", "qid": "10000732", "answers": [{"date": "2012-04-03T20:21:59.197", "user": "David Nguyen (735556)"}, {"date": "2012-04-03T20:22:51.013", "user": "Deleteman (955697)"}, {"date": "2012-04-03T20:22:58.163", "user": "Michael Berkowski (541091)"}, {"date": "2012-04-03T20:27:52.853", "user": "anubhava (548225)"}], "tag": ["php", "arrays", "loops"], "user": "Bob Liu (1014766)", "creationDate": "2012-04-03T20:17:46.217"} +{"title": "MySQL why does my auto increment not start at 1 when doing inserts?", "qid": "10000736", "answers": [{"date": "2012-04-03T20:21:33.843", "user": "BluesRockAddict (754042)"}, {"date": "2012-04-03T20:24:34.210", "user": "Matt Fenwick (894284)"}, {"date": "2012-04-03T20:26:04.163", "user": "\u2126mega (1215106)"}, {"date": "2015-06-11T07:26:32.173", "user": "Sunil Garg (2172547)"}, {"date": "2016-01-28T06:41:14.830", "user": "vishal sharma (2200329)"}], "tag": ["mysql", "insert", "auto-increment"], "user": "stackoverflow (745835)", "creationDate": "2012-04-03T20:17:57.607"} +{"title": "What in-app advertising framework should I use?", "qid": "10000739", "answers": [{"date": "2012-04-03T20:25:26.447", "user": "HoratioCain (82895)"}, {"date": "2012-04-17T23:43:50.070", "user": "Tatina Monras (1340001)"}, {"date": "2012-11-22T15:07:31.933", "user": "Hellfire73 (1252317)"}, {"date": "2012-11-22T16:47:22.713", "user": "Srihari Karanth (1447507)"}], "tag": ["android", "admob", "adsense", "advertising", "mopub"], "user": "bengan (1160807)", "creationDate": "2012-04-03T20:18:22.673"} +{"title": "BCrypt very slow in app engine application", "qid": "10000740", "answers": [{"date": "2012-04-04T09:16:42.947", "user": "Florian (523653)"}, {"date": "2012-04-05T07:45:55.460", "user": "timbo (127660)"}], "tag": ["java", "performance", "google-app-engine", "permissions", "classloader"], "user": "ptflix (1267917)", "creationDate": "2012-04-03T20:18:26.313"} +{"title": "Content Loading", "qid": "1000075", "answers": [{"date": "2009-06-16T07:57:05.717", "user": "jitter (122428)"}, {"date": "2009-06-16T07:57:06.450", "user": "Sev (83819)"}, {"date": "2009-06-16T08:31:35.850", "user": "Alsciende (119195)"}], "tag": ["html", "xhtml", "stylesheet"], "user": "Saravanan (115389)", "creationDate": "2009-06-16T07:51:32.000"} +{"title": "Keep value state in apex page", "qid": "10000751", "answers": [{"date": "2012-04-03T20:22:26.810", "user": "idish (1203043)"}, {"date": "2012-04-04T14:15:54.863", "user": "Yann39 (1274485)"}], "tag": ["oracle-apex"], "user": "avatar713 (1031525)", "creationDate": "2012-04-03T20:19:15.377"} +{"title": "logical error using eof(), begginer level need advice with debugging", "qid": "10000755", "answers": [{"date": "2012-04-03T20:24:28.863", "user": "DRVic (1232878)"}, {"date": "2012-04-03T20:25:05.663", "user": "Rob\u1d69 (8747)"}], "tag": ["c++", "debugging", "logic", "eof"], "user": "D3vin1123 (1311343)", "creationDate": "2012-04-03T20:19:32.350"} +{"title": "ShareKit2.0 opens Facebook mobile but fails to redirect. Safari says page is invalid", "qid": "10000756", "answers": [{"date": "2012-04-17T17:44:57.030", "user": "Rwky (268366)"}], "tag": ["facebook", "cordova", "sharekit", "phonegap-plugins", "ios5"], "user": "emersonthis (1141918)", "creationDate": "2012-04-03T20:19:35.083"} +{"title": "How do I know when an Amazon EC2 operation is complete?", "qid": "10000757", "answers": [{"date": "2012-04-03T21:02:42.327", "user": "bwight (1046468)"}, {"date": "2012-04-05T22:06:11.503", "user": "David Rubin (9858)"}], "tag": ["amazon-ec2", "amazon-web-services", "ec2-ami"], "user": "David Rubin (9858)", "creationDate": "2012-04-03T20:19:43.047"} +{"title": "Drupal 7: How do I import a RSS feed?", "qid": "10000761", "answers": [{"date": "2012-04-03T20:25:57.940", "user": "nmc (727439)"}, {"date": "2012-04-03T20:26:13.103", "user": "mcaesar (1200603)"}], "tag": ["drupal", "rss", "drupal-7"], "user": "user1311308 (1311308)", "creationDate": "2012-04-03T20:19:54.970"} +{"title": "Symfony2 Swiftmailer Not Sending", "qid": "10000763", "answers": [{"date": "2012-04-05T12:32:47.453", "user": "Dieter (707968)"}, {"date": "2012-09-19T07:28:50.690", "user": "Milo\u0161 (1165041)"}, {"date": "2013-04-11T06:51:58.483", "user": "smentek (262406)"}, {"date": "2013-10-09T22:18:14.243", "user": "Marcos Labad (2337005)"}, {"date": "2014-06-06T16:19:41.003", "user": "0x1gene (2071284)"}, {"date": "2015-04-28T07:55:24.240", "user": "websky (3730154)"}], "tag": ["symfony2", "swiftmailer"], "user": "Shawn Northrop (1076173)", "creationDate": "2012-04-03T20:20:09.273"} +{"title": "PHP-FPM + nginx 1.1.15 Custom error pages", "qid": "10000766", "answers": [], "tag": ["nginx", "php-fpm"], "user": "Diman (1311332)", "creationDate": "2012-04-03T20:20:11.817"} +{"title": "JAX-WS client in websphere with custom ssl socket factory", "qid": "1000077", "answers": [{"date": "2009-09-30T08:54:34.263", "user": "David Nouls (1450778)"}, {"date": "2011-05-23T13:07:10.290", "user": "Stefan Rasmusson (310852)"}], "tag": ["java", "web-services", "websphere"], "user": "David Nouls (1450778)", "creationDate": "2009-06-16T07:51:43.653"} +{"title": "iPhone App, server-side component, parse integration", "qid": "10000774", "answers": [{"date": "2012-04-03T20:36:00.677", "user": "Cliff (10631)"}, {"date": "2012-04-03T20:39:27.610", "user": "Dan Ray (335415)"}], "tag": ["iphone", "ios", "push-notification"], "user": "mnort9 (1228914)", "creationDate": "2012-04-03T20:20:48.350"} +{"title": "javascript mouse event compatibility issue between browsers", "qid": "10000775", "answers": [{"date": "2012-04-03T20:32:45.790", "user": "Jack M (815612)"}, {"date": "2012-04-03T20:36:09.327", "user": "Simon Forsberg (1310566)"}], "tag": ["javascript", "html5", "mouseevent", "cross-browser"], "user": "Perex19 (684608)", "creationDate": "2012-04-03T20:20:54.890"} +{"title": "OpenGL 3: glBindVertexArray invalidates GL_ELEMENT_ARRAY_BUFFER", "qid": "10000776", "answers": [{"date": "2012-04-07T16:09:39.613", "user": "Nicol Bolas (734069)"}], "tag": ["c++", "opengl", "nvidia", "opengl-3"], "user": "ComicSansMS (577603)", "creationDate": "2012-04-03T20:21:13.623"} +{"title": "Popup window on button click", "qid": "10000778", "answers": [{"date": "2012-04-04T17:18:16.683", "user": "Pawel Biernacki (1311329)"}], "tag": ["pyside"], "user": "Pawel Biernacki (1311329)", "creationDate": "2012-04-03T20:21:18.103"} +{"title": "Update part text value within href in div", "qid": "10000779", "answers": [{"date": "2012-04-03T20:23:38.133", "user": "d_inevitable (1238764)"}, {"date": "2012-04-03T20:24:09.210", "user": "christian.thomas (710495)"}, {"date": "2012-04-03T20:24:15.293", "user": "ShankarSangoli (772055)"}, {"date": "2012-04-03T20:24:57.960", "user": "RyanS (1310604)"}], "tag": ["javascript", "jquery"], "user": "blue-sky (470184)", "creationDate": "2012-04-03T20:21:21.970"} +{"title": "Can't get mac address with ioctl on Linux when disconnected from Wifi", "qid": "10000790", "answers": [{"date": "2012-04-09T17:01:11.200", "user": "Butaca (921769)"}], "tag": ["linux", "mac-address", "ioctl"], "user": "Butaca (921769)", "creationDate": "2012-04-03T20:22:13.610"} +{"title": "Facebook PHP: After user logs out of facebook, they can't login to my app with another user", "qid": "10000792", "answers": [{"date": "2012-04-03T20:55:07.137", "user": "Shawn E Carter (912623)"}, {"date": "2012-04-04T10:46:27.210", "user": "Sabrina Gelbart (796437)"}, {"date": "2012-12-11T10:25:05.817", "user": "FlyingAtom (1176094)"}], "tag": ["php", "facebook"], "user": "Sabrina Gelbart (796437)", "creationDate": "2012-04-03T20:22:24.717"} +{"title": "How can I dynamically switch div id's", "qid": "10000793", "answers": [{"date": "2012-04-03T20:24:48.583", "user": "Luca Rocchi (282484)"}, {"date": "2012-04-03T20:27:05.303", "user": "jnylen (106302)"}], "tag": ["css", "html", "website"], "user": "Andrew Fairbairn (1311333)", "creationDate": "2012-04-03T20:22:24.853"} +{"title": "How can I cancel the selecting Event for a TabControl", "qid": "10000798", "answers": [{"date": "2012-04-03T20:29:55.247", "user": "Tigran (156695)"}, {"date": "2012-04-03T20:50:56.327", "user": "Hans Passant (17034)"}], "tag": ["c#", "winforms", "tabcontrol"], "user": "fbhdev (1106331)", "creationDate": "2012-04-03T20:22:38.477"} +{"title": "css divs align in Chrome (18) and Firefox (11) but not in Safari (5.1). cannot figure out why", "qid": "10000806", "answers": [{"date": "2012-04-03T20:28:31.373", "user": "Khan (212566)"}, {"date": "2012-04-07T21:00:31.460", "user": "user1263003 (1263003)"}], "tag": ["css", "firefox", "google-chrome", "html", "safari"], "user": "user1263003 (1263003)", "creationDate": "2012-04-03T20:23:04.757"} +{"title": "Hiding the soft keyboard in MonoDroid", "qid": "10000807", "answers": [{"date": "2012-04-03T20:31:54.510", "user": "Jon O (429108)"}, {"date": "2012-04-03T20:44:02.443", "user": "Greg Shackles (170333)"}, {"date": "2013-01-03T09:12:34.457", "user": "PCoder (782094)"}, {"date": "2013-02-06T10:32:36.340", "user": "Roosevelt (851490)"}, {"date": "2013-02-06T12:30:27.770", "user": "Prerana (1792238)"}], "tag": ["android", "monodroid", "android-softkeyboard"], "user": "The Mighty Skunk (1229802)", "creationDate": "2012-04-03T20:23:14.073"} +{"title": "MySQL error 1248, Creating proper query. x3 Natural Joins", "qid": "10000809", "answers": [{"date": "2012-04-03T21:09:49.840", "user": "Crontab (979007)"}, {"date": "2012-04-03T21:16:11.017", "user": "ypercube\u1d40\u1d39 (344949)"}, {"date": "2012-04-04T06:30:12.560", "user": "Unos (240901)"}], "tag": ["mysql"], "user": "user1311286", "creationDate": "2012-04-03T20:23:28.630"} +{"title": "Android Media.insertImage and retrieve image from sd card", "qid": "10000813", "answers": [{"date": "2012-04-03T20:58:47.460", "user": "onit (897868)"}], "tag": ["java", "android"], "user": "bflosabre91 (339673)", "creationDate": "2012-04-03T20:23:33.850"} +{"title": "Neo4j for front end HTML", "qid": "10000817", "answers": [], "tag": ["javascript", "html", "graph", "neo4j", "graph-databases"], "user": "Ryan (386739)", "creationDate": "2012-04-03T20:23:49.140"} +{"title": "Application that zooms to a specific part of the desktop", "qid": "10000818", "answers": [{"date": "2012-04-03T20:27:32.853", "user": "Jon Cage (15369)"}, {"date": "2012-04-04T19:48:46.903", "user": "vrince (659003)"}], "tag": ["c++", "linux", "qt", "opengl", "desktop"], "user": "paulAl (1262170)", "creationDate": "2012-04-03T20:23:53.140"} +{"title": "Ajax callback function causes me to pass too many parameters that are not used", "qid": "10000831", "answers": [{"date": "2012-04-03T21:22:30.087", "user": "Paul Grime (319878)"}], "tag": ["javascript", "ajax"], "user": "user656925", "creationDate": "2012-04-03T20:24:50.733"} +{"title": "nodejs ExpressJS routes only working for index", "qid": "10000837", "answers": [{"date": "2012-04-04T07:39:35.830", "user": "mihai (865038)"}, {"date": "2012-04-10T21:12:20.597", "user": "cmcculloh (58)"}, {"date": "2012-04-21T18:09:27.997", "user": "Jason (136584)"}, {"date": "2014-04-03T18:46:06.393", "user": "user2393426 (2393426)"}], "tag": ["javascript", "node.js", "express"], "user": "dzm (245076)", "creationDate": "2012-04-03T20:24:59.207"} +{"title": "How to separate date and time from a datetime?", "qid": "10000839", "answers": [{"date": "2012-04-03T20:28:02.057", "user": "Corbin (567864)"}, {"date": "2012-04-03T20:33:17.810", "user": "pratik garg (617722)"}], "tag": ["sql", "sql-server"], "user": "Rasheed Khalil Salem (1276648)", "creationDate": "2012-04-03T20:25:08.570"} +{"title": "Powershell - calling remote WMI objects - RPC error HRESULT: 0x800706BA (RPC server not available)", "qid": "1000084", "answers": [{"date": "2009-08-19T19:02:31.573", "user": "Daryn (135114)"}], "tag": ["powershell", "wmi", "rpc", "remote-administration", "win32-process"], "user": "Crank (18859)", "creationDate": "2009-06-16T07:54:17.143"} +{"title": "To sort date(which is in the form 'january 2001') starting from January to December", "qid": "10000842", "answers": [{"date": "2012-04-03T20:31:44.977", "user": "Angelo Fuchs (881272)"}, {"date": "2012-04-03T21:03:04.680", "user": "Justin Pihony (779513)"}], "tag": ["sql", "sql-server-2008", "tsql"], "user": "user1176058 (1176058)", "creationDate": "2012-04-03T20:25:24.137"} +{"title": "Group DateTime rows in datatable by DateTime - C#", "qid": "10000848", "answers": [{"date": "2012-04-03T20:32:28.627", "user": "Aducci (469533)"}, {"date": "2012-04-03T20:38:18.407", "user": "James Johnson (879420)"}, {"date": "2012-04-03T20:38:41.837", "user": "StriplingWarrior (120955)"}, {"date": "2012-04-03T20:55:48.290", "user": "David Nelson (46783)"}], "tag": ["c#", "linq", "datetime", "datatable", "group-by"], "user": "Vijay (1311339)", "creationDate": "2012-04-03T20:25:37.413"} +{"title": "Appending file results in overwrite (Java)", "qid": "10000850", "answers": [{"date": "2012-04-03T20:27:33.620", "user": "ulmangt (1212363)"}, {"date": "2012-04-03T20:28:08.313", "user": "Jack Edmonds (61663)"}, {"date": "2012-04-03T20:29:25.540", "user": "Angelo Fuchs (881272)"}, {"date": "2012-04-03T20:30:01.577", "user": "ControlAltDel (1291492)"}, {"date": "2013-09-23T05:49:15.117", "user": "Prasad (2041986)"}], "tag": ["java", "file", "new-operator"], "user": "yawnobleix (1308355)", "creationDate": "2012-04-03T20:25:56.057"} +{"title": "click() does not work with links", "qid": "10000852", "answers": [{"date": "2012-04-03T20:35:45.887", "user": "Chris Baker (610573)"}, {"date": "2012-04-03T20:39:54.847", "user": "mcaesar (1200603)"}], "tag": ["javascript", "html", "javascript-events", "click"], "user": "MarkM (897931)", "creationDate": "2012-04-03T20:25:58.080"} +{"title": "Google Map Geocode API returns only top 6 results...How do I get more?", "qid": "10000857", "answers": [{"date": "2012-04-03T22:29:26.370", "user": "javram (1264609)"}], "tag": ["api", "google-maps"], "user": "bennyB (1311344)", "creationDate": "2012-04-03T20:26:18.533"} +{"title": "Javascript not running from address bar", "qid": "10000862", "answers": [{"date": "2012-04-03T20:29:50.860", "user": "Jonathan Protzenko (873567)"}], "tag": ["javascript"], "user": "aakashbhowmick (364651)", "creationDate": "2012-04-03T20:26:43.047"} +{"title": "How to display the current title from a json request", "qid": "10000874", "answers": [{"date": "2012-04-03T20:33:16.100", "user": "Jacob (119549)"}], "tag": ["javascript", "json", "while-loop", "brightcove"], "user": "TikaL13 (237153)", "creationDate": "2012-04-03T20:27:32.530"} +{"title": "does heroku support jruby for Rails 3.2.3?", "qid": "10000887", "answers": [{"date": "2012-04-04T15:01:31.067", "user": "J_McCaffrey (318699)"}, {"date": "2012-09-16T16:22:14.663", "user": "Blue Smith (1405852)"}], "tag": ["heroku", "jruby", "ruby-on-rails-3.2"], "user": "Bhushan Lodha (1033503)", "creationDate": "2012-04-03T20:28:17.987"} +{"title": "Check if char exists in java", "qid": "10000888", "answers": [{"date": "2012-04-03T20:29:28.893", "user": "biziclop (574479)"}, {"date": "2012-04-03T20:49:49.617", "user": "Cratylus (384706)"}], "tag": ["java"], "user": "HaniAA (1311352)", "creationDate": "2012-04-03T20:28:20.233"} +{"title": "Rails: search by SQL with different models", "qid": "10000889", "answers": [{"date": "2012-04-03T20:56:54.033", "user": "MrTheWalrus (763096)"}], "tag": ["ruby-on-rails", "ruby-on-rails-3", "search"], "user": "ANATHEM (816291)", "creationDate": "2012-04-03T20:28:27.270"} +{"title": "How to sort xml data using classic asp(vbscript) with out xpath?", "qid": "1000089", "answers": [{"date": "2009-06-16T08:00:48.800", "user": "Sev (83819)"}], "tag": ["xml", "asp-classic", "vbscript"], "user": "Alex (122677)", "creationDate": "2009-06-16T07:55:08.543"} +{"title": "Applying strsplit function for multiple files", "qid": "10000893", "answers": [{"date": "2012-04-03T21:41:09.717", "user": "daroczig (564164)"}], "tag": ["r", "lapply", "strsplit"], "user": "Achak (1187938)", "creationDate": "2012-04-03T20:28:55.350"} +{"title": "Hibernate: reuse persisted class in a persistent collection", "qid": "10000896", "answers": [{"date": "2012-04-03T22:10:24.117", "user": "Piotr Kocha\u0144ski (34102)"}], "tag": ["java", "hibernate"], "user": "schmmd (568393)", "creationDate": "2012-04-03T20:29:14.150"} +{"title": "How to slow down posting using fb app?", "qid": "10000900", "answers": [{"date": "2012-04-03T20:44:19.473", "user": "Shawn E Carter (912623)"}], "tag": ["facebook", "facebook-graph-api", "cron", "facebook-php-sdk", "crontab"], "user": "Abdullah Adam (1275475)", "creationDate": "2012-04-03T20:29:22.873"} +{"title": "Rails executing if and else statements", "qid": "10000906", "answers": [{"date": "2012-04-05T06:38:14.937", "user": "Vladson (971405)"}], "tag": ["ruby-on-rails"], "user": "petfreshman (1311338)", "creationDate": "2012-04-03T20:29:37.287"} +{"title": "How to prevent \"A potentially dangerous Request.Form\" in a request", "qid": "10000908", "answers": [{"date": "2012-04-03T20:32:04.320", "user": "Darin Dimitrov (29407)"}], "tag": ["c#", ".net", "html", "security"], "user": "markzzz (365251)", "creationDate": "2012-04-03T20:29:39.940"} +{"title": "command line arguments array", "qid": "1000091", "answers": [{"date": "2009-06-16T08:03:22.680", "user": "Dan F (11569)"}, {"date": "2009-06-16T08:03:38.593", "user": "Binary Worrier (18797)"}, {"date": "2009-06-16T08:05:53.957", "user": "Marc Gravell (23354)"}], "tag": ["c#", "command-line"], "user": "web dunia (79631)", "creationDate": "2009-06-16T07:55:34.287"} +{"title": "New to python Creating two Dictionaries from a file need specific lines", "qid": "10000917", "answers": [{"date": "2012-04-04T00:06:09.637", "user": "Nolen Royalty (1179026)"}], "tag": ["python", "dictionary"], "user": "crazy99 (1311346)", "creationDate": "2012-04-03T20:30:00.983"} +{"title": "Two classes in a larger class share data", "qid": "10000918", "answers": [{"date": "2012-04-03T20:31:38.957", "user": "spencercw (766580)"}, {"date": "2012-04-03T20:32:27.270", "user": "Stuart Golodetz (499449)"}, {"date": "2012-04-03T20:33:44.423", "user": "Luchian Grigore (673730)"}], "tag": ["c++", "class", "inheritance"], "user": "Oatskits (1118035)", "creationDate": "2012-04-03T20:30:01.560"} +{"title": "Why do I get uninitialized-value warnings from Valgrind when I use Boost UUID?", "qid": "10000920", "answers": [{"date": "2012-04-03T20:53:04.580", "user": "ildjarn (636019)"}], "tag": ["c++", "boost", "valgrind", "boost-uuid"], "user": "Ockonal (87152)", "creationDate": "2012-04-03T20:30:13.543"} +{"title": "GWT Canvas2D draw Image", "qid": "10000921", "answers": [{"date": "2012-04-03T20:50:05.453", "user": "fgb (298029)"}, {"date": "2012-05-09T03:27:34.803", "user": "Stephane Grenier (39371)"}, {"date": "2013-06-04T16:40:09.887", "user": "kjohnson (2452465)"}], "tag": ["gwt", "canvas"], "user": "Robert Hahn (940300)", "creationDate": "2012-04-03T20:30:15.960"} +{"title": "Json/Gson issue - Why am I getting null?", "qid": "10000922", "answers": [{"date": "2012-04-03T20:33:25.100", "user": "Lirik (28760)"}], "tag": ["java", "json", "gson"], "user": "Burferd (601993)", "creationDate": "2012-04-03T20:30:16.193"} +{"title": "Passing Multiple Parameter in crystal reports from VB.Net", "qid": "10000924", "answers": [{"date": "2012-04-06T14:15:08.990", "user": "Justin (945436)"}], "tag": ["parameters", "crystal-reports-xi"], "user": "Sensa (1289409)", "creationDate": "2012-04-03T20:30:39.877"} +{"title": "Opengl linux undefined reference to basic functions", "qid": "10000925", "answers": [{"date": "2012-04-03T20:43:22.023", "user": "Mat (635608)"}], "tag": ["c++", "linux", "opengl"], "user": "comp sci balla (494187)", "creationDate": "2012-04-03T20:30:42.340"} +{"title": "How can I overlay timeseries models for exponential decay into ggplot2 graphics?", "qid": "10000926", "answers": [{"date": "2012-04-03T20:48:38.620", "user": "Ben Bolker (190277)"}], "tag": ["r", "ggplot2", "time-series", "exponential"], "user": "Mittenchops (1052117)", "creationDate": "2012-04-03T20:30:46.693"} +{"title": "jQuery MultiSelect Widget", "qid": "10000928", "answers": [{"date": "2012-04-03T20:56:56.483", "user": "Dan A. (537166)"}, {"date": "2012-08-15T22:00:11.207", "user": "Gil Birman (1102215)"}], "tag": ["jquery", "widget", "multi-select"], "user": "Residual Envy (973181)", "creationDate": "2012-04-03T20:30:49.470"} +{"title": "Centering an image with CSS position absolute", "qid": "10000930", "answers": [{"date": "2012-04-03T20:47:36.420", "user": "Simon Forsberg (1310566)"}], "tag": ["html", "css", "image", "center", "alignment"], "user": "user979331 (979331)", "creationDate": "2012-04-03T20:30:50.843"} +{"title": "Objective-C and ASIHTTPRequest - response string problems", "qid": "1000094", "answers": [{"date": "2009-06-16T08:07:07.247", "user": "fredrik"}, {"date": "2009-06-16T09:59:09.887", "user": "fredrik"}, {"date": "2009-06-16T11:16:40.760", "user": "Valerii Hiora (119347)"}], "tag": ["iphone", "objective-c", "nsstring"], "user": "fredrik", "creationDate": "2009-06-16T07:57:21.317"} +{"title": "PHP Memory limit not taking effect in normal php scripts", "qid": "10000944", "answers": [{"date": "2012-04-03T20:40:02.290", "user": "ArendE (1271978)"}, {"date": "2012-04-03T20:40:34.053", "user": "Matthew Blancarte (614152)"}, {"date": "2012-04-03T20:55:10.133", "user": "craniumonempty (540753)"}, {"date": "2012-04-03T21:03:24.743", "user": "dAm2K (1250381)"}, {"date": "2013-08-27T10:00:14.580", "user": "Barry Kooij (1430228)"}, {"date": "2013-10-21T09:35:12.303", "user": "Benjamin Piette (924939)"}], "tag": ["php", "mysql", "wordpress"], "user": "Darrell Ding (1311361)", "creationDate": "2012-04-03T20:31:47.927"} +{"title": "How to set initial data for Django admin model add instance form?", "qid": "10000950", "answers": [{"date": "2012-04-03T21:16:06.913", "user": "Alasdair (113962)"}, {"date": "2015-06-28T01:16:14.647", "user": "radev (3017644)"}, {"date": "2015-11-11T10:37:14.877", "user": "Wtower (940098)"}], "tag": ["django", "forms", "model", "admin"], "user": "Martijn de Milliano (979956)", "creationDate": "2012-04-03T20:32:03.043"} +{"title": "Running apschduler in Python script as a daemon?", "qid": "10000952", "answers": [{"date": "2012-10-02T20:50:35.313", "user": "KAcper Perschke (1708028)"}], "tag": ["python"], "user": "daydreamer (379235)", "creationDate": "2012-04-03T20:32:04.947"} +{"title": "Making Submit and Reset have a different border from the input tag border", "qid": "10000956", "answers": [{"date": "2012-04-03T20:34:17.753", "user": "David Nguyen (735556)"}, {"date": "2012-04-03T20:35:13.993", "user": "user1219742"}], "tag": ["html", "css"], "user": "user652792", "creationDate": "2012-04-03T20:32:33.590"} +{"title": "How can I run this query for each id in a table", "qid": "10000961", "answers": [{"date": "2012-04-03T20:34:01.920", "user": "SQLMenace (740)"}], "tag": ["sql", "database", "select", "set"], "user": "dido (1243960)", "creationDate": "2012-04-03T20:33:07.957"} +{"title": "Trying to set symfony locale to something else than fr and en_US", "qid": "10000966", "answers": [{"date": "2012-04-04T10:18:18.457", "user": "Kosta (1197506)"}], "tag": ["php", "symfony2", "translation"], "user": "George Gkirtsou (1294631)", "creationDate": "2012-04-03T20:33:31.387"} +{"title": "Access WCF service from machine other than localhost", "qid": "10000969", "answers": [{"date": "2012-04-03T20:54:54.653", "user": "David Hoerster (237808)"}, {"date": "2012-04-03T20:58:16.877", "user": "David Nelson (46783)"}], "tag": ["c#", "wcf"], "user": "Poul (237721)", "creationDate": "2012-04-03T20:33:43.760"} +{"title": "expression after group by has same result", "qid": "10000974", "answers": [{"date": "2012-04-03T20:48:21.083", "user": "greut (122978)"}], "tag": ["sqlite"], "user": "userbb (665031)", "creationDate": "2012-04-03T20:33:59.687"} +{"title": "What's the best way of implementation QProcess, which reading stdout and stderr in \"real time\"?", "qid": "10000982", "answers": [{"date": "2012-04-03T20:45:02.183", "user": "MSalters (15416)"}], "tag": ["c++", "multithreading", "qt"], "user": "G-71 (490908)", "creationDate": "2012-04-03T20:34:38.193"} +{"title": "Java for Android - how to create event listener for boolean variable", "qid": "10000983", "answers": [{"date": "2012-04-03T20:45:49.417", "user": "Seva Alekseyev (219159)"}, {"date": "2012-04-03T20:55:29.897", "user": "user1288802 (1288802)"}], "tag": ["java", "android", "boolean", "eventlistener"], "user": "Lee Hall (1311357)", "creationDate": "2012-04-03T20:34:41.467"} +{"title": "Android vertical center", "qid": "10000986", "answers": [{"date": "2012-04-03T20:51:24.703", "user": "Jon O (429108)"}, {"date": "2012-04-03T20:52:18.697", "user": "Davek804 (1231943)"}], "tag": ["android"], "user": "erdomester (571648)", "creationDate": "2012-04-03T20:35:05.740"} +{"title": "SignalR not broadcasting", "qid": "10000987", "answers": [{"date": "2012-04-04T01:42:32.867", "user": "drch (955881)"}], "tag": ["model-view-controller", "signalr"], "user": "Jonesie (98406)", "creationDate": "2012-04-03T20:35:06.210"} +{"title": "How do I use rank() with an inner join?", "qid": "10000991", "answers": [{"date": "2012-04-03T20:46:01.900", "user": "Justin Cave (10397)"}], "tag": ["oracle11g", "inner-join", "oracle-analytics"], "user": "zundarz (780477)", "creationDate": "2012-04-03T20:35:32.733"} +{"title": "Why doesn't this throw a SyntaxError instead of silently interpreting it wrong?", "qid": "10000999", "answers": [{"date": "2012-04-03T20:38:13.507", "user": "Latty (722121)"}, {"date": "2012-04-03T20:38:14.740", "user": "Mark Ransom (5987)"}], "tag": ["python"], "user": "Nathan (88905)", "creationDate": "2012-04-03T20:36:07.257"} +{"title": "\"Edit and Continue\" doesn't work - VS2010 with TFS - Locked files in the Solution", "qid": "10001002", "answers": [{"date": "2012-04-28T22:45:15.410", "user": "lamarmora (360135)"}], "tag": ["visual-studio", "visual-studio-2010", "tfs", "edit-and-continue", "locked-files"], "user": "lamarmora (360135)", "creationDate": "2012-04-03T20:36:27.333"} +{"title": "Fluent NHibernate automapping table per hierarchy: can I split a hierarchy?", "qid": "10001008", "answers": [{"date": "2012-04-03T21:26:33.347", "user": "Nikolay (204521)"}], "tag": ["c#", "nhibernate", "fluent"], "user": "Brian (166882)", "creationDate": "2012-04-03T20:37:29.833"} +{"title": "Basic difference between .net 3.5 and 4.0", "qid": "1000101", "answers": [{"date": "2009-06-16T08:01:45.103", "user": "Mischa Kroon (30600)"}, {"date": "2009-06-16T08:06:39.697", "user": "Micha\u0142 Chaniewski (119800)"}, {"date": "2009-06-16T11:01:03.303", "user": "Richard (67392)"}, {"date": "2012-07-03T10:27:52.103", "user": "bresleveloper (1369989)"}, {"date": "2012-09-14T17:11:23.660", "user": "Mohammad Shahnawaz (1672032)"}, {"date": "2010-05-07T15:27:46.900", "user": "kacalapy (352157)"}, {"date": "2010-05-07T15:40:31.580", "user": "Lance May (312294)"}], "tag": [".net", "comparison"], "user": "jignesh", "creationDate": "2009-06-16T07:59:08.257"} +{"title": "Write EXIF into JPG with PHP", "qid": "10001012", "answers": [{"date": "2012-04-04T12:01:32.367", "user": "Terence Eden (1127699)"}, {"date": "2012-04-04T12:37:06.360", "user": "Annabel (571252)"}], "tag": ["php", "exif", "imagick"], "user": "CesarTrigo (1311342)", "creationDate": "2012-04-03T20:37:43.477"} +{"title": "Update shared libraries without restarting processes", "qid": "10001013", "answers": [{"date": "2012-04-03T20:57:31.053", "user": "johnshen64 (1231364)"}, {"date": "2012-04-03T21:07:44.443", "user": "bmargulies (131433)"}, {"date": "2012-04-03T21:25:16.603", "user": "dAm2K (1250381)"}, {"date": "2012-04-03T22:05:26.307", "user": "user1277476 (1277476)"}, {"date": "2012-04-03T22:28:07.710", "user": "SquareRootOfTwentyThree (482262)"}, {"date": "2012-04-03T23:46:10.213", "user": "Zan Lynx (13422)"}, {"date": "2012-04-04T12:14:03.927", "user": "Arkadiy (3458)"}, {"date": "2013-03-18T09:22:32.283", "user": "FCBusquest (2181657)"}], "tag": ["c", "linux", "dll", "shared-libraries"], "user": "Manohar (972659)", "creationDate": "2012-04-03T20:37:51.997"} +{"title": "Textarea list via jquery .ajax to php", "qid": "10001015", "answers": [{"date": "2012-04-03T20:45:18.903", "user": "marue (581421)"}, {"date": "2012-04-03T20:47:24.827", "user": "Sander Bruggeman (865206)"}], "tag": ["php", "jquery", "ajax", "textarea"], "user": "Gene R (26121)", "creationDate": "2012-04-03T20:37:59.887"} +{"title": "hg shelve equivalent of git stash drop", "qid": "10001017", "answers": [{"date": "2012-04-03T20:41:06.283", "user": "undefined (610585)"}, {"date": "2012-05-01T19:22:22.343", "user": "minaz (606874)"}, {"date": "2013-01-31T18:37:26.893", "user": "mpen (65387)"}, {"date": "2014-08-28T21:23:27.467", "user": "BennyMcBenBen (364029)"}], "tag": ["mercurial"], "user": "undefined (610585)", "creationDate": "2012-04-03T20:38:04.227"} +{"title": "Changing MySQL checks from 'programside' to the MySQL server itself", "qid": "10001023", "answers": [{"date": "2012-04-03T20:43:47.327", "user": "scwagner (3981)"}], "tag": ["python", "sql", "sqlite", "python-3.x"], "user": "wvd (312700)", "creationDate": "2012-04-03T20:38:24.663"} +{"title": "Lightweight migration of a NSPersistentDocument", "qid": "10001026", "answers": [{"date": "2012-04-03T20:50:22.410", "user": "Martin Pilkington (50185)"}, {"date": "2012-04-04T04:13:24.860", "user": "Marcus S. Zarra (10673)"}, {"date": "2012-04-04T23:48:31.860", "user": "chockenberry (132867)"}, {"date": "2012-04-05T08:14:39.387", "user": "Z S (145552)"}], "tag": ["objective-c", "cocoa", "core-data", "osx-lion", "nspersistentdocument"], "user": "chockenberry (132867)", "creationDate": "2012-04-03T20:38:46.977"} +{"title": "How do I access this Javascript array (JSON object?)?", "qid": "10001028", "answers": [{"date": "2012-04-03T20:40:58.390", "user": "Mathias Bynens (96656)"}, {"date": "2012-04-03T20:43:53.837", "user": "mihai (865038)"}], "tag": ["php", "javascript", "jquery", "string"], "user": "Johnathan Au (1279200)", "creationDate": "2012-04-03T20:38:53.507"} +{"title": "How can I prevent a method from mutating its arguments?", "qid": "10001031", "answers": [{"date": "2012-04-03T20:58:04.217", "user": "Dominik Honnef (309058)"}, {"date": "2012-04-03T20:58:19.303", "user": "knut (676874)"}], "tag": ["ruby", "string", "concatenation", "mutable"], "user": "Rupert Madden-Abbott (236587)", "creationDate": "2012-04-03T20:39:06.393"} +{"title": "Magento Encoding Scripts on the Fly and Generating Download Link", "qid": "10001033", "answers": [{"date": "2012-04-04T15:10:37.277", "user": "B00MER (158325)"}], "tag": ["php", "magento", "encoding", "ioncube", "zend-guard"], "user": "Kelvin (136530)", "creationDate": "2012-04-03T20:39:25.713"} +{"title": "Can't get newlines in Notes document created in C#", "qid": "10001036", "answers": [{"date": "2012-04-03T21:18:13.320", "user": "Ken Pespisa (30812)"}, {"date": "2012-04-04T13:27:49.040", "user": "umeli (1186924)"}, {"date": "2012-04-05T19:16:10.737", "user": "Kerr (39392)"}], "tag": ["c#", "lotus-notes"], "user": "EricRRichards (978460)", "creationDate": "2012-04-03T20:39:29.270"} +{"title": "arrays and date in php", "qid": "10001037", "answers": [{"date": "2012-04-03T21:44:49.950", "user": "thrau (804840)"}], "tag": ["php", "date", "foreach"], "user": "SupaOden (1069457)", "creationDate": "2012-04-03T20:39:32.400"} +{"title": "sudo apt-get install xvfb", "qid": "10001038", "answers": [{"date": "2012-04-03T20:57:58.817", "user": "sti (1287080)"}, {"date": "2012-04-03T20:58:22.560", "user": "Andrew Finnell (553308)"}], "tag": ["google-chrome", "cucumber", "selenium-chromedriver"], "user": "Shahrzad (1193367)", "creationDate": "2012-04-03T20:39:35.723"} +{"title": "visual studio: configure debug to attach to process", "qid": "1000104", "answers": [{"date": "2009-06-16T08:04:22.803", "user": "RichardOD (97558)"}, {"date": "2009-06-16T09:27:49.483", "user": "Juozas Kontvainis (64605)"}, {"date": "2009-06-29T08:48:01.210", "user": "Pablo Retyk (30729)"}], "tag": ["visual-studio", "visual-studio-2008", "debugging"], "user": "Paolo Tedesco (15622)", "creationDate": "2009-06-16T07:59:39.363"} +{"title": "Working With JSON", "qid": "10001040", "answers": [{"date": "2012-04-03T20:45:54.780", "user": "Tuan (360053)"}, {"date": "2012-04-03T20:46:10.510", "user": "Selvakumar Arumugam (297641)"}, {"date": "2012-04-03T20:52:25.043", "user": "jornare (1249477)"}], "tag": ["jquery", "json"], "user": "Jacinto (348843)", "creationDate": "2012-04-03T20:39:40.300"} +{"title": "Menu Bar Appears 50% of the Time, wxPython, Ubuntu 11.10, Python 2.7, wxPython 2.8 GTK2", "qid": "10001051", "answers": [{"date": "2012-04-17T16:15:24.277", "user": "Mike Driscoll (393194)"}], "tag": ["wxpython"], "user": "I__NEED__TEH__CODEZ (1311331)", "creationDate": "2012-04-03T20:40:31.390"} +{"title": "Will two programs using SqlAlchemy conflict when trying to access the same table (SQLite)?", "qid": "10001052", "answers": [{"date": "2012-04-03T20:48:48.900", "user": "mah (749284)"}], "tag": ["python", "sqlite", "orm", "sqlalchemy", "declarative"], "user": "Honest Abe (1217270)", "creationDate": "2012-04-03T20:40:33.273"} +{"title": "C - effect of a write() to a closed tcp connection when using signal(SIGPIPE, SIG_IGN);", "qid": "10001057", "answers": [{"date": "2012-04-03T20:53:37.543", "user": "torek (1256452)"}], "tag": ["sockets", "tcp"], "user": "eddy ed (1286690)", "creationDate": "2012-04-03T20:40:59.870"} +{"title": "Dynamic Include statements for eager loading in a query - EF 4.3.1", "qid": "10001061", "answers": [{"date": "2012-04-03T20:46:49.010", "user": "Darin Dimitrov (29407)"}, {"date": "2012-04-03T22:27:25.887", "user": "Slauma (270591)"}, {"date": "2013-10-04T11:09:16.917", "user": "Mikael \u00d6stberg (444118)"}], "tag": ["c#", "entity-framework", "c#-4.0", "entity-framework-4.1", "entity-framework-4.3"], "user": "LeoD (2868)", "creationDate": "2012-04-03T20:41:13.320"} +{"title": "Don't know the final frame size of UIView until after drawRect?", "qid": "10001064", "answers": [{"date": "2012-04-03T21:12:15.440", "user": "clstroud (578801)"}, {"date": "2012-04-04T04:44:30.843", "user": "Kurt Revis (1218876)"}], "tag": ["ios", "core-graphics"], "user": "Bob Spryn (287403)", "creationDate": "2012-04-03T20:41:40.860"} +{"title": "Sharepoint 2010 Client OM - How to get the Last approved document version?", "qid": "10001065", "answers": [{"date": "2012-04-24T17:26:58.547", "user": "mundeep (65394)"}], "tag": ["c#", "sharepoint-clientobject"], "user": "Bhuvan (249198)", "creationDate": "2012-04-03T20:41:46.393"} +{"title": "Is wmode=\"transparent\" attribute required in both the .. on a new line in PHP?", "qid": "10001097", "answers": [{"date": "2012-04-03T20:46:05.923", "user": "David Nguyen (735556)"}, {"date": "2012-04-03T20:47:02.447", "user": "Wouter Huysentruit (1300910)"}, {"date": "2012-04-03T20:47:45.520", "user": "wwwroth (986899)"}, {"date": "2012-04-03T20:47:45.487", "user": "veiset (581395)"}, {"date": "2012-04-03T20:51:58.383", "user": "Simon Forsberg (1310566)"}, {"date": "2012-04-03T20:55:05.390", "user": "Andrew Briggs (963071)"}, {"date": "2012-04-03T21:05:58.500", "user": "sg3s (893918)"}], "tag": ["php", "html", "css", "twitter-bootstrap"], "user": "Ali Gajani (1239189)", "creationDate": "2012-04-03T20:44:54.327"} +{"title": "Workaround possible for cURL and Javascript?", "qid": "10001104", "answers": [{"date": "2012-04-04T20:39:00.417", "user": "user420095"}], "tag": ["php", "javascript", "security", "curl"], "user": "Eric (648915)", "creationDate": "2012-04-03T20:45:19.247"} +{"title": "Does requiring a gem load everything, including things I don't use?", "qid": "10001106", "answers": [{"date": "2012-04-03T20:53:45.530", "user": "knut (676874)"}], "tag": ["ruby", "memory-management", "gem", "require", "ruby-1.9.3"], "user": "Mr. Demetrius Michael (1182095)", "creationDate": "2012-04-03T20:45:23.427"} +{"title": "how to automatically markup plaintext and preserve formatting", "qid": "10001109", "answers": [], "tag": ["formatting", "markup", "plaintext"], "user": "Chris Cochran (1261908)", "creationDate": "2012-04-03T20:45:53.393"} +{"title": "How to compare in RDLC", "qid": "1000111", "answers": [{"date": "2009-06-16T13:19:38.173", "user": "Fiur (113645)"}, {"date": "2009-06-16T14:04:33.807", "user": "Jon (62923)"}], "tag": ["reporting-services", "reportviewer", "rdlc"], "user": "Shamim (108308)", "creationDate": "2009-06-16T08:02:11.780"} +{"title": "JSON.parse: unexpected character error", "qid": "10001123", "answers": [{"date": "2012-04-03T20:50:19.527", "user": "Rocket Hazmat (206403)"}, {"date": "2012-04-04T20:24:03.457", "user": "Vish (1313806)"}], "tag": ["javascript", "json"], "user": "RHammonds (1311385)", "creationDate": "2012-04-03T20:46:34.637"} +{"title": "Use cell text to build Excel formula", "qid": "10001128", "answers": [{"date": "2012-04-03T20:54:46.920", "user": "Chriseyre2000 (662571)"}], "tag": ["excel-formula"], "user": "dav (1301510)", "creationDate": "2012-04-03T20:47:01.227"} +{"title": "Count Number of Elements in JSON string with Json.NET in C#", "qid": "10001142", "answers": [{"date": "2012-04-03T20:50:55.140", "user": "Har (1071527)"}, {"date": "2012-04-03T20:55:26.777", "user": "L.B (932418)"}], "tag": ["c#", "json", "json.net"], "user": "Brent Barbata (1281839)", "creationDate": "2012-04-03T20:48:00.020"} +{"title": "Eclipse RCP Target Platform: Bundle 'org.eclipse.ui.views.properties.tabbed' cannot be resolved", "qid": "10001143", "answers": [{"date": "2012-04-04T16:01:57.683", "user": "s.d (731040)"}], "tag": ["java", "eclipse-plugin", "rcp", "target-platform"], "user": "PhilippB\u00fcch (1308844)", "creationDate": "2012-04-03T20:48:06.343"} +{"title": "Swing: restrict keyboard focus traversal to specific widgets", "qid": "10001145", "answers": [{"date": "2012-04-03T20:56:49.797", "user": "Peter Sobot (679081)"}, {"date": "2012-04-03T21:35:14.807", "user": "Hovercraft Full Of Eels (522444)"}, {"date": "2012-04-04T09:27:42.233", "user": "kleopatra (203657)"}, {"date": "2013-04-23T17:00:08.443", "user": "Sudhir Dhumal (1743201)"}], "tag": ["java", "swing"], "user": "Dan O (635678)", "creationDate": "2012-04-03T20:48:20.253"} +{"title": "Prepend all links that are not intra-site with a string in JS... Can you just proofread this quick little script I hacked together?", "qid": "10001150", "answers": [{"date": "2012-04-03T20:55:38.803", "user": "user736788"}], "tag": ["javascript"], "user": "user1311065 (1311065)", "creationDate": "2012-04-03T20:48:42.660"} +{"title": "windows VC9 ffmpeg and magick wand", "qid": "10001152", "answers": [{"date": "2012-07-24T14:07:29.987", "user": "Maxter (1548969)"}], "tag": ["php", "windows", "ffmpeg", "magickwand"], "user": "tntu (1311393)", "creationDate": "2012-04-03T20:48:44.330"} +{"title": "date : group by month from day 2 to day 1 next month", "qid": "10001156", "answers": [{"date": "2012-04-03T20:56:02.563", "user": "Jaros\u0142aw Gomu\u0142ka (1256609)"}, {"date": "2012-04-03T20:59:12.563", "user": "Skrol29 (320121)"}], "tag": ["mysql", "date", "group-by"], "user": "Vince (1311058)", "creationDate": "2012-04-03T20:48:50.847"} +{"title": "Registering javascript on asynchronous postback", "qid": "10001164", "answers": [{"date": "2012-04-03T20:51:54.280", "user": "Darin Dimitrov (29407)"}], "tag": ["javascript", "jquery", "asp.net", "asynchronous-postback"], "user": "Jagd (60758)", "creationDate": "2012-04-03T20:49:28.197"} +{"title": "SQL Server 2008 - Create a table dynamically from another table", "qid": "10001166", "answers": [{"date": "2012-04-03T20:54:52.380", "user": "bluefeet (426671)"}, {"date": "2012-04-03T21:19:41.460", "user": "Arion (1100080)"}], "tag": ["sql", "pivot"], "user": "AlwaysLearning (1183138)", "creationDate": "2012-04-03T20:49:51.680"} +{"title": "getText crowdfounded translation", "qid": "10001167", "answers": [{"date": "2012-04-07T12:32:55.987", "user": "J\u00f6rn Horstmann (139595)"}], "tag": ["php", "internationalization", "gettext", "crowdsourcing"], "user": "Frederick Behrends (969210)", "creationDate": "2012-04-03T20:49:55.750"} +{"title": "SQL - Formatting XML response value", "qid": "1000117", "answers": [{"date": "2009-06-16T08:19:24.730", "user": "Remus Rusanu (105929)"}], "tag": ["sql", "sqlxml"], "user": "Vijay (59326)", "creationDate": "2009-06-16T08:03:43.210"} +{"title": "PHP $_GET verification", "qid": "10001172", "answers": [{"date": "2012-04-03T20:55:23.327", "user": "Madara Uchiha (871050)"}, {"date": "2012-04-03T20:56:00.787", "user": "peipst9lker (1263621)"}, {"date": "2012-04-03T20:56:24.403", "user": "Matthew Blancarte (614152)"}], "tag": ["php", "forms", "validation", "post", "get"], "user": "overcrookd (426540)", "creationDate": "2012-04-03T20:50:13.223"} +{"title": "How to switch from PIO to DMA modes on a SATA Controller in code?", "qid": "10001177", "answers": [], "tag": ["c", "windows", "device-driver", "sata"], "user": "user1310759 (1310759)", "creationDate": "2012-04-03T20:50:34.000"} +{"title": "struts2 ", "qid": "10001182", "answers": [{"date": "2012-04-03T21:10:55.317", "user": "Mike Partridge (421245)"}], "tag": ["java", "jsp", "select", "struts2"], "user": "zhake (1298966)", "creationDate": "2012-04-03T20:50:53.863"} +{"title": "Lottery match exercise", "qid": "10001186", "answers": [{"date": "2012-04-03T21:00:17.510", "user": "Taymon (1064659)"}, {"date": "2012-04-03T21:00:38.053", "user": "py_script (163085)"}, {"date": "2012-04-03T21:03:18.940", "user": "CollinJSimpson (1127098)"}], "tag": ["java"], "user": "Arianule (715540)", "creationDate": "2012-04-03T20:51:10.693"} +{"title": "Dynamic URLs + SEO", "qid": "10001187", "answers": [{"date": "2012-04-04T14:03:11.380", "user": "LeonardChallis (601299)"}], "tag": ["seo", "search-engine", "friendly-url", "dynamic-url"], "user": "Darkeden (1219888)", "creationDate": "2012-04-03T20:51:19.540"} +{"title": "Entity Framework: A referential integrity constraint violation on many to many relationship", "qid": "10001189", "answers": [{"date": "2012-07-21T22:45:06.640", "user": "Slauma (270591)"}, {"date": "2014-09-19T08:29:01.623", "user": "Jason Underhill (216256)"}], "tag": ["c#", "entity-framework"], "user": "Luke McGregor (1070291)", "creationDate": "2012-04-03T20:51:26.323"} +{"title": "Is there any security risk that has to be managed in text being stored for later viewing?", "qid": "10001192", "answers": [{"date": "2012-04-03T20:57:08.553", "user": "Samuel Rossille (1060205)"}, {"date": "2012-04-03T20:59:25.797", "user": "Aristos (159270)"}, {"date": "2012-04-03T21:07:58.270", "user": "IrishChieftain (31444)"}], "tag": ["asp.net", "html", "visual-web-developer"], "user": "ispiro (939213)", "creationDate": "2012-04-03T20:51:36.340"} +{"title": "Is modification of string literals undefined behaviour according to the C89 standard?", "qid": "10001202", "answers": [{"date": "2012-04-03T20:54:16.247", "user": "ouah (1119701)"}], "tag": ["c"], "user": "David Heffernan (505088)", "creationDate": "2012-04-03T20:52:34.123"} +{"title": "epylint in emacs using virtualenv", "qid": "10001205", "answers": [{"date": "2012-06-19T08:23:08.073", "user": "aaditya sood (1465783)"}], "tag": ["buildout", "pylint"], "user": "aisbaa (698512)", "creationDate": "2012-04-03T20:52:52.643"} +{"title": "closing a database handle", "qid": "10001209", "answers": [{"date": "2012-04-03T21:04:50.370", "user": "Crontab (979007)"}, {"date": "2012-04-03T21:07:14.477", "user": "Alexander (417685)"}], "tag": ["php", "mysql", "sql-server"], "user": "Average Joe (1017513)", "creationDate": "2012-04-03T20:53:01.537"} +{"title": "Return Bool From Event Listener", "qid": "10001211", "answers": [{"date": "2012-04-03T20:57:22.453", "user": "Adam Shiemke (302132)"}, {"date": "2012-04-03T21:32:57.770", "user": "Shahrukh (457487)"}], "tag": ["javascript", "jquery", "html", "forms", "event-listener"], "user": "Howdy_McGee (800452)", "creationDate": "2012-04-03T20:53:10.320"} +{"title": "Application directory path", "qid": "10001216", "answers": [{"date": "2012-04-03T21:01:09.580", "user": "Matt Moore (1058276)"}, {"date": "2012-04-04T08:43:15.617", "user": "zaherg (1013493)"}], "tag": ["php", "codeigniter", "constants"], "user": "Cyclone (989749)", "creationDate": "2012-04-03T20:53:19.787"} +{"title": "after rotating image on matlab..then results go on bad:(", "qid": "10001220", "answers": [{"date": "2012-04-03T21:21:11.383", "user": "Castilho (1157224)"}], "tag": ["matlab"], "user": "Fatih BORLU (1311381)", "creationDate": "2012-04-03T20:53:38.773"} +{"title": "Will local variables still be in scope on an Ajax call back?", "qid": "10001222", "answers": [{"date": "2012-04-03T20:59:39.487", "user": "Pointy (182668)"}, {"date": "2012-04-03T21:02:08.100", "user": "Guffa (69083)"}], "tag": ["javascript", "ajax"], "user": "user656925", "creationDate": "2012-04-03T20:53:45.310"} +{"title": "How do I Set an Executable's Search Path?", "qid": "10001227", "answers": [{"date": "2012-04-03T21:01:21.873", "user": "Jason Huntley (1214542)"}, {"date": "2012-04-03T21:04:12.517", "user": "Hans Passant (17034)"}], "tag": ["visual-studio-2010", "build"], "user": "smoth190 (953613)", "creationDate": "2012-04-03T20:53:58.133"} +{"title": "How do I make maven-eclipse-plugin 2.9 compile classes to the eclipseClasses directory", "qid": "10001229", "answers": [], "tag": ["eclipse", "maven", "maven-eclipse-plugin"], "user": "knunkler (789820)", "creationDate": "2012-04-03T20:54:04.437"} +{"title": "Attribute error what do these codes mean?", "qid": "10001230", "answers": [{"date": "2012-04-03T20:56:08.650", "user": "pouzzler (926696)"}, {"date": "2012-04-03T20:57:03.097", "user": "Ted Hopp (535871)"}], "tag": ["android", "attributes", "android-softkeyboard"], "user": "evc (1306880)", "creationDate": "2012-04-03T20:54:04.513"} +{"title": "Implementation of crawler4j", "qid": "10001233", "answers": [{"date": "2012-04-03T21:15:12.523", "user": "user1288802 (1288802)"}], "tag": ["java", "string", "web-crawler"], "user": "Morgoroth (1143639)", "creationDate": "2012-04-03T20:54:14.607"} +{"title": "EXC_BAD_ACCESS When Trying To Delete TableView Section", "qid": "10001241", "answers": [{"date": "2012-04-03T21:06:36.677", "user": "jmstone (1148055)"}], "tag": ["iphone", "objective-c", "ios", "xcode", "uitableview"], "user": "Kyle Rosenbluth (889103)", "creationDate": "2012-04-03T20:54:52.640"} +{"title": "Ant: Iterating through an XML file's nodes", "qid": "10001247", "answers": [{"date": "2012-04-03T23:42:30.347", "user": "Synesso (45525)"}], "tag": ["ant", "email-attachments"], "user": "bruneti12 (1311397)", "creationDate": "2012-04-03T20:55:15.950"} +{"title": "Tooltips stop working after an ajax call", "qid": "10001255", "answers": [{"date": "2012-04-03T21:00:30.070", "user": "Rob Stevenson-Leggett (4950)"}, {"date": "2012-04-03T21:01:33.910", "user": "Sander Bruggeman (865206)"}, {"date": "2012-04-03T21:01:35.553", "user": "Selvakumar Arumugam (297641)"}, {"date": "2012-04-03T21:02:09.563", "user": "Kh\u00f4i (1310668)"}], "tag": ["jquery", "jsf", "primefaces"], "user": "Catfish (222403)", "creationDate": "2012-04-03T20:55:39.303"} +{"title": "Simple graphical editor on Windows Phone 7", "qid": "10001257", "answers": [{"date": "2012-04-03T21:04:12.857", "user": "Mustafa Ekici (687817)"}], "tag": ["c#", "silverlight", "windows-phone-7", "mobile"], "user": "Denis Ionov (596887)", "creationDate": "2012-04-03T20:55:53.017"} +{"title": "WebView not working with INTERNET permission set", "qid": "10001264", "answers": [{"date": "2012-04-03T21:04:49.767", "user": "mah (749284)"}], "tag": ["android", "android-manifest", "android-webview"], "user": "SERPRO (571353)", "creationDate": "2012-04-03T20:56:32.630"} +{"title": "Error in RemoteConnect.Connect() err=WNetAddConnection2 returned: 1203 ", "qid": "10001267", "answers": [{"date": "2012-04-16T13:44:36.373", "user": "msbyuva (261432)"}], "tag": ["c#", "asp.net", "file", "path"], "user": "msbyuva (261432)", "creationDate": "2012-04-03T20:56:52.203"} +{"title": "PHP/AJAX multi-user app - Data is being lost somehow", "qid": "10001272", "answers": [{"date": "2012-04-03T21:09:19.173", "user": "Koen. (189431)"}], "tag": ["php", "javascript", "ajax"], "user": "Jack M (815612)", "creationDate": "2012-04-03T20:57:19.600"} +{"title": "no error message when custom constraint gets violated", "qid": "10001273", "answers": [{"date": "2012-04-03T21:35:05.010", "user": "Piotr Kocha\u0144ski (34102)"}, {"date": "2012-04-05T22:51:04.570", "user": "user1291235 (1291235)"}], "tag": ["java", "constraints", "bean-validation"], "user": "user1291235 (1291235)", "creationDate": "2012-04-03T20:57:21.830"} +{"title": "XNA Finding mouse position with 2D camera", "qid": "10001277", "answers": [{"date": "2012-04-03T22:23:50.087", "user": "annonymously (1063111)"}, {"date": "2012-04-05T18:48:15.303", "user": "Fermin Silva (1315900)"}], "tag": ["c#", "xna", "camera", "mouse", "tile"], "user": "Corey (1186351)", "creationDate": "2012-04-03T20:57:33.607"} +{"title": "Socket.io connection piles up on each refresh", "qid": "10001282", "answers": [{"date": "2012-04-03T21:40:20.380", "user": "stewe (511300)"}], "tag": ["node.js", "socket.io"], "user": "dzm (245076)", "creationDate": "2012-04-03T20:58:14.620"} +{"title": "HTML5 Canvas : How to handle mousedown mouseup mouseclick", "qid": "10001283", "answers": [{"date": "2012-04-03T21:03:03.260", "user": "RyanS (1310604)"}, {"date": "2012-04-03T21:03:22.973", "user": "awiebe (888715)"}, {"date": "2012-04-03T21:17:58.547", "user": "Saturnix (1307020)"}, {"date": "2012-04-05T21:47:02.213", "user": "Colin Godsey (472728)"}], "tag": ["javascript", "html5", "canvas"], "user": "AlexCheuk (1240803)", "creationDate": "2012-04-03T20:58:16.933"} +{"title": "Font backward incompatibility", "qid": "1000129", "answers": [{"date": "2009-06-16T08:16:59.507", "user": "jasonh (116176)"}, {"date": "2009-06-18T18:07:41.410", "user": "skypecakes (37168)"}, {"date": "2009-06-21T10:17:19.417", "user": "arbiter (126260)"}], "tag": ["winforms", "fonts", "windows-xp"], "user": "WOPR (46255)", "creationDate": "2009-06-16T08:08:41.207"} +{"title": "Aligning text and select boxes to the same width in CSS?", "qid": "10001291", "answers": [{"date": "2012-04-03T21:08:05.087", "user": "saluce (895646)"}, {"date": "2012-04-03T21:12:36.207", "user": "Thomas Upton (54378)"}, {"date": "2012-04-03T21:13:12.127", "user": "Chris Cannon (1071203)"}, {"date": "2012-07-29T07:35:45.960", "user": "Anonymous (1125062)"}, {"date": "2013-01-09T10:04:03.390", "user": "dotNET Lady (1412147)"}, {"date": "2015-03-13T11:35:58.637", "user": "Matt Jameson (4456970)"}, {"date": "2015-07-20T17:03:03.470", "user": "Sid Lori (5135983)"}], "tag": ["html", "css", "html5", "textbox", "drop-down-menu"], "user": "zuallauz (569447)", "creationDate": "2012-04-03T20:58:49.707"} +{"title": "Duplicate protocol definition warning, but I need multiples of this protocol", "qid": "10001293", "answers": [{"date": "2012-04-03T21:08:08.890", "user": "Josh Caswell (603977)"}, {"date": "2012-04-10T15:44:15.997", "user": "wildcat12 (1119656)"}], "tag": ["objective-c"], "user": "Squatch (1245406)", "creationDate": "2012-04-03T20:59:09.383"} +{"title": "How to position image next to text with padding?", "qid": "10001294", "answers": [{"date": "2012-04-03T21:08:58.930", "user": "Madara Uchiha (871050)"}, {"date": "2012-04-03T21:08:59.763", "user": "laymanje (1005127)"}], "tag": ["html", "css"], "user": "bobo2000 (1069473)", "creationDate": "2012-04-03T20:59:09.400"} +{"title": "jQuery Datepicker previous complete months", "qid": "10001298", "answers": [{"date": "2012-04-03T21:05:11.590", "user": "Sinetheta (848249)"}], "tag": ["javascript", "jquery"], "user": "kingrichard2005 (94541)", "creationDate": "2012-04-03T20:59:18.773"} +{"title": "XNA Sprite Rotation Point", "qid": "10001299", "answers": [{"date": "2012-04-03T21:08:17.920", "user": "Attila (20322)"}], "tag": ["c#", "math", "xna", "rotation"], "user": "Basaa (1236602)", "creationDate": "2012-04-03T20:59:23.200"} +{"title": "sharing ruby code within an organisation", "qid": "1000130", "answers": [{"date": "2009-06-16T08:44:01.740", "user": "SztupY (120917)"}, {"date": "2009-06-16T18:59:19.130", "user": "rampion (9859)"}, {"date": "2009-06-16T20:55:32.373", "user": "John Hyland (90685)"}], "tag": ["ruby", "rubygems", "jruby"], "user": "Rob (14952)", "creationDate": "2009-06-16T08:09:18.303"} +{"title": "List Slicing python", "qid": "10001301", "answers": [{"date": "2012-04-03T21:02:37.037", "user": "Andrew Clark (505154)"}, {"date": "2012-04-03T21:04:55.460", "user": "Anthony Kong (58129)"}, {"date": "2012-04-03T21:06:19.340", "user": "cha0site (1116739)"}, {"date": "2012-04-03T21:07:11.373", "user": "Taymon (1064659)"}], "tag": ["python"], "user": "RanRag (776084)", "creationDate": "2012-04-03T20:59:32.250"} +{"title": "Can I configure PHP to automatically format the HTML it generates?", "qid": "10001303", "answers": [{"date": "2012-04-03T21:02:15.630", "user": "Wouter Huysentruit (1300910)"}, {"date": "2012-04-03T21:04:02.637", "user": "Alexander Blacks (1311414)"}, {"date": "2012-04-03T21:04:14.337", "user": "iambriansreed (144665)"}, {"date": "2012-04-03T21:05:05.770", "user": "jnylen (106302)"}, {"date": "2012-04-03T21:13:49.390", "user": "mcaesar (1200603)"}, {"date": "2012-04-03T21:25:48.700", "user": "hakre (367456)"}, {"date": "2013-01-15T16:47:58.527", "user": "Raftalks (376995)"}], "tag": ["php"], "user": "Corey (160224)", "creationDate": "2012-04-03T20:59:45.683"} +{"title": "IProblem installing R XML package on windows", "qid": "10001307", "answers": [{"date": "2012-04-03T21:14:25.940", "user": "Dason (1003565)"}], "tag": ["r"], "user": "pssguy (535458)", "creationDate": "2012-04-03T21:00:15.300"} +{"title": "Could not load file or assembly CrystalDecisions.ReportAppServer.ClientDoc", "qid": "10001310", "answers": [{"date": "2012-04-03T22:50:55.820", "user": "Micah Armantrout (237109)"}, {"date": "2012-04-04T14:26:22.487", "user": "Jeremy Holovacs (610217)"}, {"date": "2012-04-07T04:40:58.607", "user": "Dylan - INNO Software (1318558)"}, {"date": "2015-07-14T12:14:49.343", "user": "ZahidKakar (2775534)"}], "tag": ["c#", "asp.net-mvc", "crystal-reports"], "user": "Jeremy Holovacs (610217)", "creationDate": "2012-04-03T21:00:20.237"} +{"title": "Increment parameter in rake task", "qid": "10001313", "answers": [{"date": "2012-04-04T12:04:34.287", "user": "CMW (961036)"}], "tag": ["ruby-on-rails", "ruby-on-rails-3", "rake", "each", "increment"], "user": "Shpigford (147586)", "creationDate": "2012-04-03T21:00:26.347"} +{"title": "Is there a Perl or Python library for ID3 metadata?", "qid": "1000132", "answers": [{"date": "2009-06-16T08:12:50.623", "user": "PaulJWilliams (71399)"}, {"date": "2009-06-16T08:17:17.527", "user": "Anurag Uniyal (6946)"}, {"date": "2009-06-16T09:15:53.017", "user": "brian d foy (2766176)"}, {"date": "2009-06-16T12:23:04.090", "user": "Jared (14744)"}, {"date": "2009-06-16T22:56:34.593", "user": "ymir (96448)"}, {"date": "2009-06-17T02:10:19.087", "user": "vulcan_hacker (121659)"}, {"date": "2009-06-17T03:06:53.027", "user": "spiffyman (102467)"}], "tag": ["python", "perl", "id3"], "user": "Jeff Bain (120121)", "creationDate": "2009-06-16T08:10:11.750"} +{"title": "What is an example program that realizes a performance gain by calling _mm_stream_si64x()?", "qid": "10001329", "answers": [{"date": "2012-04-03T21:46:59.370", "user": "ds1848 (1299922)"}, {"date": "2012-04-03T22:00:40.583", "user": "MSN (6210)"}], "tag": ["c++", "visual-c++", "intrinsics"], "user": "Neil Justice (781408)", "creationDate": "2012-04-03T21:02:00.997"} +{"title": "Unable to add a secure web reference in VS.Net 2010", "qid": "10001330", "answers": [{"date": "2012-04-04T18:24:12.893", "user": "Aaron Wynn (1311205)"}], "tag": ["visual-studio-2010", "ssl-certificate", "web-reference"], "user": "Aaron Wynn (1311205)", "creationDate": "2012-04-03T21:02:02.187"} +{"title": "How can Watir consistently deal with a javascript dropdown menu?", "qid": "10001332", "answers": [{"date": "2012-04-03T21:40:28.033", "user": "Chuck van der Linden (409820)"}], "tag": ["javascript", "drop-down-menu", "watir-webdriver"], "user": "ibodog (1311391)", "creationDate": "2012-04-03T21:02:05.260"} +{"title": "How to solve this puzzle in Prolog?", "qid": "10001344", "answers": [{"date": "2012-04-03T21:49:23.817", "user": "Parakram Majumdar (1119105)"}, {"date": "2012-04-04T13:17:54.923", "user": "Mike Hartl (797637)"}, {"date": "2013-02-21T16:51:31.760", "user": "CapelliC (874024)"}], "tag": ["prolog", "puzzle"], "user": "user1204349 (1204349)", "creationDate": "2012-04-03T21:03:01.673"} +{"title": "Select most recent (top 1) from table grouped by another ID", "qid": "10001347", "answers": [{"date": "2012-04-03T21:18:10.963", "user": "Tim Lehner (880904)"}, {"date": "2012-04-03T21:23:16.793", "user": "Umut Derbento\u011flu (956457)"}, {"date": "2012-04-03T21:36:53.480", "user": "Nikola Markovinovi\u0107 (1231866)"}], "tag": ["sql", "sql-server-2008"], "user": "Hoppe (846844)", "creationDate": "2012-04-03T21:03:04.457"} +{"title": "android launch camera app (NOT for result)", "qid": "10001351", "answers": [{"date": "2012-04-03T21:25:41.383", "user": "Martin Sykes (1125129)"}], "tag": ["android", "camera"], "user": "Ben (372405)", "creationDate": "2012-04-03T21:03:17.107"} +{"title": "Saving data using local storage on an iPhone - which way to go?", "qid": "10001358", "answers": [{"date": "2012-04-03T22:13:49.143", "user": "Michael Frederick (903010)"}, {"date": "2012-04-03T22:23:19.247", "user": "jmstone (1148055)"}, {"date": "2012-04-04T02:15:46.293", "user": "darv (1309194)"}, {"date": "2013-07-12T05:15:43.577", "user": "user2534255 (2534255)"}], "tag": ["iphone", "arrays", "json", "caching", "local"], "user": "nalas (1294022)", "creationDate": "2012-04-03T21:03:31.203"} +{"title": "ASP.NET Form View IF on Updating", "qid": "10001368", "answers": [{"date": "2012-04-03T21:24:01.863", "user": "Joel Coehoorn (3043)"}, {"date": "2012-04-04T07:14:33.413", "user": "utkai (1202255)"}], "tag": ["asp.net", "vb.net"], "user": "user1055487 (1055487)", "creationDate": "2012-04-03T21:04:13.420"} +{"title": "DTE.ExecuteCommand and wait", "qid": "1000137", "answers": [{"date": "2009-10-06T02:35:24.710", "user": "Kyle Finley (2344354)"}, {"date": "2010-02-27T13:57:38.610", "user": "AareP (11741)"}], "tag": ["visual-studio", "macros", "automation", "envdte"], "user": "TcKs (20382)", "creationDate": "2009-06-16T08:11:57.627"} +{"title": "Rails Route Error Nested Routes (link_to user_post_path) ", "qid": "10001371", "answers": [{"date": "2012-04-04T02:00:56.257", "user": "Nuby (510287)"}], "tag": ["ruby-on-rails", "routes", "nested"], "user": "cj3kim (1218832)", "creationDate": "2012-04-03T21:04:22.217"} +{"title": "MySql Joining three relations and performing query on that result", "qid": "10001372", "answers": [{"date": "2012-04-03T21:09:08.093", "user": "Brendan Long (212555)"}, {"date": "2012-04-03T21:20:22.337", "user": "Skrol29 (320121)"}], "tag": ["mysql", "sql"], "user": "user1311286", "creationDate": "2012-04-03T21:04:24.083"} +{"title": "CXF/Spring Injecting Top-Level Service Name and Namespace into JAX-WS Interface", "qid": "10001373", "answers": [{"date": "2012-04-04T02:44:12.960", "user": "sourcedelica (158658)"}], "tag": ["java", "spring", "java-ee", "jax-ws", "cxf"], "user": "ingyhere (325452)", "creationDate": "2012-04-03T21:04:29.703"} +{"title": "What is the `edit` attr in a meta tag", "qid": "10001374", "answers": [{"date": "2012-04-03T21:28:13.030", "user": "d_inevitable (1238764)"}, {"date": "2012-04-03T21:54:28.817", "user": "BluesRockAddict (754042)"}], "tag": ["html", "meta-tags"], "user": "qwertymk (465546)", "creationDate": "2012-04-03T21:04:32.793"} +{"title": "is there any way to putting my custom buttons in one XML file in android?", "qid": "10001377", "answers": [{"date": "2012-04-03T21:13:32.617", "user": "Jon O (429108)"}], "tag": ["android"], "user": "Nada (1238277)", "creationDate": "2012-04-03T21:04:50.530"} +{"title": "Partition Lucene Index by ID across multiple indexes", "qid": "10001382", "answers": [{"date": "2012-04-04T19:36:24.040", "user": "Felipe Hummel (40876)"}], "tag": ["lucene.net", "lucene"], "user": "Josh (107455)", "creationDate": "2012-04-03T21:05:06.287"} +{"title": "My program crashes when the button is clicked.. why?", "qid": "10001387", "answers": [{"date": "2012-04-03T21:09:14.410", "user": "enrmarc (434171)"}, {"date": "2012-04-03T21:14:47.493", "user": "Win Myo Htet (319058)"}, {"date": "2012-04-03T21:16:05.723", "user": "WarrenFaith (180538)"}], "tag": ["java", "android"], "user": "Wilson (1116831)", "creationDate": "2012-04-03T21:05:28.107"} +{"title": "Django template not showing database contents", "qid": "10001389", "answers": [{"date": "2012-04-03T21:08:00.090", "user": "MattH (267781)"}], "tag": ["django", "django-models", "django-templates", "django-views", "django-urls"], "user": "tomasantonj (1307373)", "creationDate": "2012-04-03T21:05:52.483"} +{"title": "Running a script if form field validates as email", "qid": "10001399", "answers": [{"date": "2012-04-03T21:13:29.803", "user": "user736788"}, {"date": "2012-04-03T22:37:44.420", "user": "trickyzter (1047808)"}], "tag": ["javascript", "forms", "colorbox"], "user": "user1309010 (1309010)", "creationDate": "2012-04-03T21:06:44.667"} +{"title": "XSL max value from a group of sample values not working", "qid": "10001409", "answers": [{"date": "2012-04-03T22:10:27.100", "user": "Tim C (7585)"}], "tag": ["xml", "xslt"], "user": "K I M I - (1230486)", "creationDate": "2012-04-03T21:07:48.800"} +{"title": "ASP.net Page Loading popup", "qid": "1000141", "answers": [{"date": "2009-06-16T08:21:08.580", "user": "bang (611084)"}, {"date": "2009-06-16T08:22:41.573", "user": "Mark Struzinski (1284)"}, {"date": "2009-06-22T08:40:35.803", "user": "Jan W. (112406)"}], "tag": ["c#", "asp.net", "ajax"], "user": "Jan W. (112406)", "creationDate": "2009-06-16T08:13:29.623"} +{"title": "How to properly compare lists", "qid": "10001410", "answers": [{"date": "2012-04-03T21:37:54.473", "user": "user1308985 (1308985)"}, {"date": "2012-04-03T21:50:57.653", "user": "Chuck Savage (353147)"}], "tag": ["c#", "algorithm", "list", "optimization", "comparison"], "user": "Andrew (1076389)", "creationDate": "2012-04-03T21:07:49.797"} +{"title": "How to change jQuery default context?", "qid": "10001411", "answers": [{"date": "2013-12-12T18:55:24.527", "user": "BrunoLM (340760)"}], "tag": ["javascript", "jquery", "firefox-addon"], "user": "BrunoLM (340760)", "creationDate": "2012-04-03T21:07:52.477"} +{"title": "Remove anchor underline email signature", "qid": "10001418", "answers": [{"date": "2012-04-03T21:31:27.613", "user": "David Carlisle (1158383)"}, {"date": "2012-04-03T21:33:12.837", "user": "E. Barnes (1294408)"}, {"date": "2012-11-01T17:05:15.820", "user": "This One Guy (1792049)"}], "tag": ["html", "email", "gmail", "signature", "hotmail"], "user": "Filth (665312)", "creationDate": "2012-04-03T21:08:21.590"} +{"title": "Javascript - JQuery on() clearTimeout scope issue", "qid": "10001419", "answers": [{"date": "2012-04-03T21:12:00.530", "user": "LeeR (325626)"}, {"date": "2012-04-03T21:12:04.773", "user": "jfriend00 (816620)"}], "tag": ["javascript", "jquery", "settimeout"], "user": "Nykad (1311371)", "creationDate": "2012-04-03T21:08:24.060"} +{"title": "Utilizing Javascript to change multiple dynamicially named drop downs to one value", "qid": "10001422", "answers": [{"date": "2012-04-03T21:38:06.807", "user": "Deleteman (955697)"}, {"date": "2012-04-03T21:39:59.047", "user": "Kh\u00f4i (1310668)"}], "tag": ["javascript", "drop-down-menu"], "user": "Jennifer L (1311416)", "creationDate": "2012-04-03T21:08:27.707"} +{"title": "The right approach to loading dynamic content into a UITableView in iOS", "qid": "10001424", "answers": [{"date": "2012-04-03T21:41:15.433", "user": "Nungster (466366)"}, {"date": "2012-04-03T23:25:25.320", "user": "danh (294949)"}], "tag": ["iphone", "objective-c", "ios", "uitableview"], "user": "OS. (9489)", "creationDate": "2012-04-03T21:08:31.283"} +{"title": "Subversion Server Source Code", "qid": "10001425", "answers": [{"date": "2012-04-03T21:15:37.953", "user": "vcsjones (492405)"}], "tag": ["svn"], "user": "DotNetStudent (931657)", "creationDate": "2012-04-03T21:08:32.810"} +{"title": "RTMP_Write function use", "qid": "10001426", "answers": [], "tag": ["publish", "flv", "rtmp", "rtmpd"], "user": "Bilthon (274434)", "creationDate": "2012-04-03T21:08:37.297"} +{"title": "Getting a field value from a custom control when there are multiple instances of the custom control", "qid": "10001442", "answers": [{"date": "2012-04-04T07:42:46.703", "user": "Simon McLoughlin (1185169)"}, {"date": "2012-04-04T13:38:38.950", "user": "Tommy Valand (1182541)"}], "tag": ["xpages"], "user": "Bruce Stemplewski (1250056)", "creationDate": "2012-04-03T21:09:43.240"} +{"title": "won't replace connectionstring for release in msbuild", "qid": "10001445", "answers": [], "tag": ["visual-studio", "msbuild"], "user": "Rod (139698)", "creationDate": "2012-04-03T21:09:59.930"} +{"title": "How to delete full object with javascript?", "qid": "10001447", "answers": [{"date": "2012-04-03T21:12:32.883", "user": "Eugene Retunsky (871953)"}, {"date": "2012-04-03T21:13:23.140", "user": "Spudley (352765)"}, {"date": "2012-04-03T21:13:34.037", "user": "Kendall Frey (785745)"}, {"date": "2012-04-03T21:14:19.640", "user": "chesles (223594)"}, {"date": "2012-04-03T21:16:41.323", "user": "Luca (1252169)"}], "tag": ["javascript", "json", "object"], "user": "Danny Fox (1091828)", "creationDate": "2012-04-03T21:10:45.960"} +{"title": "Translating \"Why Functional Programming Matters\" into Haskell", "qid": "1000145", "answers": [{"date": "2009-06-16T08:30:25.320", "user": "ShiDoiSi (60462)"}, {"date": "2009-06-16T09:00:16.823", "user": "Jonas (24946)"}, {"date": "2014-07-21T12:39:38.307", "user": "The Dude (1171465)"}, {"date": "2010-05-14T16:18:03.933", "user": "BMeph (140483)"}], "tag": ["haskell", "functional-programming"], "user": "Andrew Jaffe (12266)", "creationDate": "2009-06-16T08:15:45.563"} +{"title": "ASP.net mvc shared Class Library", "qid": "10001450", "answers": [{"date": "2012-04-03T21:15:56.273", "user": "Erik Funkenbusch (61164)"}], "tag": ["asp.net-mvc", "asp.net-mvc-3", "reference", "shared", "class-library"], "user": "Matt (408137)", "creationDate": "2012-04-03T21:11:27.063"} +{"title": "dc.LineTo not drawing on OnPaint() unless I move the use the mouse and move the window out of view?", "qid": "10001453", "answers": [{"date": "2012-04-03T21:15:32.120", "user": "Mark Ransom (5987)"}, {"date": "2012-04-19T06:29:31.207", "user": "Wartin (48778)"}], "tag": ["visual-c++", "mfc"], "user": "jdl (767829)", "creationDate": "2012-04-03T21:11:35.830"} +{"title": "Using onClick to call a JavaScript Function - using form element values...?", "qid": "10001460", "answers": [{"date": "2012-04-03T21:19:42.950", "user": "user736788"}, {"date": "2012-04-03T21:25:29.290", "user": "Zecc (400127)"}], "tag": ["javascript", "forms", "onclick"], "user": "Ryan (556839)", "creationDate": "2012-04-03T21:12:18.687"} +{"title": "Getting the new records from changes table when referring to one value with union and subquery", "qid": "10001463", "answers": [{"date": "2012-04-03T21:28:55.247", "user": "joshuahedlund (890308)"}], "tag": ["mysql", "union"], "user": "Finally Forever (1311341)", "creationDate": "2012-04-03T21:12:25.467"} +{"title": "Why is Rails 3.2.2 Generating URLs prefixed with /assets when using redirect_to?", "qid": "10001466", "answers": [{"date": "2012-04-04T02:50:07.073", "user": "Minja (599333)"}, {"date": "2012-04-04T15:50:06.660", "user": "Ezekiel Templin (118912)"}], "tag": ["ruby-on-rails-3"], "user": "Jose (766388)", "creationDate": "2012-04-03T21:12:46.067"} +{"title": "GWT RPC XsrfToken Serialization exception", "qid": "10001467", "answers": [], "tag": ["java", "google-app-engine", "gwt"], "user": "ptflix (1267917)", "creationDate": "2012-04-03T21:12:47.733"} +{"title": "How does kAudioUnitSubType_NBandEQ work? Or equalizing using DSP formulas with Novocaine?", "qid": "10001471", "answers": [{"date": "2012-04-11T06:10:23.617", "user": "SPrabhu (1258983)"}, {"date": "2012-04-19T21:07:13.667", "user": "alexbw (189504)"}], "tag": ["objective-c", "ios", "signal-processing", "core-audio"], "user": "bartolsthoorn (335412)", "creationDate": "2012-04-03T21:12:58.530"} +{"title": "Eclipse unable to connect to TFS Server", "qid": "10001473", "answers": [{"date": "2012-04-04T08:47:39.433", "user": "KMoraz (147211)"}, {"date": "2012-04-04T11:30:20.883", "user": "Shaw Terwilliger (250389)"}, {"date": "2012-04-04T16:15:46.750", "user": "ninjasense (408079)"}], "tag": ["eclipse", "tfs", "eclipse-plugin", "team-explorer", "team-explorer-everywhere"], "user": "ninjasense (408079)", "creationDate": "2012-04-03T21:13:22.370"} +{"title": "Does ADPCM has some sample rate?", "qid": "10001478", "answers": [], "tag": ["audio", "adpcm"], "user": "Dims (258483)", "creationDate": "2012-04-03T21:13:43.140"} +{"title": "How does WorkItem.Save() work?", "qid": "10001482", "answers": [{"date": "2012-04-03T21:23:58.260", "user": "Edward Thomson (729881)"}], "tag": ["tfs", "tfs2010", "tfs-sdk"], "user": "user1060500 (1060500)", "creationDate": "2012-04-03T21:13:56.973"} +{"title": "VBA code import", "qid": "10001489", "answers": [{"date": "2012-04-03T21:23:42.677", "user": "Siddharth Rout (1140579)"}], "tag": ["vba", "excel-vba"], "user": "loveforvdubs (1216297)", "creationDate": "2012-04-03T21:14:37.157"} +{"title": "wget Failing in php exec", "qid": "10001490", "answers": [{"date": "2012-04-03T21:19:37.437", "user": "Thomas Wright (1231182)"}, {"date": "2012-04-03T21:21:40.040", "user": "Alexander (417685)"}], "tag": ["php", "exec", "wget"], "user": "Steve Robbins (763468)", "creationDate": "2012-04-03T21:14:39.550"} +{"title": "How can I use '>' to redirect output within Node.js?", "qid": "10001493", "answers": [{"date": "2012-04-03T21:19:28.230", "user": "ControlAltDel (1291492)"}, {"date": "2012-04-03T21:22:57.353", "user": "d_inevitable (1238764)"}, {"date": "2012-04-03T21:43:13.677", "user": "mihai (865038)"}], "tag": ["javascript", "linux", "node.js"], "user": "deltanovember (144152)", "creationDate": "2012-04-03T21:15:01.543"} +{"title": "Different ways of importing", "qid": "10001497", "answers": [{"date": "2012-04-03T21:18:40.767", "user": "chikuba (931726)"}], "tag": ["objective-c"], "user": "Richard Knop (95944)", "creationDate": "2012-04-03T21:15:14.613"} +{"title": ".htacess with variables for user friendly urls", "qid": "10001498", "answers": [{"date": "2012-04-03T21:52:35.343", "user": "Kasapo (497369)"}], "tag": [".htaccess"], "user": "Milkman7 (1309287)", "creationDate": "2012-04-03T21:15:19.093"} +{"title": "how to 'bake' parameters into click() call jquery?", "qid": "10001499", "answers": [{"date": "2012-04-03T21:23:23.900", "user": "James Montagne (717383)"}, {"date": "2012-04-03T21:28:05.483", "user": "Soren (668501)"}, {"date": "2012-04-03T21:29:02.097", "user": "Ethan Brown (1198509)"}], "tag": ["jquery"], "user": "mix (348496)", "creationDate": "2012-04-03T21:15:26.707"} +{"title": "Android - Carousel like widget which displays a portion of the left and right elements", "qid": "10001503", "answers": [{"date": "2012-04-03T21:21:13.790", "user": "Jon O (429108)"}, {"date": "2012-05-04T04:25:25.690", "user": "AngraX (650443)"}, {"date": "2012-05-14T20:05:14.827", "user": "Matthew_ryelee (1046803)"}, {"date": "2012-09-24T13:58:58.433", "user": "Steelight (669180)"}], "tag": ["android", "android-layout", "android-widget"], "user": "AngraX (650443)", "creationDate": "2012-04-03T21:15:37.577"} +{"title": "Get the selected date from a dropdown using JavaScript", "qid": "10001506", "answers": [{"date": "2012-04-03T21:24:52.040", "user": "Chris Baker (610573)"}], "tag": ["javascript", "date", "drop-down-menu"], "user": "user1138626 (1138626)", "creationDate": "2012-04-03T21:15:45.037"} +{"title": "get part with regex", "qid": "10001510", "answers": [{"date": "2012-04-03T21:19:43.743", "user": "enrmarc (434171)"}], "tag": ["java", "regex"], "user": "clankill3r (1022707)", "creationDate": "2012-04-03T21:15:57.360"} +{"title": "Zen coding img src from a list", "qid": "10001511", "answers": [{"date": "2012-04-04T07:37:14.630", "user": "Sergey Chikuyonok (1312205)"}], "tag": ["html", "emmet"], "user": "DoctorAcula (1272603)", "creationDate": "2012-04-03T21:15:59.300"} +{"title": "Git doesn't seem to want to keep local refs to origin/master", "qid": "10001514", "answers": [{"date": "2012-04-03T21:22:14.050", "user": "Kevin Ballard (582)"}, {"date": "2012-04-03T21:34:04.133", "user": "chazomaticus (30497)"}], "tag": ["git"], "user": "quodlibetor (25616)", "creationDate": "2012-04-03T21:16:07.850"} +{"title": "MySQL Error: \"WHERE post LIKE\" not working", "qid": "10001515", "answers": [{"date": "2012-04-03T21:19:23.817", "user": "Daniel Rotter (1292378)"}, {"date": "2012-04-03T21:20:19.227", "user": "Jaros\u0142aw Gomu\u0142ka (1256609)"}, {"date": "2012-04-04T05:47:49.523", "user": "Ankit Sharma (1311977)"}], "tag": ["mysql", "replace"], "user": "deathlock (651170)", "creationDate": "2012-04-03T21:16:10.143"} +{"title": "CSS: Simple Gradients in Internet Explorer <= 8", "qid": "10001516", "answers": [{"date": "2012-04-03T21:41:07.283", "user": "sg3s (893918)"}, {"date": "2012-04-03T21:45:52.160", "user": "Chris Cannon (1071203)"}, {"date": "2012-04-03T21:52:27.583", "user": "Spudley (352765)"}], "tag": ["css", "internet-explorer", "gradient"], "user": "Nick (937084)", "creationDate": "2012-04-03T21:16:11.000"} +{"title": "Trying to define a static constant variable in a class", "qid": "10001518", "answers": [{"date": "2012-04-03T21:18:42.133", "user": "ildjarn (636019)"}, {"date": "2012-04-03T21:20:11.303", "user": "Karoly Horvath (650405)"}, {"date": "2012-04-03T21:20:11.350", "user": "Matteo Italia (214671)"}, {"date": "2012-04-03T22:11:14.020", "user": "aroyer (964122)"}], "tag": ["c++", "class", "static"], "user": "jakebird451 (1279231)", "creationDate": "2012-04-03T21:16:12.133"} +{"title": "What about this OpenCL kernel is causing the error CL_INVALID_COMMAND_QUEUE", "qid": "10001521", "answers": [{"date": "2012-04-04T02:55:35.747", "user": "mfa (1152356)"}, {"date": "2012-04-04T19:41:31.083", "user": "chris varnz (867692)"}], "tag": ["neural-network", "opencl"], "user": "chris varnz (867692)", "creationDate": "2012-04-03T21:16:51.790"} +{"title": "Wordpress - List a specific page and sub pages from a page template or make a new menu?", "qid": "10001522", "answers": [{"date": "2012-04-04T09:51:44.403", "user": "Steve (1311409)"}], "tag": ["php", "wordpress"], "user": "Steve (1311409)", "creationDate": "2012-04-03T21:16:52.780"} +{"title": "how to force base class constructors to be called in derived classes?", "qid": "10001524", "answers": [{"date": "2012-04-03T21:20:23.447", "user": "Luchian Grigore (673730)"}, {"date": "2012-04-03T21:20:52.080", "user": "ruakh (978917)"}], "tag": ["c++"], "user": "FatalCatharsis (1191020)", "creationDate": "2012-04-03T21:16:58.080"} +{"title": "C# Ping crashes entire program", "qid": "10001525", "answers": [{"date": "2012-04-03T21:19:44.097", "user": "Sam Axe (74015)"}, {"date": "2012-04-03T22:44:56.390", "user": "Hans Passant (17034)"}], "tag": ["c#", "winforms", "ping"], "user": "dtyler (1059289)", "creationDate": "2012-04-03T21:17:05.580"} +{"title": "Enabling payments on the mobile web breaks our app in native iOS", "qid": "10001526", "answers": [{"date": "2012-06-12T20:27:03.640", "user": "Anna Billstrom (830304)"}], "tag": ["ios", "mobile", "facebook-credits"], "user": "Stephen (262056)", "creationDate": "2012-04-03T21:17:09.233"} +{"title": "Handling Browser authentication when parsing", "qid": "10001528", "answers": [], "tag": ["java", "swing", "basic-authentication"], "user": "SteelBird (1213096)", "creationDate": "2012-04-03T21:17:12.203"} +{"title": "python pdf line by line", "qid": "10001529", "answers": [{"date": "2012-04-04T02:10:36.840", "user": "apple16 (875747)"}], "tag": ["python", "pdf"], "user": "user873286 (873286)", "creationDate": "2012-04-03T21:17:22.587"} +{"title": "Saving HTML Table as xml or json", "qid": "10001531", "answers": [{"date": "2012-04-03T21:22:56.140", "user": "Rob Rodi (29093)"}], "tag": ["c#", "xml", "linq"], "user": "Antarr Byrd (504963)", "creationDate": "2012-04-03T21:17:31.943"} +{"title": "Why is the responsiveness getting lost even when the two tables are same?", "qid": "10001534", "answers": [], "tag": ["html", "css", "twitter-bootstrap"], "user": "Ali Gajani (1239189)", "creationDate": "2012-04-03T21:17:56.737"} +{"title": "How to oraganise Android XML Layout files into folders", "qid": "10001539", "answers": [{"date": "2012-04-03T21:21:38.797", "user": "Tiago Almeida (684803)"}], "tag": ["android", "xml", "layout", "styles", "folders"], "user": "mail929 (1168052)", "creationDate": "2012-04-03T21:18:14.947"} +{"title": "Insert ASP Tags and UserControls into CMS Content", "qid": "10001540", "answers": [{"date": "2012-04-03T21:31:22.283", "user": "Carl Raymond (144604)"}], "tag": ["c#", "asp.net", "httphandler", "httpmodule"], "user": "FirstDivision (937532)", "creationDate": "2012-04-03T21:18:17.710"} +{"title": "Javascript access parameters outside of a given function", "qid": "10001549", "answers": [{"date": "2012-04-03T21:28:46.967", "user": "user736788"}, {"date": "2012-04-03T21:34:51.250", "user": "Joe (724626)"}], "tag": ["javascript", "functional-programming", "arguments", "anonymous-function"], "user": "sebas2day (1257069)", "creationDate": "2012-04-03T21:19:01.850"} +{"title": "Flex drawing example error", "qid": "1000155", "answers": [{"date": "2009-06-16T08:25:35.483", "user": "James Hay (47339)"}, {"date": "2009-06-16T08:55:09.097", "user": "bug-a-lot (109945)"}], "tag": ["flex", "flex3", "flexbuilder"], "user": "Piyush Giri (82433)", "creationDate": "2009-06-16T08:21:12.310"} +{"title": "How can i put a column of results into an array and compare then with another column with PHP?", "qid": "10001552", "answers": [{"date": "2012-04-03T21:44:16.740", "user": "Skrol29 (320121)"}, {"date": "2012-04-03T21:52:32.123", "user": "kasavbere (1257771)"}], "tag": ["php", "database", "comparison"], "user": "Hubert (1241374)", "creationDate": "2012-04-03T21:19:13.557"} +{"title": "Parsing text in python issue", "qid": "10001553", "answers": [{"date": "2012-04-03T21:28:30.360", "user": "noa (1311468)"}, {"date": "2012-04-03T21:31:16.007", "user": "Furbeenator (965668)"}, {"date": "2012-04-03T22:29:16.570", "user": "apple16 (875747)"}, {"date": "2012-04-03T22:39:52.493", "user": "hexparrot (1191579)"}, {"date": "2012-04-03T22:42:22.413", "user": "Gary Fixler (955926)"}], "tag": ["python", "file", "parsing", "text"], "user": "jgilmour (526052)", "creationDate": "2012-04-03T21:19:14.193"} +{"title": "Where are ProfilingActionFilter and ProfilingViewEngine in mvc-mini-profiler?", "qid": "10001565", "answers": [{"date": "2012-04-03T23:35:06.450", "user": "Don Zacharias (90358)"}, {"date": "2015-02-16T16:36:41.080", "user": "Meysam Sharifi (4502837)"}], "tag": ["visual-studio-2010", "mvc-mini-profiler"], "user": "Don Zacharias (90358)", "creationDate": "2012-04-03T21:19:45.117"} +{"title": "Is it possible to transfer or change an existing fan page to become an app's fan page?", "qid": "10001569", "answers": [], "tag": ["facebook", "facebook-page"], "user": "Ivan James (1311437)", "creationDate": "2012-04-03T21:20:15.563"} +{"title": "Documenting Software", "qid": "1000157", "answers": [{"date": "2009-06-16T08:26:49.833", "user": "Rahul (24424)"}, {"date": "2009-06-16T08:28:40.720", "user": "Alex Brown (121332)"}], "tag": ["documentation"], "user": "Hemanshu Bhojak (51927)", "creationDate": "2009-06-16T08:21:29.563"} +{"title": "Applied duck-typing in plain C", "qid": "10001570", "answers": [{"date": "2012-04-03T21:57:33.750", "user": "user1277476 (1277476)"}, {"date": "2015-04-11T09:26:31.550", "user": "Stiege (2810596)"}, {"date": "2015-05-24T00:46:51.893", "user": "luser droog (733077)"}], "tag": ["c", "duck-typing"], "user": "Alexander Gladysh (6236)", "creationDate": "2012-04-03T21:20:19.397"} +{"title": "How does Twitter Bootstrap's icon work?", "qid": "10001575", "answers": [{"date": "2012-04-03T21:25:47.400", "user": "Esailija (995876)"}, {"date": "2012-04-03T21:25:48.440", "user": "elclanrs (670396)"}, {"date": "2012-04-03T21:27:01.567", "user": "David Nguyen (735556)"}, {"date": "2012-04-03T21:29:05.373", "user": "Wesley Murch (398242)"}, {"date": "2013-11-06T17:08:32.103", "user": "pixelator (905792)"}], "tag": ["html", "css", "twitter-bootstrap"], "user": "werdnanoslen (738672)", "creationDate": "2012-04-03T21:20:30.427"} +{"title": "Convert characters string to Unsigned int", "qid": "10001576", "answers": [{"date": "2012-04-03T21:24:39.373", "user": "Porges (10311)"}, {"date": "2012-04-03T21:27:49.427", "user": "phoog (385844)"}, {"date": "2012-04-03T21:28:07.037", "user": "K Mehta (773885)"}, {"date": "2012-04-03T21:28:12.077", "user": "Eric J. (141172)"}], "tag": ["c#"], "user": "Vitaly (929831)", "creationDate": "2012-04-03T21:20:31.450"} +{"title": "Using SqlDataSource to retreive database data in ASP.NET", "qid": "10001578", "answers": [], "tag": ["asp.net", "sql"], "user": "Rob (658216)", "creationDate": "2012-04-03T21:20:46.840"} +{"title": "Updating A Table Based On The Count() From Its Many-to-Many Table", "qid": "1000158", "answers": [{"date": "2009-06-16T08:25:39.977", "user": "Steve Weet (68262)"}], "tag": ["mysql"], "user": "dimo414 (113632)", "creationDate": "2009-06-16T08:21:38.860"} +{"title": "how to check the database name that ActiveRecord uses", "qid": "10001583", "answers": [{"date": "2012-04-03T21:27:30.093", "user": "tsherif (1308624)"}], "tag": ["ruby-on-rails", "ruby", "configuration"], "user": "m33lky (130111)", "creationDate": "2012-04-03T21:21:08.407"} +{"title": "Passing variable of type var - unknown type", "qid": "10001587", "answers": [{"date": "2012-04-03T21:31:53.327", "user": "desigeek (125422)"}, {"date": "2012-04-03T21:36:16.460", "user": "Arion (1100080)"}, {"date": "2012-04-03T21:37:32.403", "user": "Tigran (156695)"}, {"date": "2012-04-03T22:24:58.603", "user": "phoog (385844)"}, {"date": "2012-04-03T23:13:48.627", "user": "Daniel Baker (1311237)"}], "tag": ["c#", "variables", "lambda", "ienumerable", "var"], "user": "Baxter (1144118)", "creationDate": "2012-04-03T21:21:24.990"} +{"title": "How can I call a layout after clicking a button?", "qid": "10001588", "answers": [{"date": "2012-04-03T21:29:57.660", "user": "petey (794088)"}, {"date": "2012-04-03T21:33:18.333", "user": "Jon O (429108)"}], "tag": ["android", "android-layout"], "user": "user1296153 (1296153)", "creationDate": "2012-04-03T21:21:25.677"} +{"title": "youtube video in Android native player", "qid": "10001590", "answers": [{"date": "2012-04-03T21:28:55.260", "user": "Jon O (429108)"}], "tag": ["android", "youtube", "native", "player"], "user": "user1311448 (1311448)", "creationDate": "2012-04-03T21:21:32.833"} +{"title": "How to update a NSManagedObject", "qid": "10001593", "answers": [{"date": "2013-01-18T15:49:03.650", "user": "user1990959 (1990959)"}], "tag": ["edit", "nsmanagedobject"], "user": "user1311441 (1311441)", "creationDate": "2012-04-03T21:21:42.537"} +{"title": "Shortened namespace alias in aspx", "qid": "10001594", "answers": [{"date": "2012-04-03T21:26:49.970", "user": "Abe Miessler (226897)"}, {"date": "2012-04-03T21:27:42.567", "user": "Rob Rodi (29093)"}], "tag": ["asp.net"], "user": "Kev (982229)", "creationDate": "2012-04-03T21:21:42.800"} +{"title": "Reset button acting like the submit button", "qid": "10001595", "answers": [{"date": "2012-04-03T21:26:11.327", "user": "BluesRockAddict (754042)"}, {"date": "2012-04-03T21:26:40.723", "user": "Francisc (383148)"}, {"date": "2012-04-03T21:26:58.587", "user": "Tim Medora (453277)"}, {"date": "2012-04-03T21:29:51.220", "user": "The Alpha (741747)"}], "tag": ["html", "button", "submit", "reset"], "user": "user652792", "creationDate": "2012-04-03T21:21:43.993"} +{"title": "UIImage to NSDate to NSString to JSON String is giving null value", "qid": "10001598", "answers": [{"date": "2012-04-03T21:25:44.093", "user": "Hot Licks (581994)"}], "tag": ["objective-c", "xcode", "json", "ipad"], "user": "user181248 (1269714)", "creationDate": "2012-04-03T21:22:01.313"} +{"title": "Execution time and big O", "qid": "10001600", "answers": [{"date": "2012-04-03T21:29:58.943", "user": "Jaros\u0142aw Gomu\u0142ka (1256609)"}, {"date": "2012-04-03T21:34:09.597", "user": "CollinJSimpson (1127098)"}], "tag": ["java", "algorithm", "big-o", "analysis", "execution"], "user": "John Wozniak (1044689)", "creationDate": "2012-04-03T21:22:10.023"} +{"title": "How to refresh all ExplorerViews showing the same data?", "qid": "10001602", "answers": [{"date": "2012-04-04T19:53:09.460", "user": "user159987"}], "tag": ["netbeans", "nodes", "netbeans-platform"], "user": "Martin Vondr\u00e1\u010dek (999539)", "creationDate": "2012-04-03T21:22:16.057"} +{"title": "Database Design: Default Address", "qid": "10001603", "answers": [{"date": "2012-04-03T21:39:52.017", "user": "Michael Valentin (1311443)"}, {"date": "2012-04-03T21:40:09.397", "user": "Abe Miessler (226897)"}], "tag": ["database", "database-design", "default-value", "addressbook"], "user": "Ashley Bye (428378)", "creationDate": "2012-04-03T21:22:20.090"} +{"title": "How do I keep all of the data in a has_many :through ActiveRecord relationship?", "qid": "10001609", "answers": [{"date": "2012-04-04T00:08:53.700", "user": "Yanhao (1093890)"}], "tag": ["ruby-on-rails", "activerecord"], "user": "DaveStephens (425144)", "creationDate": "2012-04-03T21:22:58.960"} +{"title": "Error java.lang.ClassNotFoundException, PathClassLoader.findClass() android", "qid": "10001610", "answers": [{"date": "2012-04-03T21:26:00.547", "user": "onit (897868)"}], "tag": ["classnotfoundexception"], "user": "mathewM (1311438)", "creationDate": "2012-04-03T21:22:59.470"} +{"title": "C++ Vector Arrays in Copy Constructors", "qid": "10001614", "answers": [{"date": "2012-04-03T21:28:20.290", "user": "Rob\u1d69 (8747)"}], "tag": ["c++", "pointers", "vector", "constructor"], "user": "0x01 (1311389)", "creationDate": "2012-04-03T21:23:16.777"} +{"title": "Launch MapMouseEvent in FLEX via alt + mouse click", "qid": "10001618", "answers": [{"date": "2012-04-11T18:45:07.057", "user": "Sam DeHaan (866193)"}], "tag": ["flex", "flash-builder"], "user": "Randall Sounhein (1311418)", "creationDate": "2012-04-03T21:23:26.980"} +{"title": "how does Salesforce charge for non-employee users, like customers?", "qid": "10001619", "answers": [{"date": "2012-04-03T21:31:02.047", "user": "Jeremy Ross (2517)"}], "tag": ["salesforce"], "user": "EndangeringSpecies (230018)", "creationDate": "2012-04-03T21:23:29.150"} +{"title": "Has anyone used Graph-based Databases (http://neo4j.org/)?", "qid": "1000162", "answers": [{"date": "2009-06-16T11:07:10.343", "user": "Will Harris (4702)"}, {"date": "2009-06-16T12:58:06.063", "user": "Craig Taverner (123678)"}, {"date": "2009-06-16T19:20:34.290", "user": "DataRiot (123874)"}, {"date": "2009-06-26T18:48:10.313", "user": "Turbo (100518)"}, {"date": "2009-06-30T23:06:28.800", "user": "John"}, {"date": "2009-09-12T08:36:02.067", "user": "Peter Neubauer (53404)"}, {"date": "2010-01-12T14:20:33.330", "user": "Paul Bock (248942)"}], "tag": ["database", "neo4j", "graph-databases"], "user": "Khangharoth (111919)", "creationDate": "2009-06-16T08:23:47.813"} +{"title": "How to read SMS using AT on an embedded system with limited memory?", "qid": "10001622", "answers": [{"date": "2012-04-03T22:54:13.910", "user": "Kyle Heironimus (26604)"}, {"date": "2012-04-04T06:27:17.307", "user": "timrorr (444040)"}], "tag": ["memory", "sms", "embedded", "at-command"], "user": "pbean (504451)", "creationDate": "2012-04-03T21:23:53.683"} +{"title": "Can I create server-side Java classes, OR mapping, and client-side AS classes from a single model description?", "qid": "1000163", "answers": [{"date": "2009-06-16T08:30:46.163", "user": "Antoine Claval (96613)"}, {"date": "2009-11-16T03:27:47.540", "user": "Ryan Lynch (194784)"}], "tag": ["java", "flex", "code-generation", "remoting"], "user": "Hanno Fietz (2077)", "creationDate": "2009-06-16T08:24:02.117"} +{"title": "Disable user profile edit?", "qid": "10001630", "answers": [{"date": "2012-04-03T21:30:46.433", "user": "overcrookd (426540)"}, {"date": "2013-02-23T07:00:35.853", "user": "bhavesh Khatri (2039010)"}], "tag": ["joomla", "joomla1.7", "joomla1.6", "joomla2.5"], "user": "theoth (1290391)", "creationDate": "2012-04-03T21:25:07.687"} +{"title": "cloning svg group", "qid": "10001631", "answers": [{"date": "2012-04-03T22:02:10.883", "user": "mihai (865038)"}], "tag": ["svg"], "user": "Ecrin (1073777)", "creationDate": "2012-04-03T21:25:13.277"} +{"title": "Formula in a database row - Java", "qid": "1000164", "answers": [{"date": "2009-06-16T08:28:25.293", "user": "Rahul (24424)"}], "tag": ["java", "parsing", "dsl", "formula"], "user": "Arun Manivannan", "creationDate": "2009-06-16T08:24:20.057"} +{"title": "Runtime error '91' on macro execution", "qid": "10001641", "answers": [{"date": "2012-04-03T22:23:21.150", "user": "Siddharth Rout (1140579)"}], "tag": ["excel-vba", "excel-2010"], "user": "SpeedCrazy (1017545)", "creationDate": "2012-04-03T21:25:50.863"} +{"title": "Document expired when click on back button", "qid": "10001643", "answers": [{"date": "2012-04-03T22:49:16.970", "user": "Jamie Sutherland (574825)"}, {"date": "2012-04-04T03:55:21.767", "user": "Dr. Dre (1247893)"}], "tag": ["zend-framework", "backspace"], "user": "palAlaa (2067571)", "creationDate": "2012-04-03T21:26:00.427"} +{"title": "Importing CSV and commas in string values", "qid": "10001651", "answers": [{"date": "2012-04-03T21:41:04.177", "user": "Erwin Brandstetter (939860)"}], "tag": ["postgresql", "csv", "postgresql-8.4"], "user": "zerkms (251311)", "creationDate": "2012-04-03T21:26:51.733"} +{"title": "How do you control an OverlayItem's size on the Google Android map?", "qid": "10001655", "answers": [{"date": "2012-04-04T01:47:10.390", "user": "Ring (219843)"}], "tag": ["java", "android", "google-maps"], "user": "Ring (219843)", "creationDate": "2012-04-03T21:27:16.117"} +{"title": "how to compile this logic in visual C++ express 2010", "qid": "10001656", "answers": [{"date": "2012-04-03T21:29:38.197", "user": "jakebird451 (1279231)"}, {"date": "2012-04-03T21:29:50.427", "user": "ildjarn (636019)"}, {"date": "2012-04-03T21:31:15.023", "user": "Lou (625981)"}], "tag": ["c++", "visual-studio-2010", "visual-c++"], "user": "user948950 (948950)", "creationDate": "2012-04-03T21:27:16.853"} +{"title": "\"Connecting\" SDL_Surface to shared_ptr", "qid": "10001657", "answers": [{"date": "2012-04-03T21:47:44.163", "user": "Benjamin Lindley (440119)"}], "tag": ["c++", "sdl", "shared-ptr"], "user": "fex (1235520)", "creationDate": "2012-04-03T21:27:21.127"} +{"title": "What is the equivalent of ruby script/about in Rails 3?", "qid": "10001663", "answers": [{"date": "2012-04-08T04:51:59.627", "user": "Paul Simpson (1005071)"}], "tag": ["ruby-on-rails", "ruby-on-rails-3"], "user": "Chirag Patel (135414)", "creationDate": "2012-04-03T21:27:44.400"} +{"title": "I can't keep track of my super DRY'd up code anymore. What are good ways to organize or retrieve partials I'm looking for?", "qid": "10001666", "answers": [], "tag": ["ruby-on-rails", "development-environment", "partial-views", "dry"], "user": "Vlad (996375)", "creationDate": "2012-04-03T21:27:54.110"} +{"title": "How to set the parent attribute of one spring bean to a property of another bean?", "qid": "10001668", "answers": [{"date": "2012-04-03T21:49:36.417", "user": "Adam (898289)"}], "tag": ["java", "spring"], "user": "user506069 (506069)", "creationDate": "2012-04-03T21:28:04.267"} +{"title": "Error C2593: Operator = is ambiguous", "qid": "1000167", "answers": [{"date": "2009-06-16T08:29:32.700", "user": "anon"}, {"date": "2009-06-16T08:31:03.620", "user": "Sev (83819)"}, {"date": "2009-06-16T08:31:12.683", "user": "Naveen (39742)"}, {"date": "2009-06-16T10:01:21.757", "user": "Daniel Daranas (96780)"}], "tag": ["c++", "visual-studio-2008", "porting", "vc6", "wstring"], "user": "bobbyalex (117531)", "creationDate": "2009-06-16T08:25:31.523"} +{"title": "Unique ID Generation on the Cloud", "qid": "10001671", "answers": [{"date": "2012-04-03T21:45:05.253", "user": "Eric J. (141172)"}, {"date": "2012-04-04T05:44:44.987", "user": "JuneT (2046598)"}], "tag": ["c#", "windows", "azure", "sql-azure"], "user": "Carlo Mendoza (308032)", "creationDate": "2012-04-03T21:28:07.467"} +{"title": "About the implementation of Java HashMap", "qid": "10001672", "answers": [{"date": "2012-04-03T21:34:28.023", "user": "Ted Hopp (535871)"}, {"date": "2012-04-03T21:46:02.647", "user": "Hot Licks (581994)"}], "tag": ["java", "hashmap"], "user": "lingguang1997 (1265157)", "creationDate": "2012-04-03T21:28:09.243"} +{"title": "Group jobs together in Jenkins or Serialize them or run them in Sequence", "qid": "10001673", "answers": [{"date": "2012-04-03T21:37:17.657", "user": "gareth_bowles (10715)"}, {"date": "2012-04-04T20:19:28.373", "user": "sti (1287080)"}, {"date": "2012-04-06T14:46:33.190", "user": "Anas Alkhatib (275583)"}], "tag": ["jenkins", "jenkins-plugins"], "user": "Anas Alkhatib (275583)", "creationDate": "2012-04-03T21:28:09.317"} +{"title": "Exporting Excel data using MVC 3", "qid": "10001678", "answers": [{"date": "2012-04-03T22:08:06.193", "user": "Pedro (289779)"}], "tag": ["c#", "asp.net-mvc-3", "excel"], "user": "Goldentp (1130212)", "creationDate": "2012-04-03T21:28:17.037"} +{"title": "Idea on content passing. Help needed", "qid": "10001681", "answers": [{"date": "2012-04-03T22:18:51.473", "user": "Soc (1090267)"}, {"date": "2012-04-05T03:09:41.580", "user": "Dennis (850833)"}], "tag": ["javascript", "ajax", "html5", "innerhtml", "ecmascript-5"], "user": "Brandon Clark (1275386)", "creationDate": "2012-04-03T21:28:22.223"} +{"title": "Dependency property does not work within a geometry in a controltemplate", "qid": "10001686", "answers": [{"date": "2012-04-03T21:41:33.757", "user": "ColinE (249933)"}], "tag": ["wpf", "geometry", "dependency-properties"], "user": "Erik Bongers (1311434)", "creationDate": "2012-04-03T21:28:46.433"} +{"title": "php symfony2 login_check captcha", "qid": "10001693", "answers": [{"date": "2013-09-16T07:06:08.480", "user": "Edmund Beinarovic (2571990)"}], "tag": ["php"], "user": "user1311463 (1311463)", "creationDate": "2012-04-03T21:29:13.930"} +{"title": "How do I override javascript's cloneNode?", "qid": "10001694", "answers": [{"date": "2012-04-03T21:35:59.750", "user": "Casey Chu (298233)"}, {"date": "2012-04-03T21:39:21.857", "user": "Juan Mendes (227299)"}, {"date": "2012-04-04T14:53:26.827", "user": "NullVoxPopuli (356849)"}], "tag": ["javascript", "prototype"], "user": "NullVoxPopuli (356849)", "creationDate": "2012-04-03T21:29:21.877"} +{"title": "WPF timer countdown", "qid": "10001698", "answers": [{"date": "2012-04-03T21:33:55.167", "user": "thumbmunkeys (451540)"}, {"date": "2012-04-03T21:36:46.803", "user": "kayz1 (1127843)"}], "tag": ["c#", "wpf", "timer", "countdown"], "user": "Dante1986 (1140876)", "creationDate": "2012-04-03T21:29:45.653"} +{"title": "Building a large complex viewmodel dynamically", "qid": "10001701", "answers": [{"date": "2012-04-04T22:42:26.223", "user": "Travis J (1026459)"}], "tag": ["ajax", "asp.net-mvc-3", "viewmodel", "partial-view"], "user": "Travis J (1026459)", "creationDate": "2012-04-03T21:29:56.683"} +{"title": "Verification: combining correctness statements", "qid": "10001704", "answers": [{"date": "2012-04-03T22:27:05.713", "user": "Anthales (1250595)"}], "tag": ["assert", "verification", "proof", "correctness"], "user": "kbirk (785259)", "creationDate": "2012-04-03T21:30:02.403"} +{"title": "Getting error: external allocation too large for this process", "qid": "10001706", "answers": [{"date": "2012-04-03T21:36:50.987", "user": "kabuko (793522)"}, {"date": "2012-04-03T21:49:22.957", "user": "Jon O (429108)"}], "tag": ["android", "bitmap"], "user": "user182192 (1295620)", "creationDate": "2012-04-03T21:30:07.443"} +{"title": "jquery random colours", "qid": "10001708", "answers": [{"date": "2012-04-05T19:32:08.987", "user": "jandjorgensen (437226)"}], "tag": ["jquery"], "user": "Sam Miller (1311291)", "creationDate": "2012-04-03T21:30:45.153"} +{"title": "Java: De-deprecated-ing Tools", "qid": "1000171", "answers": [{"date": "2009-06-16T08:29:01.627", "user": "Robert Munteanu (112671)"}, {"date": "2009-06-16T08:31:04.697", "user": "Jon Skeet (22656)"}, {"date": "2009-06-16T08:38:07.773", "user": "Kevin Montrose (80572)"}, {"date": "2009-06-16T09:06:51.943", "user": "Rorick (11732)"}], "tag": ["java", "refactoring", "deprecated"], "user": "Ande (4857)", "creationDate": "2009-06-16T08:26:13.363"} +{"title": "cordinates to placename using google maps api v3", "qid": "10001710", "answers": [{"date": "2012-04-03T21:57:23.987", "user": "Dr.Molle (459897)"}], "tag": ["javascript", "google-maps", "google-maps-api-3", "geocoding", "reverse-geocoding"], "user": "acidburn (1311455)", "creationDate": "2012-04-03T21:30:51.143"} +{"title": "sqlite db called from flask only returns variables, not values", "qid": "10001712", "answers": [{"date": "2012-04-04T03:50:09.140", "user": "Sean Vieira (135978)"}], "tag": ["python", "html", "sqlite", "flask"], "user": "Stedy (163809)", "creationDate": "2012-04-03T21:30:58.490"} +{"title": "Kohana 3.2 set router for a controller which has a prefix URI belongs to another controller", "qid": "10001714", "answers": [{"date": "2012-04-04T06:38:44.393", "user": "matino (831531)"}], "tag": ["controller", "kohana", "router", "kohana-orm", "kohana-3.2"], "user": "lnguyen55 (822085)", "creationDate": "2012-04-03T21:31:02.653"} +{"title": "extracting values from an aovp object in Lmperm", "qid": "10001716", "answers": [{"date": "2012-05-22T12:37:07.147", "user": "Henrik (289572)"}], "tag": ["r", "list", "extraction"], "user": "Agus camacho (1099369)", "creationDate": "2012-04-03T21:31:02.903"} +{"title": "Access GET variables using jQuery/Javascript", "qid": "10001726", "answers": [{"date": "2012-04-03T21:34:23.217", "user": "mikevoermans (961847)"}, {"date": "2012-04-03T21:39:18.413", "user": "Kasapo (497369)"}, {"date": "2012-04-03T21:56:55.107", "user": "Shahrukh (457487)"}], "tag": ["javascript", "jquery"], "user": "Rhawb (1229719)", "creationDate": "2012-04-03T21:32:02.263"} +{"title": "How to prohibit system calls, GNU/Linux", "qid": "10001727", "answers": [{"date": "2012-04-03T21:43:14.243", "user": "Ben Voigt (103167)"}, {"date": "2012-04-03T21:53:16.417", "user": "timday (24283)"}, {"date": "2012-04-03T21:57:23.053", "user": "ephemient (20713)"}], "tag": ["linux", "system-calls"], "user": "suddnely_me (2612002)", "creationDate": "2012-04-03T21:32:27.710"} +{"title": "How to flip image horizontaly and vertically with php", "qid": "10001728", "answers": [{"date": "2012-04-03T21:39:23.030", "user": "ghoti (1072112)"}, {"date": "2012-04-03T21:45:15.457", "user": "Jon Grant (18774)"}, {"date": "2014-12-17T22:28:08.773", "user": "Victor BV (2930272)"}], "tag": ["php", "image", "flip"], "user": "Pedro Soares (950156)", "creationDate": "2012-04-03T21:32:57.087"} +{"title": "List type problem in Internet Explorer", "qid": "1000173", "answers": [{"date": "2009-06-16T08:41:50.760", "user": "Alistair Knock (80482)"}, {"date": "2009-06-16T08:50:52.083", "user": "CtlAltDel (122040)"}, {"date": "2009-06-16T09:59:12.617", "user": "pw. (66574)"}], "tag": ["html", "css"], "user": "bboran (123555)", "creationDate": "2009-06-16T08:26:59.633"} +{"title": "Does GameObject.GetComponent() find sub classes?", "qid": "10001730", "answers": [{"date": "2012-04-05T08:15:33.067", "user": "Talemon (202032)"}, {"date": "2014-11-12T14:57:41.623", "user": "Vitalii Vasylenko (1154733)"}], "tag": ["unity3d"], "user": "Chris (962289)", "creationDate": "2012-04-03T21:32:59.613"} +{"title": "How to tell if the mouse is moving in c#", "qid": "10001734", "answers": [{"date": "2012-04-03T21:39:12.530", "user": "Murtnowski (1308788)"}, {"date": "2012-04-03T21:40:14.580", "user": "njebert (83766)"}], "tag": ["c#", "xna", "mouse"], "user": "hazard1994 (1183432)", "creationDate": "2012-04-03T21:33:10.097"} +{"title": "Drop sequence and cascade", "qid": "10001735", "answers": [{"date": "2012-04-03T21:49:47.793", "user": "Milen A. Radev (15785)"}, {"date": "2012-04-03T22:06:02.343", "user": "kgrittn (1309107)"}, {"date": "2012-04-03T22:07:02.377", "user": "Erwin Brandstetter (939860)"}], "tag": ["postgresql"], "user": "Chris Koston (1082889)", "creationDate": "2012-04-03T21:33:12.297"} +{"title": "SQL Server 2005 Case Sensitive when queried via C#", "qid": "10001736", "answers": [{"date": "2012-04-03T21:42:46.070", "user": "Blake Mitchell (768100)"}, {"date": "2012-04-03T21:52:03.473", "user": "Lucero (88558)"}], "tag": ["c#", "sql-server", "collation", "case-sensitive"], "user": "Hollis (1311405)", "creationDate": "2012-04-03T21:33:12.450"} +{"title": "Windows: only the first 1000 characters of my PATH environment variable can be used", "qid": "10001740", "answers": [], "tag": ["windows", "eclipse", "environment-variables", "executable-path"], "user": "kakyo (987846)", "creationDate": "2012-04-03T21:33:26.820"} +{"title": "simplify appending domain to filenames in python", "qid": "10001745", "answers": [{"date": "2012-04-03T21:37:41.643", "user": "Mark Ransom (5987)"}], "tag": ["python", "csv"], "user": "chrisjlee (171217)", "creationDate": "2012-04-03T21:33:58.783"} +{"title": "Physical path of localhost During VS 2008 Debug", "qid": "1000175", "answers": [{"date": "2009-06-16T08:30:58.923", "user": "Micha\u0142 Chaniewski (119800)"}], "tag": ["visual-studio-2008"], "user": "Graviton (3834)", "creationDate": "2009-06-16T08:28:05.557"} +{"title": "std::thread with movable, non-copyable argument", "qid": "10001751", "answers": [{"date": "2012-04-03T21:47:10.803", "user": "Nicol Bolas (734069)"}, {"date": "2012-04-03T22:19:32.197", "user": "Kerrek SB (596781)"}], "tag": ["c++", "multithreading", "c++11", "rvalue-reference"], "user": "bames53 (365496)", "creationDate": "2012-04-03T21:34:18.677"} +{"title": "JavaScript variable name and HTML input name attribute: namespace collision?", "qid": "10001752", "answers": [{"date": "2012-04-03T21:38:02.007", "user": "elclanrs (670396)"}], "tag": ["javascript", "html", "dom"], "user": "The111 (912935)", "creationDate": "2012-04-03T21:34:21.837"} +{"title": "How to kick user to Login Screen Activity passing all other app Activities in the stack?", "qid": "10001755", "answers": [{"date": "2012-04-03T21:39:56.293", "user": "Jon O (429108)"}, {"date": "2012-04-03T21:54:03.533", "user": "JRaymond (947304)"}], "tag": ["java", "android"], "user": "Jake Wilson (172350)", "creationDate": "2012-04-03T21:34:29.817"} +{"title": "What does in ClassName in java indicate?", "qid": "10001756", "answers": [{"date": "2012-04-03T21:35:35.120", "user": "enrmarc (434171)"}, {"date": "2012-04-03T21:37:47.940", "user": "Kevin (218121)"}, {"date": "2012-04-03T21:40:08.063", "user": "ach (1311394)"}], "tag": ["java"], "user": "MeetM (628218)", "creationDate": "2012-04-03T21:34:32.233"} +{"title": "How to compute k largest eigen values on GPU?", "qid": "10001763", "answers": [{"date": "2012-05-27T17:04:58.580", "user": "Adam27X (728127)"}], "tag": ["cuda", "eigenvector", "eigenvalue", "jacket"], "user": "username_4567 (997704)", "creationDate": "2012-04-03T21:35:14.070"} +{"title": "XPathSelectElement is very slow; is there a better way to get a value given an XPath?", "qid": "10001766", "answers": [{"date": "2012-04-03T21:53:09.567", "user": "Alexei Levenkov (477420)"}, {"date": "2012-04-04T16:43:38.850", "user": "K J (513847)"}, {"date": "2012-09-14T09:39:52.047", "user": "Naryoril (960697)"}], "tag": ["c#", "xml", "xpath", "linq-to-xml"], "user": "K J (513847)", "creationDate": "2012-04-03T21:35:31.500"} +{"title": "How to determine at runtime if I am connected to production database?", "qid": "10001773", "answers": [{"date": "2012-04-03T21:39:22.797", "user": "Kevin (1942)"}, {"date": "2012-04-03T22:06:21.137", "user": "Michael Fredrickson (643591)"}, {"date": "2012-04-03T22:11:11.450", "user": "Mike Purcell (529967)"}, {"date": "2012-04-18T21:31:55.243", "user": "DaveN59 (83678)"}], "tag": ["sql-server", "database", "wcf", "version", "slowcheetah"], "user": "DaveN59 (83678)", "creationDate": "2012-04-03T21:36:03.027"} +{"title": "Where can I find comprehensive image manipulation library information?", "qid": "10001774", "answers": [{"date": "2012-10-05T15:53:37.497", "user": "Kenny (1090474)"}], "tag": ["php", "image", "image-processing"], "user": "Isius (1024808)", "creationDate": "2012-04-03T21:36:12.933"} +{"title": "Wrapping a parent div around floated elements", "qid": "10001777", "answers": [{"date": "2012-04-03T22:29:37.137", "user": "JamesSwift (1273175)"}], "tag": ["html", "css"], "user": "user7009 (1311474)", "creationDate": "2012-04-03T21:36:25.690"} +{"title": "Where can I find information on how to develop for Opera Unite? [close]", "qid": "1000178", "answers": [{"date": "2011-01-26T18:17:52.370", "user": "karlcow (62262)"}], "tag": ["opera"], "user": "MrValdez (1599)", "creationDate": "2009-06-16T08:28:29.847"} +{"title": "WinRT metro app still blocks the UI thread when called via an async method", "qid": "10001781", "answers": [{"date": "2012-04-03T22:01:31.127", "user": "svick (41071)"}], "tag": ["c#", "asynchronous", "windows-runtime", "c#-5.0", "async-ctp"], "user": "Spock (301637)", "creationDate": "2012-04-03T21:36:58.393"} +{"title": "how to validate a single attribute from a nested object", "qid": "10001794", "answers": [{"date": "2012-04-03T23:55:11.683", "user": "VelLes (750955)"}, {"date": "2012-04-04T15:48:25.613", "user": "flynfish (980459)"}, {"date": "2012-06-07T02:28:31.647", "user": "vosiro (988558)"}], "tag": ["ruby-on-rails", "validation", "activerecord"], "user": "flynfish (980459)", "creationDate": "2012-04-03T21:37:59.297"} +{"title": "Conventional way of copying files in Gradle - use Copy task or copy method?", "qid": "10001795", "answers": [{"date": "2012-04-03T22:36:42.343", "user": "Peter Niederwieser (84889)"}], "tag": ["gradle"], "user": "vicjugador (76487)", "creationDate": "2012-04-03T21:38:00.300"} +{"title": "Creating forms from models", "qid": "10001799", "answers": [{"date": "2012-04-03T21:46:15.737", "user": "jvc26 (781909)"}], "tag": ["django", "forms"], "user": "kasuga (1311449)", "creationDate": "2012-04-03T21:38:23.493"} +{"title": "Counting objects in an array (Javascript)", "qid": "10001801", "answers": [{"date": "2012-04-03T21:43:04.897", "user": "Francisc (383148)"}, {"date": "2012-04-03T21:44:09.803", "user": "Kasapo (497369)"}, {"date": "2012-04-03T21:44:12.167", "user": "Jordan (311339)"}], "tag": ["javascript", "arrays"], "user": "Saturnix (1307020)", "creationDate": "2012-04-03T21:38:31.500"} +{"title": "How do I access the database created in python manage.py testserver?", "qid": "10001803", "answers": [{"date": "2012-04-03T21:43:14.380", "user": "sdolan (186868)"}], "tag": ["django", "unit-testing", "sqlite3"], "user": "BryanWheelock (86731)", "creationDate": "2012-04-03T21:38:39.090"} +{"title": "How to silence the \"video capture device\" popup?", "qid": "10001805", "answers": [], "tag": ["android", "android-emulator", "emulator", "startup"], "user": "mmo (423411)", "creationDate": "2012-04-03T21:38:43.527"} +{"title": "Yii -CExistValidator for external key", "qid": "10001806", "answers": [{"date": "2012-04-04T01:26:53.460", "user": "Petra Barus (688954)"}], "tag": ["yii"], "user": "maxdangelo (1286263)", "creationDate": "2012-04-03T21:39:00.373"} +{"title": "Missing Namespace in Doctrine Generated Entities?", "qid": "10001807", "answers": [{"date": "2012-04-06T08:30:11.820", "user": "Askent (1068269)"}], "tag": ["zend-framework", "doctrine2"], "user": "MikeGA (1108278)", "creationDate": "2012-04-03T21:39:06.407"} +{"title": "Issue with classpath in Java project", "qid": "1000181", "answers": [{"date": "2009-06-16T08:35:26.280", "user": "Jon Skeet (22656)"}, {"date": "2009-06-16T08:37:48.943", "user": "Rahul (24424)"}], "tag": ["java", "jar", "tibco"], "user": "swapnil (121234)", "creationDate": "2009-06-16T08:29:11.500"} +{"title": "How to know if a file has 'access' monitor in linux", "qid": "10001810", "answers": [], "tag": ["linux", "security", "linux-kernel", "command", "monitoring"], "user": "J L (1311209)", "creationDate": "2012-04-03T21:39:19.117"} +{"title": "php access to mongodb master/slave access", "qid": "10001813", "answers": [{"date": "2012-04-03T21:48:05.813", "user": "ceejayoz (1902010)"}], "tag": ["php", "mongodb"], "user": "Amir (781864)", "creationDate": "2012-04-03T21:39:22.747"} +{"title": "Type(3,) returns an integer instead of a tuple in python, why?", "qid": "10001816", "answers": [{"date": "2012-04-03T21:42:08.750", "user": "Russell Borogove (374746)"}, {"date": "2012-04-03T21:43:27.720", "user": "Sven Marnach (279627)"}, {"date": "2012-04-03T21:49:38.507", "user": "Gary Fixler (955926)"}, {"date": "2012-04-03T21:50:00.650", "user": "John Machin (84270)"}], "tag": ["python", "types", "tuples"], "user": "Bentley4 (1305724)", "creationDate": "2012-04-03T21:39:28.280"} +{"title": "FluentNHibernate set default column value for a bool", "qid": "1000182", "answers": [{"date": "2009-06-16T08:45:07.837", "user": "dove (30913)"}, {"date": "2009-10-14T20:37:54.870", "user": "Nikola Malovic (19934)"}], "tag": [".net", "sql-server-2005", "fluent-nhibernate"], "user": "diadiora (104369)", "creationDate": "2009-06-16T08:29:22.890"} +{"title": "Include not available in inherited repostory", "qid": "10001820", "answers": [{"date": "2012-04-03T21:56:47.557", "user": "Thomas Levesque (98713)"}], "tag": ["linq", "entity-framework", "linq-to-entities"], "user": "AnonyMouse (822229)", "creationDate": "2012-04-03T21:39:58.747"} +{"title": "How would you make emacs write out line numbers into a file?", "qid": "10001829", "answers": [{"date": "2012-04-03T22:09:25.367", "user": "Moritz Bunkus (507077)"}, {"date": "2012-04-03T22:11:13.497", "user": "ataylor (190201)"}, {"date": "2012-04-04T09:03:51.103", "user": "huaiyuan (16240)"}], "tag": ["emacs"], "user": "user1098798 (1098798)", "creationDate": "2012-04-03T21:40:31.963"} +{"title": "Reliable File.renameTo() alternative on Windows?", "qid": "1000183", "answers": [{"date": "2009-06-16T08:34:03.100", "user": "Anton Gogolev (60188)"}, {"date": "2009-06-16T08:58:35.687", "user": "Blindy (108796)"}, {"date": "2009-06-16T19:20:20.547", "user": "Ravi Wallau (63436)"}, {"date": "2012-04-07T13:58:22.270", "user": "iltaf khalid (1209409)"}, {"date": "2009-06-17T11:38:50.913", "user": "Jonik (56285)"}, {"date": "2012-10-25T08:24:55.227", "user": "casgage (1217877)"}, {"date": "2012-11-16T23:41:16.663", "user": "MBecker (1831027)"}, {"date": "2013-01-02T13:59:26.783", "user": "wuppi (1171253)"}, {"date": "2014-04-02T06:20:01.193", "user": "Tharaka Manawardhana (1401707)"}, {"date": "2010-05-28T18:02:38.593", "user": "MykennaC (30818)"}, {"date": "2010-11-30T03:06:00.753", "user": "Kactus (524623)"}, {"date": "2011-02-17T00:15:13.197", "user": "crazy horse (204312)"}, {"date": "2011-03-27T18:01:50.120", "user": "Alan (527768)"}, {"date": "2012-01-11T15:40:19.377", "user": "Johnydep (750965)"}], "tag": ["java", "windows", "file", "file-io"], "user": "Jonik (56285)", "creationDate": "2009-06-16T08:29:29.050"} +{"title": "CakePHP How do I display all table field names", "qid": "10001831", "answers": [{"date": "2012-04-03T21:52:26.883", "user": "Aziz (75990)"}, {"date": "2012-04-03T22:54:24.003", "user": "jeremyharris (724063)"}, {"date": "2012-04-04T02:14:19.240", "user": "Marius Talagiu (1268884)"}], "tag": ["cakephp"], "user": "Mike S. (226118)", "creationDate": "2012-04-03T21:40:44.417"} +{"title": "Share data between services", "qid": "10001834", "answers": [{"date": "2012-04-03T23:15:03.350", "user": "surfen (724944)"}], "tag": ["c#", "wcf"], "user": "Eric (171560)", "creationDate": "2012-04-03T21:41:00.010"} +{"title": "How to reset a form that uses \"sticky\" values", "qid": "10001844", "answers": [{"date": "2012-04-03T21:44:33.773", "user": "Francisc (383148)"}, {"date": "2012-04-03T21:44:41.163", "user": "hakre (367456)"}, {"date": "2012-04-03T21:45:06.967", "user": "mkk (877581)"}, {"date": "2012-04-03T21:46:02.333", "user": "gyula.nemeth (1311367)"}], "tag": ["php", "forms", "session", "sticky"], "user": "Brad Givens (1311452)", "creationDate": "2012-04-03T21:41:39.060"} +{"title": "Cocoa: Animated path (moving dotted line)", "qid": "10001846", "answers": [{"date": "2012-04-03T21:55:45.620", "user": "snakeoil (683278)"}, {"date": "2012-04-04T06:16:36.980", "user": "Kurt Revis (1218876)"}], "tag": ["cocoa", "animation", "selection", "marching-ants"], "user": "mtmurdock (339428)", "creationDate": "2012-04-03T21:42:07.643"} +{"title": "what's best practice for serving multiple configuration property files for many applications over HTTP?", "qid": "10001848", "answers": [], "tag": ["java", "configuration", "properties"], "user": "maestr0 (1265315)", "creationDate": "2012-04-03T21:42:08.627"} +{"title": "Disable auto refresh on div if user is scrolling (JQuery)", "qid": "10001864", "answers": [{"date": "2012-04-03T21:53:25.517", "user": "xbonez (315828)"}, {"date": "2012-04-03T21:57:00.393", "user": "Ryan P (1169883)"}, {"date": "2012-04-03T22:02:55.723", "user": "Selvakumar Arumugam (297641)"}], "tag": ["php", "jquery", "css", "scroll", "refresh"], "user": "DobotJr (739035)", "creationDate": "2012-04-03T21:43:48.977"} +{"title": "Web API + MVC 4 regarding model binding of complex types", "qid": "10001879", "answers": [{"date": "2012-04-04T08:37:36.550", "user": "tugberk (463785)"}, {"date": "2013-06-05T14:03:04.267", "user": "SBirthare (1529150)"}], "tag": ["asp.net-mvc-4", "asp.net-web-api", "entity-framework-4.1"], "user": "khaihon (1058857)", "creationDate": "2012-04-03T21:44:52.027"} +{"title": "Using foreach to modify arrays starting with whitespace in php", "qid": "10001886", "answers": [{"date": "2012-04-03T21:52:21.583", "user": "mowwwalker (828584)"}, {"date": "2012-04-03T21:54:46.450", "user": "Pete (428531)"}, {"date": "2012-04-03T21:57:44.977", "user": "pinouchon (311744)"}, {"date": "2012-04-03T21:58:01.917", "user": "hakre (367456)"}, {"date": "2012-04-03T21:59:46.750", "user": "Spencer Avinger (517676)"}], "tag": ["php"], "user": "yarhouse (1309103)", "creationDate": "2012-04-03T21:45:51.630"} +{"title": "Eclipse Maven build failing on including xpp3 in com.google.android", "qid": "10001891", "answers": [{"date": "2012-04-04T11:25:25.500", "user": "Ricardo Gladwell (48611)"}, {"date": "2012-04-04T11:30:32.657", "user": "Konstantin Pribluda (683735)"}], "tag": ["android", "eclipse", "maven"], "user": "Bry M. (879221)", "creationDate": "2012-04-03T21:46:24.670"} +{"title": "mongoDB - stale values in map reduce output Collection", "qid": "10001892", "answers": [], "tag": ["java", "mongodb", "mapreduce"], "user": "danny.lesnik (225396)", "creationDate": "2012-04-03T21:46:24.490"} +{"title": "Diagnostics Trace data disappears after exception", "qid": "10001894", "answers": [{"date": "2012-04-03T21:47:39.403", "user": "mellamokb (116614)"}], "tag": ["asp.net", ".net", "azure", "system.diagnostics", "windows-azure-diagnostics"], "user": "Registered User (848117)", "creationDate": "2012-04-03T21:46:29.887"} +{"title": "Linux recursive chmod only on sub-directories", "qid": "10001895", "answers": [{"date": "2012-04-03T21:49:26.340", "user": "Philip Kendall (525010)"}, {"date": "2012-04-03T21:51:16.587", "user": "quodlibetor (25616)"}, {"date": "2012-04-03T21:54:45.570", "user": "Darren Dempsey (1166890)"}, {"date": "2014-10-16T05:50:38.160", "user": "Jared Scott (538512)"}], "tag": ["linux", "chmod"], "user": "Sean (524077)", "creationDate": "2012-04-03T21:46:59.090"} +{"title": "My content in a mysql database duplicates when I edit articles", "qid": "10001897", "answers": [{"date": "2012-04-03T21:49:17.450", "user": "Eric J. (141172)"}, {"date": "2012-04-03T21:53:23.550", "user": "chown (836407)"}], "tag": ["php", "mysql", "content-management-system", "duplicates"], "user": "huddds (1101979)", "creationDate": "2012-04-03T21:47:09.290"} +{"title": "Multiple notification icons on one bar?", "qid": "10001899", "answers": [{"date": "2012-04-03T22:04:40.153", "user": "kabuko (793522)"}], "tag": ["android"], "user": "JonPM (1010376)", "creationDate": "2012-04-03T21:47:22.710"} +{"title": "iOS: Tagging Errors", "qid": "10001907", "answers": [{"date": "2012-04-03T21:58:26.083", "user": "Aleph7 (230987)"}], "tag": ["objective-c", "ios", "xcode", "tags"], "user": "John (1088618)", "creationDate": "2012-04-03T21:48:15.107"} +{"title": "Java Component Maximum Size", "qid": "10001910", "answers": [{"date": "2012-04-03T22:01:56.830", "user": "Martijn Courteaux (155137)"}, {"date": "2012-04-03T22:09:42.000", "user": "rob (44737)"}], "tag": ["java", "components", "size"], "user": "Chris192 (882006)", "creationDate": "2012-04-03T21:48:31.783"} +{"title": "Suggestion for a large hash table (2^25 elements)", "qid": "10001917", "answers": [{"date": "2012-04-04T01:06:20.647", "user": "Arpssss (772399)"}, {"date": "2012-04-04T01:46:02.613", "user": "Edward KMETT (34707)"}], "tag": ["haskell", "hash", "hashmap"], "user": "ErikR (866915)", "creationDate": "2012-04-03T21:49:18.260"} +{"title": "Sanitizing PHP input to ping program", "qid": "1000192", "answers": [{"date": "2009-06-16T08:33:33.117", "user": "Haim Evgi (74314)"}, {"date": "2009-06-16T08:35:24.003", "user": "Paolo Bergantino (16417)"}], "tag": ["php", "sanitization", "sanitize"], "user": "Unknown (57757)", "creationDate": "2009-06-16T08:30:48.190"} +{"title": "Different images for highlighted UIButton state", "qid": "10001923", "answers": [{"date": "2012-04-03T21:56:27.010", "user": "CodaFi (945847)"}, {"date": "2012-04-03T22:31:11.810", "user": "danh (294949)"}, {"date": "2012-04-04T00:30:35.297", "user": "Fred Collins (719127)"}, {"date": "2012-04-04T00:49:05.700", "user": "danh (294949)"}], "tag": ["iphone", "objective-c", "cocoa-touch", "uibutton"], "user": "Fred Collins (719127)", "creationDate": "2012-04-03T21:49:37.200"} +{"title": "HTML: Set table width when pictures are too big", "qid": "10001928", "answers": [{"date": "2012-04-03T21:54:04.073", "user": "Matthew Darnell (1265216)"}, {"date": "2012-04-03T21:54:39.057", "user": "jacktheripper (1014805)"}], "tag": ["html", "css", "table"], "user": "DudiD (865326)", "creationDate": "2012-04-03T21:49:59.320"} +{"title": "Dynamically loaded content with jQuery load clears the existing html", "qid": "10001930", "answers": [{"date": "2012-04-03T21:53:52.833", "user": "gdoron (601179)"}, {"date": "2012-04-03T22:06:40.240", "user": "Silver89 (1072492)"}], "tag": ["jquery"], "user": "Silver89 (1072492)", "creationDate": "2012-04-03T21:50:01.893"} +{"title": "pgrep prints a different pid than expected", "qid": "10001932", "answers": [{"date": "2012-04-04T01:25:26.310", "user": "Mikel (102182)"}], "tag": ["bash", "grep"], "user": "Michael Hogg (1311453)", "creationDate": "2012-04-03T21:50:12.407"} +{"title": "Check if IP is in subnet", "qid": "10001933", "answers": [{"date": "2012-04-03T22:00:31.400", "user": "Jon (50079)"}, {"date": "2012-04-03T22:36:28.000", "user": "Adam (898289)"}, {"date": "2015-04-27T09:45:15.203", "user": "Martin (1695049)"}], "tag": ["mysql", "ip", "subnet"], "user": "matiasf (220857)", "creationDate": "2012-04-03T21:50:22.500"} +{"title": "CSS arrow to the right of a rounded rectangle \"next\" button", "qid": "10001935", "answers": [{"date": "2012-04-03T23:33:46.560", "user": "ScottS (369707)"}], "tag": ["css"], "user": "cambraca (368864)", "creationDate": "2012-04-03T21:50:31.803"} +{"title": "MySQL Triggers. Need example answers", "qid": "10001939", "answers": [{"date": "2012-04-03T21:54:53.213", "user": "max_ (556479)"}, {"date": "2012-04-03T21:56:35.767", "user": "Victor Nitu (965912)"}, {"date": "2012-04-03T21:59:02.927", "user": "Michael Fredrickson (643591)"}, {"date": "2012-04-03T21:59:08.717", "user": "kasavbere (1257771)"}, {"date": "2012-04-03T22:00:38.420", "user": "Victor Nitu (965912)"}], "tag": ["mysql"], "user": "user1311286", "creationDate": "2012-04-03T21:51:01.097"} +{"title": "How to register DOM id when writing objects dynamically in javascript?", "qid": "10001940", "answers": [{"date": "2012-04-03T22:07:04.547", "user": "user420095"}, {"date": "2012-04-03T22:13:43.213", "user": "gilly3 (361684)"}, {"date": "2012-04-03T22:15:13.243", "user": "Omiga (1291995)"}], "tag": ["javascript", "dom"], "user": "Ozzy (1031312)", "creationDate": "2012-04-03T21:51:01.363"} +{"title": "Be careful with CSS em units when taking advantage of rules of specificity?", "qid": "10001941", "answers": [{"date": "2012-04-03T21:57:46.147", "user": "jnylen (106302)"}, {"date": "2012-04-03T21:58:16.297", "user": "JDD (717679)"}, {"date": "2012-04-03T22:40:26.647", "user": "Sean Dunwoody (1125402)"}], "tag": ["css", "pixel", "font-size", "em"], "user": "John (27305)", "creationDate": "2012-04-03T21:51:07.337"} +{"title": "EXT JS store not loading data correctly from getJson call", "qid": "10001945", "answers": [{"date": "2012-04-04T10:04:25.283", "user": "e-zinc (1071587)"}], "tag": ["javascript", "extjs", "extjs4", "getjson"], "user": "Stirling (241242)", "creationDate": "2012-04-03T21:51:17.570"} +{"title": "Jquery, move dropdown position", "qid": "10001947", "answers": [{"date": "2012-04-03T22:01:38.637", "user": "Matthew Darnell (1265216)"}], "tag": ["jquery", "css", "drop-down-menu", "submenu"], "user": "David Kneale (1311459)", "creationDate": "2012-04-03T21:51:33.563"} +{"title": "SQL joins trouble", "qid": "10001948", "answers": [{"date": "2012-04-04T08:57:38.493", "user": "lemunk (1064134)"}], "tag": ["sql", "sql-server", "sql-server-2008", "join"], "user": "lemunk (1064134)", "creationDate": "2012-04-03T21:51:37.090"} +{"title": "Image resizing web service", "qid": "1000195", "answers": [{"date": "2009-06-16T08:41:15.880", "user": "tuergeist (98525)"}, {"date": "2009-07-23T16:04:27.853", "user": "endolith (125507)"}, {"date": "2009-11-10T01:46:52.307", "user": "Paul McGuire (165216)"}, {"date": "2010-06-13T01:25:54.927", "user": "eahanson (365473)"}], "tag": ["php", "python", "ruby", "web-services", "image-processing"], "user": "user123562 (123562)", "creationDate": "2009-06-16T08:31:02.963"} +{"title": "Action Bar Checkable Icons?", "qid": "10001951", "answers": [{"date": "2012-04-03T22:00:13.037", "user": "kabuko (793522)"}, {"date": "2012-04-03T22:00:32.070", "user": "Jon O (429108)"}], "tag": ["android", "android-4.0", "actionbarsherlock", "android-actionbar"], "user": "roboguy12 (766650)", "creationDate": "2012-04-03T21:51:53.393"} +{"title": "Get value of an element without parse all xml file in ios", "qid": "10001955", "answers": [{"date": "2012-04-03T22:24:54.907", "user": "jmstone (1148055)"}], "tag": ["ios", "xml", "nsxmlparser"], "user": "Piero (678833)", "creationDate": "2012-04-03T21:52:13.990"} +{"title": "clear inputbox onclick image", "qid": "10001956", "answers": [{"date": "2012-04-03T21:58:52.853", "user": "P1aincloth3sM4n (891048)"}, {"date": "2012-04-03T22:00:31.020", "user": "Rorchackh (495416)"}], "tag": ["javascript", "onclick", "inputbox"], "user": "Maarten Hartman (1021185)", "creationDate": "2012-04-03T21:52:17.227"} +{"title": "Twitter Bootstrap Dropdown with Tags Selector", "qid": "10001957", "answers": [{"date": "2012-04-03T22:10:40.890", "user": "Mike Robinson (43687)"}, {"date": "2012-04-03T22:44:30.157", "user": "dgilland (681166)"}], "tag": ["javascript", "jquery", "drop-down-menu", "twitter-bootstrap", "stoppropagation"], "user": "Caio Tarifa (977687)", "creationDate": "2012-04-03T21:52:18.303"} +{"title": "How do I create an automatic field in Mongoose?", "qid": "10001962", "answers": [{"date": "2012-04-05T15:07:31.300", "user": "Shamoon (239879)"}], "tag": ["node.js", "mongodb", "mongoose"], "user": "Shamoon (239879)", "creationDate": "2012-04-03T21:52:33.753"} +{"title": "Can Netty efficiently handle scores of outgoing connections as a client?", "qid": "10001974", "answers": [{"date": "2012-04-04T04:24:58.150", "user": "Matt Friedman (1155079)"}, {"date": "2012-04-04T06:10:17.927", "user": "Norman Maurer (1074097)"}, {"date": "2012-04-04T12:13:14.433", "user": "RenaudBlue (1307695)"}], "tag": ["client", "nio", "netty"], "user": "granroth (1311482)", "creationDate": "2012-04-03T21:53:42.843"} +{"title": "Google Maps API version 3 causing images to be blurry / fuzzy", "qid": "10001977", "answers": [{"date": "2012-04-03T23:03:18.383", "user": "Mano Marks (1073772)"}, {"date": "2012-05-25T01:02:34.513", "user": "TCB13 (560745)"}, {"date": "2012-10-08T01:59:42.797", "user": "Mike (1727551)"}], "tag": ["google-maps-api-3", "imagesource", "safari"], "user": "SparrwHawk (664806)", "creationDate": "2012-04-03T21:53:56.960"} +{"title": "php session variable not working in new subfolers", "qid": "10001980", "answers": [{"date": "2012-04-03T21:56:23.083", "user": "Norse (1093634)"}], "tag": ["php", "session-variables", "subfolder"], "user": "Aliweb (1243419)", "creationDate": "2012-04-03T21:54:08.697"} +{"title": "\"The language attribute on the script element is obsolete. You can safely omit it.\"?", "qid": "10001983", "answers": [{"date": "2012-04-03T21:56:27.047", "user": "Brandon (74022)"}], "tag": ["html", "w3c-validation", "script-element"], "user": "Henrik Petterson (1185126)", "creationDate": "2012-04-03T21:54:31.837"} +{"title": "is there an existing php cache library based on shm with management of key expiration?", "qid": "10001986", "answers": [{"date": "2012-04-03T22:58:44.177", "user": "mabe.berlin (1302881)"}], "tag": ["php", "memcached", "shared-memory"], "user": "Jerome WAGNER (292712)", "creationDate": "2012-04-03T21:54:41.850"} +{"title": "How to access to an element in a PHP multidimensional array with a string?", "qid": "10001988", "answers": [{"date": "2012-04-03T21:58:45.547", "user": "webbiedave (294972)"}, {"date": "2012-04-03T22:00:16.907", "user": "halfer (472495)"}, {"date": "2012-04-03T22:09:10.140", "user": "cha55son (595130)"}], "tag": ["php", "arrays", "multidimensional-array"], "user": "sanrodari (491957)", "creationDate": "2012-04-03T21:54:45.687"} +{"title": "libxml - Load xmlDoc from raw data", "qid": "10001990", "answers": [{"date": "2012-04-03T23:14:39.907", "user": "dbeer (845022)"}], "tag": ["c++", "c", "libxml2"], "user": "DubyaDubyaDubyaDot (1134276)", "creationDate": "2012-04-03T21:54:46.840"} +{"title": "xsl:when not working as expected", "qid": "10001998", "answers": [{"date": "2012-04-03T22:08:03.320", "user": "javram (1264609)"}, {"date": "2012-04-04T00:24:48.170", "user": "David Carlisle (1158383)"}], "tag": ["xml", "xslt"], "user": "Corwin01 (1243929)", "creationDate": "2012-04-03T21:55:23.957"} +{"title": "iOS w/ storyboards & ARC: Controller property not initialized", "qid": "10002002", "answers": [{"date": "2012-04-11T16:26:04.850", "user": "Alex Takashi Tanabe (1120233)"}], "tag": ["ios", "ios5", "properties", "storyboard", "automatic-ref-counting"], "user": "Alex Takashi Tanabe (1120233)", "creationDate": "2012-04-03T21:56:10.557"} +{"title": "Captcha IMG/Numbers Combination", "qid": "10002003", "answers": [{"date": "2012-04-03T22:06:39.300", "user": "Alexander (417685)"}], "tag": ["javascript", "javascript-events"], "user": "Dz.slick (979614)", "creationDate": "2012-04-03T21:56:12.943"} +{"title": "How to specify a particular JAXB implementation?", "qid": "10002006", "answers": [{"date": "2012-04-03T23:19:20.010", "user": "Blaise Doughan (383861)"}, {"date": "2013-07-22T08:21:09.973", "user": "Somu (389489)"}], "tag": ["java", "java-ee", "jboss", "jaxb", "implementation"], "user": "Eric B. (827480)", "creationDate": "2012-04-03T21:56:20.597"} +{"title": "How can I limit the number of records inserted on an INSERT INTO at one time", "qid": "10002016", "answers": [{"date": "2012-04-03T22:11:05.663", "user": "barsju (1278476)"}, {"date": "2015-07-13T22:23:08.353", "user": "tomb (3234526)"}], "tag": ["mysql", "mysql5"], "user": "Brad (194319)", "creationDate": "2012-04-03T21:57:00.437"} +{"title": "page array missing from signed_request", "qid": "10002018", "answers": [{"date": "2013-03-21T04:05:01.310", "user": "tauhu53 (2193585)"}], "tag": ["request", "facebook-php-sdk", "signed"], "user": "Brian Keith (1311427)", "creationDate": "2012-04-03T21:57:05.347"} +{"title": "split dataframe into multiple output files in r", "qid": "10002021", "answers": [{"date": "2012-04-03T22:11:04.740", "user": "Dason (1003565)"}], "tag": ["r", "split", "data.frame"], "user": "jon (927589)", "creationDate": "2012-04-03T21:57:32.903"} +{"title": "Removing Image From Parent View", "qid": "10002026", "answers": [{"date": "2012-04-03T22:12:42.747", "user": "Michael Frederick (903010)"}, {"date": "2012-04-03T22:12:43.527", "user": "danh (294949)"}], "tag": ["iphone", "objective-c", "uitableview", "uinavigationcontroller"], "user": "Josh Kahane (427292)", "creationDate": "2012-04-03T21:57:57.147"} +{"title": "How to check which repository a specific folder corresponds to", "qid": "10002030", "answers": [{"date": "2012-04-03T22:01:21.727", "user": "Kovensky (601730)"}, {"date": "2012-04-03T22:02:21.977", "user": "Stuart Golodetz (499449)"}], "tag": ["git"], "user": "zebra (1084573)", "creationDate": "2012-04-03T21:58:13.110"} +{"title": "Internet Explorer content link does not work (links with # character)", "qid": "10002035", "answers": [], "tag": ["internet-explorer", "hyperlink"], "user": "efe (682805)", "creationDate": "2012-04-03T21:58:45.687"} +{"title": "Comparing Integer values in Java, strange behavior", "qid": "10002037", "answers": [{"date": "2012-04-03T22:00:40.073", "user": "Jon Skeet (22656)"}, {"date": "2012-04-03T22:02:02.787", "user": "jkerrwilson (1311510)"}, {"date": "2012-04-03T22:02:09.367", "user": "DNA (699224)"}], "tag": ["java"], "user": "Jam (359862)", "creationDate": "2012-04-03T21:58:50.980"} +{"title": "Best practice to join nhibernate and ASP.NET membership/role/profile services", "qid": "1000204", "answers": [{"date": "2009-06-16T15:40:35.703", "user": "Michal (21672)"}, {"date": "2010-10-18T21:13:24.237", "user": "miguelv (29075)"}, {"date": "2010-11-25T13:23:39.530", "user": "VinnyG (245836)"}], "tag": ["asp.net", "nhibernate", "asp.net-membership", "persistence"], "user": "SztupY (120917)", "creationDate": "2009-06-16T08:34:29.183"} +{"title": "Need assistance matching an exact string in PHP array", "qid": "10002047", "answers": [{"date": "2012-04-03T22:01:41.393", "user": "webbiedave (294972)"}, {"date": "2012-04-03T22:02:08.803", "user": "mellamokb (116614)"}, {"date": "2012-04-03T22:04:58.740", "user": "Pete (428531)"}], "tag": ["php", "arrays", "preg-match", "strpos"], "user": "Donavon Yelton (845056)", "creationDate": "2012-04-03T21:59:39.153"} +{"title": "jQuery ajax success event Strangely not working on ajaxSetup", "qid": "10002048", "answers": [{"date": "2012-04-03T22:18:57.193", "user": "Dan A. (537166)"}], "tag": ["javascript", "jquery", "ajax"], "user": "mark (1311368)", "creationDate": "2012-04-03T21:59:42.783"} +{"title": "Jquery Country/State Json and more", "qid": "10002053", "answers": [{"date": "2012-04-03T22:04:10.377", "user": "xbonez (315828)"}], "tag": ["jquery"], "user": "James Wilson (1081926)", "creationDate": "2012-04-03T21:59:57.957"} +{"title": "Adding table from another database to ASP.NET Dynamic Data + Entity Framework", "qid": "10002057", "answers": [{"date": "2012-04-05T21:16:25.917", "user": "blue18hutthutt (1201268)"}], "tag": ["asp.net", "entity-framework", "dynamic-data", "asp.net-dynamic-data"], "user": "blue18hutthutt (1201268)", "creationDate": "2012-04-03T22:00:28.560"} +{"title": "Django: Duck typing-friendly way of accepting record or slug of record for input", "qid": "10002062", "answers": [{"date": "2012-04-03T22:07:07.813", "user": "cwallenpoole (57191)"}, {"date": "2012-04-03T23:05:20.840", "user": "John (310431)"}, {"date": "2012-04-04T01:45:48.813", "user": "fceruti (303792)"}], "tag": ["django", "duck-typing"], "user": "Jordan Reiter (255918)", "creationDate": "2012-04-03T22:00:35.413"} +{"title": "jquery - prevent this race condition", "qid": "10002063", "answers": [{"date": "2012-04-03T22:04:45.037", "user": "gdoron (601179)"}, {"date": "2012-04-03T22:25:11.780", "user": "Brett McCarty (201972)"}], "tag": ["jquery"], "user": "tempid (349308)", "creationDate": "2012-04-03T22:00:36.313"} +{"title": "Android Gallery always returns RESULT_CANCELED to onActivityResult", "qid": "10002065", "answers": [{"date": "2012-04-03T22:05:21.660", "user": "Martin Sykes (1125129)"}, {"date": "2012-04-19T08:35:19.663", "user": "Joey (1340107)"}], "tag": ["android", "image", "android-intent", "gallery"], "user": "Velo Steve (1183888)", "creationDate": "2012-04-03T22:00:38.920"} +{"title": "PHP Check Array with Post", "qid": "10002069", "answers": [{"date": "2012-04-03T22:03:50.977", "user": "pinouchon (311744)"}, {"date": "2012-04-03T22:04:15.327", "user": "Elen (470383)"}, {"date": "2012-04-03T22:05:50.453", "user": "Zanrok (900950)"}, {"date": "2012-04-03T22:05:56.447", "user": "Norse (1093634)"}, {"date": "2013-12-30T16:20:12.357", "user": "Jay Bhatt (2076598)"}], "tag": ["php", "arrays", "post"], "user": "Josh Luke Blease (1154618)", "creationDate": "2012-04-03T22:00:46.703"} +{"title": "print and count the number of permutation (without using stl next_permutation)", "qid": "10002073", "answers": [{"date": "2012-04-03T22:33:57.883", "user": "bitmask (430766)"}], "tag": ["c++", "algorithm", "stl"], "user": "zonked.zonda (1179293)", "creationDate": "2012-04-03T22:01:17.790"} +{"title": "Getting a field from an STL map iterator", "qid": "10002074", "answers": [{"date": "2012-04-03T22:08:57.180", "user": "Kerrek SB (596781)"}, {"date": "2012-04-03T22:09:31.247", "user": "Mark Ransom (5987)"}, {"date": "2012-04-03T22:10:46.707", "user": "supertopi (716752)"}, {"date": "2012-04-03T22:35:37.457", "user": "aroyer (964122)"}], "tag": ["c++", "map", "iterator", "std-pair"], "user": "Gustavo N (1284115)", "creationDate": "2012-04-03T22:01:18.717"} +{"title": "Definitive way to use \"this\" in JavaScript", "qid": "10002079", "answers": [{"date": "2012-04-03T22:08:29.173", "user": "Pete (428531)"}, {"date": "2012-04-03T22:12:35.023", "user": "Guffa (69083)"}, {"date": "2012-04-03T22:22:18.710", "user": "nnnnnn (615754)"}, {"date": "2012-04-03T23:56:03.493", "user": "jfriend00 (816620)"}], "tag": ["javascript", "javascript-objects"], "user": "Matthieu Napoli (245552)", "creationDate": "2012-04-03T22:01:45.777"} +{"title": "typecasting with virtual functions", "qid": "10002082", "answers": [{"date": "2012-04-03T22:11:32.700", "user": "Kerrek SB (596781)"}, {"date": "2012-04-03T22:13:55.867", "user": "David D (1284568)"}, {"date": "2012-04-03T22:37:03.867", "user": "Derek Park (872)"}], "tag": ["c++", "casting", "virtual"], "user": "user987280 (987280)", "creationDate": "2012-04-03T22:02:08.487"} +{"title": "MDX - Top X Sales People by Total Sales for Each Date", "qid": "10002086", "answers": [{"date": "2012-04-05T18:30:59.477", "user": "nklhead (1311175)"}], "tag": ["ssas", "mdx"], "user": "nklhead (1311175)", "creationDate": "2012-04-03T22:02:11.767"} +{"title": "shell array loop stops after 1", "qid": "10002087", "answers": [{"date": "2012-04-03T22:06:50.250", "user": "Andrew Clark (505154)"}, {"date": "2012-04-03T22:09:02.493", "user": "sirgeorge (1210291)"}], "tag": ["shell", "loops"], "user": "Dave Rau (483217)", "creationDate": "2012-04-03T22:02:16.927"} +{"title": "Repeat an action as long button is pressed", "qid": "10002089", "answers": [{"date": "2012-04-03T22:08:04.137", "user": "Tim Bender (122207)"}, {"date": "2012-04-03T22:15:16.940", "user": "HoratioCain (82895)"}, {"date": "2012-04-03T22:23:20.267", "user": "ulmangt (1212363)"}], "tag": ["java", "android", "button", "textview", "repeat"], "user": "Miljenko Simovic (1011730)", "creationDate": "2012-04-03T22:02:33.423"} +{"title": "What are some real-world examples of abstract new/virtual/override/abstract keywords?", "qid": "1000209", "answers": [{"date": "2009-06-16T08:43:33.520", "user": "Marc Gravell (23354)"}, {"date": "2009-06-16T08:45:18.540", "user": "jerryjvl (111781)"}, {"date": "2009-06-16T08:52:46.590", "user": "ChrisBD (102238)"}], "tag": ["c#", "abstract-class"], "user": "Edward Tanguay (4639)", "creationDate": "2009-06-16T08:35:26.373"} +{"title": "HTML5 canvas slide show issue", "qid": "10002095", "answers": [{"date": "2012-04-03T22:31:51.007", "user": "Saturnix (1307020)"}, {"date": "2012-04-04T16:24:34.460", "user": "Prostang (1282107)"}], "tag": ["javascript", "html5", "canvas", "slideshow"], "user": "Prostang (1282107)", "creationDate": "2012-04-03T22:02:54.527"} +{"title": "Changing Android SDK version causes crashes", "qid": "10002097", "answers": [{"date": "2012-04-03T23:07:22.840", "user": "Alex Lockwood (844882)"}], "tag": ["android", "string", "sockets", "networking", "sdk"], "user": "davemeyer (1311479)", "creationDate": "2012-04-03T22:03:02.183"} +{"title": "Using the Metro-Style GridView without Grouping", "qid": "10002100", "answers": [{"date": "2012-05-07T22:37:42.743", "user": "Michael (800129)"}], "tag": ["c#", "xaml", "windows-runtime"], "user": "Shawn Wildermuth (40125)", "creationDate": "2012-04-03T22:03:30.043"} +{"title": "Does glUniformMatrix4fv instantly copy data pointed to by the passed in pointer?", "qid": "10002103", "answers": [{"date": "2012-04-03T22:15:50.187", "user": "M\u0101rti\u0146\u0161 Mo\u017eeiko (675078)"}], "tag": ["opengl", "opengl-es"], "user": "Xavier (256062)", "creationDate": "2012-04-03T22:03:53.670"} +{"title": "Script stack space exhausted firefox", "qid": "1000211", "answers": [{"date": "2009-06-16T08:38:44.853", "user": "Marc Gravell (23354)"}, {"date": "2009-06-16T08:39:05.960", "user": "Alsciende (119195)"}, {"date": "2010-02-16T10:06:51.207", "user": "Chris Hagan (218630)"}, {"date": "2011-06-15T16:18:13.210", "user": "donquixote (246724)"}], "tag": ["javascript", "jquery", "xml", "mozilla"], "user": "Andromeda (120330)", "creationDate": "2009-06-16T08:35:55.217"} +{"title": "What is the Windows registered class of a Java window?", "qid": "10002117", "answers": [{"date": "2012-04-03T23:19:09.477", "user": "tenorsax (1048330)"}], "tag": ["java", "c++", "windows"], "user": "DankMemes (1021196)", "creationDate": "2012-04-03T22:05:27.587"} +{"title": "Best approach to create an image morphing app?", "qid": "10002118", "answers": [{"date": "2012-04-04T14:54:12.303", "user": "dvhamme (1303106)"}], "tag": ["ios", "image-processing"], "user": "Pankaj Kainthla (401198)", "creationDate": "2012-04-03T22:05:28.190"} +{"title": "ability to capture on what user was doing on the web page", "qid": "10002119", "answers": [{"date": "2012-04-03T23:51:19.720", "user": "Dave Anderson (371)"}], "tag": ["asp.net", "user-input", "user-experience"], "user": "dotnet-practitioner (71422)", "creationDate": "2012-04-03T22:05:41.220"} +{"title": "How do I find the error code in iOS when I use AVFoundation class", "qid": "10002124", "answers": [{"date": "2013-07-15T10:52:05.810", "user": "Flax (271745)"}, {"date": "2014-03-26T00:05:49.173", "user": "jhk (960112)"}], "tag": ["avfoundation"], "user": "Howy (1172561)", "creationDate": "2012-04-03T22:06:07.583"} +{"title": "Clean up a remote machine's temporary directory: How do I identify files that are in use? (Powershell)", "qid": "10002132", "answers": [{"date": "2012-04-03T22:26:18.303", "user": "Keith Hill (153982)"}], "tag": ["powershell"], "user": "Precipitous (77784)", "creationDate": "2012-04-03T22:06:58.133"} +{"title": "Detecting when a method is chained", "qid": "10002133", "answers": [{"date": "2012-04-03T22:17:20.747", "user": "cHao (319403)"}, {"date": "2012-04-03T22:27:21.677", "user": "Jwosty (1231925)"}, {"date": "2012-04-03T22:45:46.177", "user": "mu is too short (479863)"}, {"date": "2012-04-04T02:39:32.180", "user": "Abe Voelker (215168)"}], "tag": ["ruby"], "user": "Jason Waldrip (834102)", "creationDate": "2012-04-03T22:07:00.870"} +{"title": "Possible to have a UINavigationController for a UITableView that doesn't fill the entire super UIView", "qid": "10002138", "answers": [{"date": "2012-04-03T22:13:46.537", "user": "jmstone (1148055)"}, {"date": "2012-04-03T22:15:25.443", "user": "benzado (10947)"}], "tag": ["ios", "xcode", "uinavigationcontroller", "storyboard"], "user": "1202 Program Alarm (840992)", "creationDate": "2012-04-03T22:07:09.857"} +{"title": "Use \"error_messages\" in Rails 3.2? (raises \"undefined method\" error)", "qid": "10002140", "answers": [{"date": "2012-04-04T00:40:19.647", "user": "Prashanth (711347)"}], "tag": ["ruby-on-rails", "ruby", "ruby-on-rails-3", "ruby-on-rails-3.2"], "user": "strife25 (89342)", "creationDate": "2012-04-03T22:07:19.607"} +{"title": "WIX Patch Update XML Configuration File", "qid": "10002146", "answers": [{"date": "2012-04-06T02:27:27.690", "user": "BryanJ (1202501)"}], "tag": ["installer", "wix"], "user": "aherrick (20446)", "creationDate": "2012-04-03T22:07:53.250"} +{"title": "How to access the parent of a parent of a partial view's viewmodel?", "qid": "10002150", "answers": [{"date": "2012-04-04T22:41:28.597", "user": "Travis J (1026459)"}], "tag": ["ajax", "asp.net-mvc-3", "partial-views"], "user": "Travis J (1026459)", "creationDate": "2012-04-03T22:08:05.743"} +{"title": "Need help implementing Command Handlers/Bus using Unity DI", "qid": "10002154", "answers": [{"date": "2012-04-04T06:13:17.573", "user": "Sebastian Weber (750065)"}], "tag": ["dependency-injection", "unity-container", "structuremap", "cqrs"], "user": "mikelus (769405)", "creationDate": "2012-04-03T22:08:47.100"} +{"title": "C++ MFC - Sharing data between MFC DLL and WTL exe?", "qid": "10002157", "answers": [{"date": "2012-04-04T15:23:54.207", "user": "Roel (11449)"}], "tag": ["c++", "mfc", "wtl"], "user": "user1040229 (1040229)", "creationDate": "2012-04-03T22:09:06.580"} +{"title": "Centering a position: fixed div When Viewport Reaches a Designated Width", "qid": "10002158", "answers": [{"date": "2012-04-03T22:14:35.100", "user": "Matthew Darnell (1265216)"}, {"date": "2012-04-03T22:27:01.237", "user": "pinouchon (311744)"}], "tag": ["html", "css", "center", "css-position"], "user": "lemonmade (1311490)", "creationDate": "2012-04-03T22:09:08.363"} +{"title": "JQuery UI Slider - 'value' not setting starting position of handle", "qid": "10002160", "answers": [{"date": "2012-04-03T22:18:02.977", "user": "Rorchackh (495416)"}, {"date": "2012-04-03T22:18:48.250", "user": "cha55son (595130)"}, {"date": "2012-04-03T22:37:18.163", "user": "neo108 (990596)"}], "tag": ["jquery-ui", "jquery-ui-slider"], "user": "twardnw (1311514)", "creationDate": "2012-04-03T22:09:16.507"} +{"title": "php Escape all characters before comparing", "qid": "10002161", "answers": [{"date": "2012-04-03T22:14:05.863", "user": "Pete (428531)"}], "tag": ["php", "tags", "escaping"], "user": "Milos (267435)", "creationDate": "2012-04-03T22:09:17.493"} +{"title": "Antlr greedy-option", "qid": "10002164", "answers": [{"date": "2012-04-04T06:57:50.923", "user": "Bart Kiers (50476)"}], "tag": ["antlr", "antlr3"], "user": "user1286372 (1286372)", "creationDate": "2012-04-03T22:09:29.893"} +{"title": "Array input/output problems?", "qid": "10002166", "answers": [{"date": "2012-04-03T22:12:11.043", "user": "Stuart Golodetz (499449)"}, {"date": "2012-04-03T22:15:53.417", "user": "Jacob Abrahams (1286029)"}, {"date": "2012-04-03T22:27:59.863", "user": "Jared Burrows (950427)"}], "tag": ["c++", "arrays"], "user": "user1311517 (1311517)", "creationDate": "2012-04-03T22:09:32.280"} +{"title": "Proper submission of forms with autogenerated controls", "qid": "1000217", "answers": [{"date": "2009-06-16T10:09:28.853", "user": "eu-ge-ne (80601)"}], "tag": ["asp.net-mvc", "unit-testing", "checkbox", "viewmodel"], "user": "Andriy Tkach (79511)", "creationDate": "2009-06-16T08:38:02.330"} +{"title": "What python's Pandas data struts used for?", "qid": "10002181", "answers": [{"date": "2012-04-04T22:24:11.493", "user": "Wes McKinney (776560)"}], "tag": ["python", "pandas"], "user": "Merlin (428862)", "creationDate": "2012-04-03T22:10:49.247"} +{"title": "Trying to draw the edges of a rectangular cube in WPF but not successful", "qid": "10002182", "answers": [{"date": "2014-07-12T22:39:04.197", "user": "SlimsGhost (3394022)"}, {"date": "2015-05-02T14:24:25.440", "user": "user3914587 (3914587)"}], "tag": ["c#", "wpf", "3d", "line", "edge"], "user": "mj1261829 (1261829)", "creationDate": "2012-04-03T22:10:59.857"} +{"title": "Calculating plots Y axis label values", "qid": "10002188", "answers": [{"date": "2012-04-03T22:18:47.160", "user": "Ethan Brown (1198509)"}], "tag": ["javascript", "plot", "label", "axis-labels"], "user": "Bart (1225985)", "creationDate": "2012-04-03T22:11:22.247"} +{"title": "How to clear an inputstream in java", "qid": "10002189", "answers": [{"date": "2012-04-03T22:21:22.240", "user": "Slanec (1273080)"}, {"date": "2013-03-19T04:12:53.843", "user": "Parthasarathy B (1889016)"}], "tag": ["java"], "user": "ysdelahoz (1311504)", "creationDate": "2012-04-03T22:11:23.837"} +{"title": "Java Heap Space (CMS with huge files)", "qid": "1000219", "answers": [{"date": "2009-06-16T08:46:18.037", "user": "akarnokd (61158)"}, {"date": "2009-06-16T08:53:27.803", "user": "Michael Borgwardt (16883)"}, {"date": "2009-06-16T09:09:29.020", "user": "kgiannakakis (24054)"}, {"date": "2009-06-16T09:14:29.400", "user": "cafebabe (123584)"}, {"date": "2009-06-16T09:23:18.073", "user": "Stu Thompson (2961)"}, {"date": "2009-06-16T09:31:06.137", "user": "dfa (89266)"}, {"date": "2009-06-16T09:37:53.363", "user": "alamar (36498)"}, {"date": "2009-06-16T10:02:39.630", "user": "mfx (8015)"}, {"date": "2009-06-16T11:13:52.060", "user": "Rastislav Komara (22068)"}], "tag": ["java", "memory", "tomcat"], "user": "Andras", "creationDate": "2009-06-16T08:38:35.260"} +{"title": "Is it possible to keep social share counts when changing permalink structure?", "qid": "10002191", "answers": [{"date": "2012-04-03T22:26:57.587", "user": "Aurimas (604655)"}, {"date": "2012-07-31T13:08:16.363", "user": "Lutfi Torla (1565808)"}, {"date": "2014-04-14T14:19:15.817", "user": "Sabir Abdul (2661811)"}, {"date": "2015-01-16T07:40:40.983", "user": "Kay (4460689)"}], "tag": ["facebook", "wordpress", "twitter", "social", "permalinks"], "user": "Bart Hook (1116722)", "creationDate": "2012-04-03T22:11:41.107"} +{"title": "div#name vs #name", "qid": "10002192", "answers": [{"date": "2012-04-03T22:15:42.883", "user": "paislee (835805)"}, {"date": "2012-04-03T22:15:46.237", "user": "NickC (143295)"}, {"date": "2012-04-03T22:16:04.377", "user": "animuson (246246)"}, {"date": "2012-04-03T22:18:33.227", "user": "Eliran Malka (547020)"}, {"date": "2012-04-03T22:19:35.310", "user": "ScottS (369707)"}, {"date": "2012-04-03T22:30:43.097", "user": "Chris Cannon (1071203)"}, {"date": "2012-04-03T22:31:11.440", "user": "gilly3 (361684)"}, {"date": "2013-08-25T15:30:23.540", "user": "Jenei Tam\u00e1s (2715711)"}], "tag": ["css", "naming-conventions"], "user": "Sean Dunwoody (1125402)", "creationDate": "2012-04-03T22:11:46.630"} +{"title": "Changing the text in a GKTurnBasedMatch's 'your turn' and 'game over' notifications?", "qid": "10002193", "answers": [{"date": "2012-04-04T15:53:14.343", "user": "jonsibley (670400)"}], "tag": ["ios", "notifications", "game-center", "gamekit", "multiplayer"], "user": "Nortiest (1305658)", "creationDate": "2012-04-03T22:11:47.550"} +{"title": "Dynamic Facebook Open Graph Meta tags - How add prefix to tag?", "qid": "10002194", "answers": [{"date": "2012-05-24T06:57:23.157", "user": "Chad Richardson (1135535)"}], "tag": ["asp.net", "facebook"], "user": "Chad Richardson (1135535)", "creationDate": "2012-04-03T22:11:53.807"} +{"title": "terminating process requires WQL \"SELECT *...\"?", "qid": "10002207", "answers": [{"date": "2012-04-03T23:04:52.323", "user": "RRUZ (91299)"}], "tag": ["c#", ".net", "wmi", "wql"], "user": "mdelvecchio (1284093)", "creationDate": "2012-04-03T22:13:04.710"} +{"title": "Generating a unique data store key from a federated identity", "qid": "10002209", "answers": [{"date": "2012-04-05T06:13:19.663", "user": "Nick Johnson (12030)"}], "tag": ["python", "google-app-engine", "authentication"], "user": "Shawn Church (1270006)", "creationDate": "2012-04-03T22:13:40.327"} +{"title": "Localization for new Files in older Project breaks App", "qid": "10002210", "answers": [{"date": "2012-04-03T23:01:31.193", "user": "He Shiming (108574)"}, {"date": "2012-04-04T08:06:06.183", "user": "uruk (1107529)"}], "tag": ["ios", "localization", "xcode4.2"], "user": "uruk (1107529)", "creationDate": "2012-04-03T22:13:42.993"} +{"title": "tinymce not working on firefox", "qid": "10002219", "answers": [{"date": "2012-04-03T22:15:49.577", "user": "PeeHaa (508666)"}, {"date": "2014-03-19T05:34:45.080", "user": "user3196949"}], "tag": ["tinymce"], "user": "rstewart (1174496)", "creationDate": "2012-04-03T22:14:06.740"} +{"title": "Which data binding option for large static list of objects?", "qid": "10002222", "answers": [{"date": "2012-04-04T02:31:55.913", "user": "Frisbee (607314)"}], "tag": ["c#", "wpf", "data-binding"], "user": "Kyle (1311462)", "creationDate": "2012-04-03T22:14:29.143"} +{"title": "return an obj of checkbox values", "qid": "10002223", "answers": [{"date": "2012-04-03T22:24:50.143", "user": "Tuan (360053)"}, {"date": "2012-04-03T22:25:57.773", "user": "nnnnnn (615754)"}, {"date": "2012-04-03T22:27:51.593", "user": "zetlen (922470)"}, {"date": "2012-04-03T22:28:33.393", "user": "Adam Merrifield (543693)"}], "tag": ["javascript", "jquery", "forms"], "user": "qwertymk (465546)", "creationDate": "2012-04-03T22:14:32.620"} +{"title": "Reason for a mysterious padding breaking my design?", "qid": "10002225", "answers": [{"date": "2012-04-03T22:19:51.350", "user": "Gaby aka G. Petrioli (128165)"}, {"date": "2012-04-03T22:26:50.860", "user": "Aerik (262298)"}], "tag": ["javascript", "twitter", "padding", "alignment"], "user": "Henrik Petterson (1185126)", "creationDate": "2012-04-03T22:14:53.090"} +{"title": "nginx magic sub domains - help for yoda needed", "qid": "10002226", "answers": [{"date": "2012-04-06T22:03:24.870", "user": "jmervine (832409)"}], "tag": ["ruby", "nginx"], "user": "user1212889 (1212889)", "creationDate": "2012-04-03T22:15:03.770"} +{"title": "Linkify Regex Function PHP Daring Fireball Method", "qid": "10002227", "answers": [{"date": "2012-04-03T22:18:33.083", "user": "d_inevitable (1238764)"}, {"date": "2014-09-08T02:30:02.183", "user": "Kyle C. (1591819)"}], "tag": ["php", "regex", "linkify"], "user": "Jeff (1257682)", "creationDate": "2012-04-03T22:15:04.883"} +{"title": "org.hibernate.ObjectNotFoundException: No row with the given identifier exists: Single table query", "qid": "10002228", "answers": [{"date": "2012-04-04T02:05:13.447", "user": "Elliott (250030)"}], "tag": ["java", "sql-server", "hibernate"], "user": "Elliott (250030)", "creationDate": "2012-04-03T22:15:07.567"} +{"title": "unsure how to remove objet from stage & it's arrays after collision detected", "qid": "10002229", "answers": [{"date": "2012-04-03T22:31:34.327", "user": "Pixel Elephant (1240320)"}], "tag": ["actionscript-3"], "user": "Paine (1311506)", "creationDate": "2012-04-03T22:15:12.310"} +{"title": "How do I handle Ctrl+C in a Delphi console application?", "qid": "1000223", "answers": [{"date": "2009-06-16T09:13:48.217", "user": "Nick Dandoulakis (108130)"}, {"date": "2012-04-18T08:36:14.477", "user": "STB Land (281600)"}], "tag": ["delphi", "console"], "user": "mjn (80901)", "creationDate": "2009-06-16T08:39:46.943"} +{"title": "Why aren't all my index values being displayed in this indexed table View?", "qid": "10002232", "answers": [{"date": "2012-04-04T18:21:14.793", "user": "user1238198 (1238198)"}], "tag": ["xcode4.2"], "user": "user1238198 (1238198)", "creationDate": "2012-04-03T22:15:21.227"} +{"title": "Jar File For All Java Versions?", "qid": "10002237", "answers": [{"date": "2012-04-03T22:20:06.710", "user": "JDD (717679)"}, {"date": "2012-04-03T22:30:54.930", "user": "Jack Edmonds (61663)"}], "tag": ["java", "jar"], "user": "Trey (1248873)", "creationDate": "2012-04-03T22:15:49.790"} +{"title": "Difference between git checkout --track origin/branch and git checkout -b branch origin/branch", "qid": "10002239", "answers": [{"date": "2012-04-03T22:39:05.570", "user": "VonC (6309)"}, {"date": "2014-03-26T16:51:43.317", "user": "Pat (116891)"}, {"date": "2015-04-21T22:23:12.673", "user": "Robert Siemer (825924)"}], "tag": ["git", "branch", "checkout", "git-branch"], "user": "yorch (443600)", "creationDate": "2012-04-03T22:15:53.300"} +{"title": "Parsing something similar to C++", "qid": "10002245", "answers": [{"date": "2012-04-03T22:50:24.150", "user": "SigTerm (271376)"}, {"date": "2012-04-03T22:50:49.780", "user": "Chris Dodd (16406)"}], "tag": ["c++", "parsing"], "user": "2NinerRomeo (747544)", "creationDate": "2012-04-03T22:16:19.947"} +{"title": "Latest Rally release - portfolio attributes not able to be queried", "qid": "10002246", "answers": [{"date": "2012-04-04T00:18:58.413", "user": "Charles Ferentchak (922367)"}], "tag": ["sdk", "rally"], "user": "Dax (1167685)", "creationDate": "2012-04-03T22:16:20.340"} +{"title": "Codeigniter overwriting default validation messages", "qid": "10002248", "answers": [{"date": "2012-04-04T08:36:29.000", "user": "zaherg (1013493)"}], "tag": ["validation", "codeigniter"], "user": "Rob (1200670)", "creationDate": "2012-04-03T22:17:02.433"} +{"title": "RowAdapter deletes random rows that are added dynamically to ListView?", "qid": "10002252", "answers": [{"date": "2012-04-03T23:56:35.647", "user": "dmon (642161)"}, {"date": "2012-04-04T06:51:51.713", "user": "Mayank (1043683)"}], "tag": ["android", "listview", "android-linearlayout", "android-adapter"], "user": "A D (694253)", "creationDate": "2012-04-03T22:17:24.540"} +{"title": "Cocoa (OS X) small font - kerning looks awful", "qid": "10002254", "answers": [{"date": "2012-04-20T16:34:20.193", "user": "MacAndor (1160592)"}, {"date": "2012-04-27T12:03:37.703", "user": "Chip Russell (1001340)"}], "tag": ["osx", "cocoa", "text", "fonts", "kerning"], "user": "Wouldchux (1166220)", "creationDate": "2012-04-03T22:17:42.897"} +{"title": "LoadingElementDuration doesn't fully animate", "qid": "10002255", "answers": [{"date": "2012-04-09T22:07:06.087", "user": "Travis J (1026459)"}], "tag": ["ajax", "asp.net-mvc-3", "razor"], "user": "Travis J (1026459)", "creationDate": "2012-04-03T22:17:53.947"} +{"title": "jQuery using 'this' in an if statement", "qid": "10002256", "answers": [{"date": "2012-04-03T22:20:18.290", "user": "Selvakumar Arumugam (297641)"}, {"date": "2012-04-03T22:21:11.380", "user": "Dustin Laine (107862)"}, {"date": "2015-10-09T00:02:51.997", "user": "user3716779 (3716779)"}], "tag": ["jquery", "if-statement", "this"], "user": "scferg5 (984008)", "creationDate": "2012-04-03T22:17:56.393"} +{"title": "Volatile variable in class: \"expected unqualified-id before 'volatile'\"?", "qid": "10002259", "answers": [{"date": "2012-04-04T12:53:39.430", "user": "jakebird451 (1279231)"}], "tag": ["c++", "class", "syntax", "arduino", "volatile"], "user": "jakebird451 (1279231)", "creationDate": "2012-04-03T22:18:12.090"} +{"title": "Kullback-Leibler divergence as histogram distance function", "qid": "10002261", "answers": [{"date": "2012-04-03T23:44:57.163", "user": "Whatang (370593)"}], "tag": ["algorithm", "image-processing", "f#", "statistics", "histogram"], "user": "Francesco De Vittori (209538)", "creationDate": "2012-04-03T22:18:31.370"} +{"title": "C++ makefile multiple headers one cpp", "qid": "10002268", "answers": [{"date": "2012-04-03T22:23:18.077", "user": "littleadv (618400)"}, {"date": "2012-04-03T22:27:20.820", "user": "Kerrek SB (596781)"}], "tag": ["c++"], "user": "ashsha91 (1232133)", "creationDate": "2012-04-03T22:18:55.607"} +{"title": "Convert a file full of \"INSERT INTO xxx VALUES\" in to something Bulk Insert can parse", "qid": "10002277", "answers": [{"date": "2012-04-03T22:43:50.103", "user": "Tim Schmelter (284240)"}, {"date": "2012-04-03T23:19:13.590", "user": "user166390"}], "tag": ["c#", "sql", "sql-server-2008", "bulkinsert", "insert-into"], "user": "Scott Chamberlain (80274)", "creationDate": "2012-04-03T22:20:17.533"} +{"title": "Get automatic date in iOS", "qid": "10002282", "answers": [{"date": "2012-04-03T22:25:27.183", "user": "Panagiotis (670078)"}, {"date": "2012-04-04T06:37:36.080", "user": "Louis (892168)"}], "tag": ["objective-c", "ios"], "user": "LuckyStarr (452584)", "creationDate": "2012-04-03T22:20:54.143"} +{"title": "boost::signals2 slot as a non-static function member?", "qid": "10002283", "answers": [{"date": "2012-04-03T23:14:48.253", "user": "Guy Sirton (441099)"}], "tag": ["c++", "boost", "non-static", "boost-signals2"], "user": "nijansen (1056003)", "creationDate": "2012-04-03T22:20:59.357"} +{"title": "Could not load file or assembly 'EntityFramework' error", "qid": "10002286", "answers": [{"date": "2012-04-03T22:32:37.550", "user": "surfen (724944)"}], "tag": ["asp.net-mvc-3", "entity-framework"], "user": "Johannes (573634)", "creationDate": "2012-04-03T22:21:20.130"} +{"title": "Error in Android Manifest (sdk version)", "qid": "10002287", "answers": [{"date": "2013-11-12T10:07:48.623", "user": "Chathura Wijesinghe (2380114)"}], "tag": ["android", "manifest", "uses"], "user": "simply_immense (1149717)", "creationDate": "2012-04-03T22:21:22.163"} +{"title": "Prevent (stop) Apache from logging specific AJAX / XmlHttpRequests?", "qid": "10002289", "answers": [{"date": "2012-04-03T22:31:29.413", "user": "Carsten (1071311)"}], "tag": ["apache", ".htaccess", "xmlhttprequest", "logging"], "user": "Martin \u0160ajna (1285885)", "creationDate": "2012-04-03T22:21:33.470"} +{"title": "Split sentence in words with most weight", "qid": "10002290", "answers": [{"date": "2012-04-04T03:17:38.723", "user": "Kenston Choi (241379)"}, {"date": "2012-04-04T17:43:37.070", "user": "adi92 (25990)"}], "tag": ["nlp", "combinatorics"], "user": "Dan (309926)", "creationDate": "2012-04-03T22:21:47.537"} +{"title": "How to run a Python script portably without specifying its full path", "qid": "10002291", "answers": [{"date": "2012-04-03T22:25:58.660", "user": "alberge (145905)"}, {"date": "2012-04-03T22:28:56.950", "user": "Andrew Clark (505154)"}, {"date": "2012-04-03T22:34:47.120", "user": "Petr \u00dajezdsk\u00fd (1310733)"}, {"date": "2013-07-06T08:32:53.270", "user": "Ciro Santilli \u516d\u56db\u4e8b\u4ef6 \u6cd5\u8f6e\u529f \u5305\u5353\u8f69 (895245)"}], "tag": ["python", "windows", "shell", "posix"], "user": "Ciro Santilli \u516d\u56db\u4e8b\u4ef6 \u6cd5\u8f6e\u529f \u5305\u5353\u8f69 (895245)", "creationDate": "2012-04-03T22:21:49.257"} +{"title": "manipulating webpages using javascript", "qid": "10002295", "answers": [{"date": "2012-04-03T22:25:25.580", "user": "Travis J (1026459)"}, {"date": "2012-04-03T22:28:25.527", "user": "Sam Pellino (1179310)"}, {"date": "2012-04-03T22:46:39.010", "user": "Petr \u00dajezdsk\u00fd (1310733)"}], "tag": ["javascript", "html", "forms", "webpage"], "user": "user1222009 (1222009)", "creationDate": "2012-04-03T22:22:28.840"} +{"title": "Macroized Parameters", "qid": "10002296", "answers": [{"date": "2012-04-03T22:33:25.547", "user": "James McNellis (151292)"}], "tag": ["c", "visual-c++", "macros", "preprocessor", "variadic-macro"], "user": "tletnes (141642)", "creationDate": "2012-04-03T22:22:34.003"} +{"title": "Cordova (1.5) to PhoneGap (1.4.1) downgrade", "qid": "10002298", "answers": [{"date": "2012-04-04T05:03:55.693", "user": "ghostCoder (592099)"}, {"date": "2012-04-04T06:14:12.683", "user": "axxxman (869534)"}, {"date": "2012-04-04T06:18:49.787", "user": "Coder_sLaY (609387)"}], "tag": ["ios", "cordova"], "user": "0plus1 (82098)", "creationDate": "2012-04-03T22:22:46.437"} +{"title": "How to upload a file to ASP.NET MVC from a console application", "qid": "10002299", "answers": [{"date": "2012-04-03T22:27:45.370", "user": "Chris (34942)"}, {"date": "2012-04-03T22:31:14.903", "user": "Artem (1202952)"}, {"date": "2012-04-05T19:16:07.987", "user": "Lucas Reis (1180359)"}], "tag": ["c#", "asp.net-mvc-3", "file-upload", "console-application", "webclient"], "user": "Lucas Reis (1180359)", "creationDate": "2012-04-03T22:22:54.447"} +{"title": "\"uninitialized constant Users (NameError)\" w/ Heroku deploy", "qid": "10002302", "answers": [{"date": "2012-09-25T19:37:53.090", "user": "James (801858)"}, {"date": "2015-02-27T10:37:09.743", "user": "AlphaBob (4614172)"}], "tag": ["ruby-on-rails-3", "heroku", "devise", "omniauth"], "user": "Julian (801538)", "creationDate": "2012-04-03T22:23:06.873"} +{"title": "Outputting image using php GD library via function call", "qid": "1000231", "answers": [{"date": "2009-06-16T09:02:31.047", "user": "stefs (88070)"}, {"date": "2009-06-16T09:25:49.703", "user": "David Caunt (80425)"}, {"date": "2009-06-17T16:55:32.403", "user": "Tom\u00e1\u0161 Fejfar (112000)"}], "tag": ["php", "zend-framework", "gd"], "user": "William (120820)", "creationDate": "2009-06-16T08:42:38.123"} +{"title": "Getting 2 SQLite records for every email received", "qid": "10002310", "answers": [{"date": "2012-04-26T15:55:03.053", "user": "androidnoob (1281107)"}], "tag": ["android", "sqlite", "email"], "user": "androidnoob (1281107)", "creationDate": "2012-04-03T22:23:40.307"} +{"title": "Not inserting new records", "qid": "10002313", "answers": [{"date": "2012-04-03T22:27:59.400", "user": "Justin Cave (10397)"}], "tag": ["sql", "oracle", "plsql"], "user": "cloudcalculus (890189)", "creationDate": "2012-04-03T22:23:49.850"} +{"title": "Computing min and max values of a matrix", "qid": "10002319", "answers": [{"date": "2012-04-03T22:30:12.283", "user": "bitmask (430766)"}], "tag": ["math", "matrix"], "user": "Ali (1019342)", "creationDate": "2012-04-03T22:24:52.690"} +{"title": "what is better redirecting user from restricted area and not informing him what happend or telling him that its restricted?", "qid": "1000232", "answers": [{"date": "2009-06-16T08:44:40.460", "user": "Sergio (32037)"}, {"date": "2009-06-16T08:44:57.417", "user": "Program.X (76037)"}, {"date": "2009-06-16T08:45:50.720", "user": "Gerrie Schenck (57036)"}, {"date": "2009-06-16T08:45:59.130", "user": "Greg Hewgill (893)"}, {"date": "2009-06-16T08:47:21.950", "user": "Sev (83819)"}, {"date": "2009-06-16T08:50:36.423", "user": "PaulJWilliams (71399)"}, {"date": "2009-06-16T09:00:06.857", "user": "Jonathan Maddison (95481)"}], "tag": ["security", "http", "browser"], "user": "red777 (123567)", "creationDate": "2009-06-16T08:42:57.903"} +{"title": "Min-height hack with floats", "qid": "10002326", "answers": [{"date": "2012-04-03T22:29:56.850", "user": "Gaby aka G. Petrioli (128165)"}, {"date": "2012-04-03T22:36:01.083", "user": "JohnWolf (1296090)"}], "tag": ["css"], "user": "redconservatory (147915)", "creationDate": "2012-04-03T22:25:37.997"} +{"title": "MobiLink synchronization scripts generation", "qid": "10002327", "answers": [{"date": "2012-04-05T16:32:53.810", "user": "Graham Hurst (214013)"}], "tag": ["mysql", "sqlanywhere", "mobilink"], "user": "zbyszek26104 (1296810)", "creationDate": "2012-04-03T22:25:39.947"} +{"title": "jQuery Uniform Radios/Checkboxes beneath in IE", "qid": "10002328", "answers": [{"date": "2012-04-03T22:59:47.140", "user": "Marco Johannesen (921110)"}, {"date": "2014-05-12T11:42:24.647", "user": "Developer (442627)"}], "tag": ["jquery", "internet-explorer", "uniform"], "user": "Vince Kronlein (1136979)", "creationDate": "2012-04-03T22:25:46.887"} +{"title": "adding elements in an array day-wise from mysql database", "qid": "10002332", "answers": [{"date": "2012-04-03T22:29:51.050", "user": "Spencer Avinger (517676)"}, {"date": "2012-04-04T01:08:35.387", "user": "hohner (427992)"}], "tag": ["php", "mysql", "arrays", "date"], "user": "SupaOden (1069457)", "creationDate": "2012-04-03T22:26:03.067"} +{"title": "How to create a root node in a linked list?", "qid": "10002333", "answers": [{"date": "2012-04-03T22:29:13.797", "user": "paislee (835805)"}, {"date": "2012-04-03T22:29:40.633", "user": "trutheality (771837)"}, {"date": "2012-04-03T22:47:23.510", "user": "Rushil (969784)"}], "tag": ["java", "memory", "linked-list"], "user": "Sam (380414)", "creationDate": "2012-04-03T22:26:09.510"} +{"title": "How to run a task in Python after 60 second but only one time", "qid": "10002334", "answers": [{"date": "2012-04-03T22:34:33.467", "user": "Latty (722121)"}, {"date": "2012-04-08T15:12:05.467", "user": "Frank Niessink (100738)"}], "tag": ["python", "wxpython", "python-2.7"], "user": "TLSK (1068061)", "creationDate": "2012-04-03T22:26:13.907"} +{"title": "how to design threading for many short tasks", "qid": "10002336", "answers": [{"date": "2012-04-03T22:38:53.013", "user": "Parakram Majumdar (1119105)"}, {"date": "2012-04-03T22:49:25.337", "user": "Martin James (758133)"}, {"date": "2012-04-04T05:28:38.303", "user": "Jirka Hanika (1235565)"}, {"date": "2012-04-04T11:41:41.083", "user": "Dialecticus (395718)"}, {"date": "2012-04-04T16:01:46.767", "user": "ex0du5 (800081)"}], "tag": ["c++", "multithreading", "algorithm", "design"], "user": "mr.pppoe (707336)", "creationDate": "2012-04-03T22:26:26.170"} +{"title": "My SQL. Finding multiples in a single column", "qid": "10002339", "answers": [{"date": "2012-04-03T22:28:56.477", "user": "Michael Fredrickson (643591)"}], "tag": ["mysql"], "user": "user1311286", "creationDate": "2012-04-03T22:26:39.520"} +{"title": "Websocket> Handshake is ok, but sending is not ok", "qid": "10002344", "answers": [], "tag": ["mfc", "websocket", "handshake"], "user": "Monodigm (1311523)", "creationDate": "2012-04-03T22:26:57.603"} +{"title": "Print File With .Net", "qid": "10002346", "answers": [{"date": "2012-04-03T22:30:15.810", "user": "Chuck Savage (353147)"}], "tag": ["c#", ".net"], "user": "jroberts (1284143)", "creationDate": "2012-04-03T22:27:01.627"} +{"title": "Unable Response.Redirect(url); with many query arguments", "qid": "10002347", "answers": [{"date": "2012-04-04T07:27:42.113", "user": "Ruud van Falier (181142)"}], "tag": ["asp.net", "redirect", "query-string", "sitecore"], "user": "Nate- (190196)", "creationDate": "2012-04-03T22:27:01.787"} +{"title": "harmonic series with x86-64 assembly", "qid": "10002349", "answers": [{"date": "2012-10-09T19:55:09.313", "user": "Chris Dodd (16406)"}], "tag": ["x86-64", "nasm", "calculus"], "user": "user1050632 (1050632)", "creationDate": "2012-04-03T22:27:11.287"} +{"title": "Defining a large array of size larger than a unsigned int limit", "qid": "1000235", "answers": [{"date": "2009-06-16T08:52:55.420", "user": "laalto (101361)"}, {"date": "2009-06-16T08:53:58.240", "user": "finnw (12048)"}, {"date": "2016-03-02T02:10:42.413", "user": "Christian Gingras (5544721)"}], "tag": ["c", "arrays", "declaration"], "user": "goldenmean (2759376)", "creationDate": "2009-06-16T08:43:46.123"} +{"title": "What does \"set keymap vi\" do?", "qid": "10002356", "answers": [{"date": "2012-04-03T23:04:51.553", "user": "jasonwryan (712613)"}], "tag": ["bash", "shell"], "user": "Vlad the Impala (139117)", "creationDate": "2012-04-03T22:27:47.620"} +{"title": "Counting 1s in the two's complement representations of integers in range[x,y]", "qid": "10002359", "answers": [{"date": "2012-04-03T22:54:19.667", "user": "Daniel Fischer (1011995)"}], "tag": ["c++", "algorithm", "binary"], "user": "bl3e (736355)", "creationDate": "2012-04-03T22:27:55.510"} +{"title": "Soft keyboard causes view to bounce in flex mobile app", "qid": "10002367", "answers": [{"date": "2012-04-19T16:54:08.657", "user": "Colin (1316231)"}], "tag": ["flex", "mobile", "bounce", "soft-keyboard"], "user": "Tarek (217234)", "creationDate": "2012-04-03T22:28:37.197"} +{"title": "Create classes and compile it from c#", "qid": "10002368", "answers": [{"date": "2012-04-03T22:35:14.927", "user": "Micah Armantrout (237109)"}, {"date": "2012-04-03T22:41:44.753", "user": "Aerik (262298)"}], "tag": ["c#"], "user": "jcvegan (1033938)", "creationDate": "2012-04-03T22:28:41.347"} +{"title": "Why won't my textfield save to my singleton?", "qid": "10002369", "answers": [{"date": "2012-04-03T22:43:46.947", "user": "Panagiotis (670078)"}], "tag": ["objective-c", "ios"], "user": "user990769 (990769)", "creationDate": "2012-04-03T22:28:42.297"} +{"title": "How can I use BIRT with a remote (http/https) data source that reqiures authentication?", "qid": "1000237", "answers": [{"date": "2009-06-16T20:09:33.277", "user": "FoxyBOA (19347)"}], "tag": ["birt"], "user": "serbaut (84760)", "creationDate": "2009-06-16T08:43:57.183"} +{"title": "Make ZVAL persistent across the SAPI?", "qid": "10002372", "answers": [{"date": "2012-04-04T03:02:55.333", "user": "Flavius (88054)"}, {"date": "2015-09-05T07:49:17.177", "user": "c9s (780629)"}], "tag": ["php-extension", "php-internals"], "user": "Luke (867760)", "creationDate": "2012-04-03T22:28:53.170"} +{"title": "Making a custom message box using tinter", "qid": "10002383", "answers": [{"date": "2012-04-03T22:56:41.260", "user": "apple16 (875747)"}], "tag": ["python", "tkinter"], "user": "Mission Impossible (1288825)", "creationDate": "2012-04-03T22:29:38.957"} +{"title": "Create file on SkyDrive", "qid": "10002390", "answers": [{"date": "2013-11-17T08:31:38.557", "user": "seikichi (2918992)"}], "tag": ["javascript", "rest", "skydrive"], "user": "seesharper (800103)", "creationDate": "2012-04-03T22:30:05.260"} +{"title": "Instaling XCode 3.2.5 on OSX 10.6.8 produces the error - \"The operation couldn\u2019t be completed. CSSMERR_TP_CERT_EXPIRED\"", "qid": "10002393", "answers": [{"date": "2012-04-03T22:32:53.470", "user": "Ralph Willgoss (743)"}, {"date": "2012-04-20T19:59:23.400", "user": "dave - gbs (469016)"}], "tag": ["xcode", "osx-snow-leopard"], "user": "Ralph Willgoss (743)", "creationDate": "2012-04-03T22:30:17.060"} +{"title": "Reversing a commit in svn 1.7.4", "qid": "10002396", "answers": [{"date": "2012-04-03T22:37:02.550", "user": "the_mandrill (188414)"}], "tag": ["svn"], "user": "bmargulies (131433)", "creationDate": "2012-04-03T22:30:35.793"} +{"title": "Loading symbol file for debugging cross-compiled VLC (mingw in Linux) project under windows environment (Cygwin)", "qid": "10002398", "answers": [{"date": "2012-04-06T00:19:11.570", "user": "vgrimmer (777077)"}], "tag": ["debugging", "gdb", "cygwin", "mingw", "cross-compiling"], "user": "vgrimmer (777077)", "creationDate": "2012-04-03T22:30:38.367"} +{"title": "Groovy: deploying a war file", "qid": "1000240", "answers": [{"date": "2009-06-16T09:03:35.070", "user": "Michael Borgwardt (16883)"}], "tag": ["exception", "grails", "war-filedeployment"], "user": "Luixv (72420)", "creationDate": "2009-06-16T08:44:06.293"} +{"title": "Conversion failed when converting date and/or time from character string", "qid": "10002401", "answers": [{"date": "2012-04-03T22:33:19.380", "user": "Michael Fredrickson (643591)"}, {"date": "2012-04-03T22:40:32.693", "user": "JotaBe (1216612)"}], "tag": ["sql", "sql-server", "sql-server-2008", "tsql"], "user": "James Hay (845704)", "creationDate": "2012-04-03T22:30:55.357"} +{"title": "Load only what classes are being used in Ruby?", "qid": "10002405", "answers": [{"date": "2012-04-03T22:52:09.263", "user": "Jwosty (1231925)"}, {"date": "2012-04-03T22:54:51.307", "user": "Matheus Moreira (512904)"}], "tag": ["ruby", "class", "require", "ruby-1.9.3"], "user": "Mr. Demetrius Michael (1182095)", "creationDate": "2012-04-03T22:31:16.663"} +{"title": "How to install which programs requires \"sudo\" in virtualenv?", "qid": "10002406", "answers": [{"date": "2012-04-03T22:52:47.080", "user": "andrew cooke (181772)"}, {"date": "2012-04-04T00:05:59.113", "user": "BluesRockAddict (754042)"}], "tag": ["python", "ubuntu", "virtualenv"], "user": "user (1247145)", "creationDate": "2012-04-03T22:31:24.197"} +{"title": "Column Names Across Multiple Rows?", "qid": "10002408", "answers": [{"date": "2012-04-03T23:35:50.720", "user": "Chase (415635)"}], "tag": ["r", "xts", "zoo"], "user": "user1202761 (1202761)", "creationDate": "2012-04-03T22:31:29.067"} +{"title": "Optimal xml storage engine", "qid": "1000241", "answers": [{"date": "2009-06-16T08:58:14.597", "user": "SztupY (120917)"}, {"date": "2009-06-16T09:04:40.747", "user": "RichardOD (97558)"}], "tag": ["xml", "storage"], "user": "nixau (118104)", "creationDate": "2009-06-16T08:44:09.493"} +{"title": "Simple loop, which one I would get more performance and which one is recommended? defining a variable inside a loop or outside of it?", "qid": "10002410", "answers": [{"date": "2012-04-03T22:34:02.000", "user": "Brendon Cheves (337472)"}, {"date": "2012-04-03T22:37:48.397", "user": "std''OrgnlDave (1110687)"}, {"date": "2012-04-03T22:50:18.173", "user": "Anthales (1250595)"}, {"date": "2012-04-03T22:53:32.457", "user": "aroyer (964122)"}, {"date": "2012-04-03T23:05:24.023", "user": "DRVic (1232878)"}], "tag": ["c++", "c", "algorithm"], "user": "Grego (668138)", "creationDate": "2012-04-03T22:31:30.537"} +{"title": "Column Visibility when Exporting to CSV", "qid": "10002411", "answers": [{"date": "2013-03-06T21:02:25.363", "user": "Registered User (38332)"}], "tag": ["reporting-services", "ssrs-2008"], "user": "user961714 (961714)", "creationDate": "2012-04-03T22:31:33.080"} +{"title": "Getting a movie to play seamlessly on my site (without controls or a frame)", "qid": "10002418", "answers": [{"date": "2012-04-03T23:12:09.520", "user": "connor (937637)"}], "tag": ["html", "css", "movieclip"], "user": "bevanb (1279844)", "creationDate": "2012-04-03T22:32:47.337"} +{"title": "Rails 3.1 - Thumbs_up gem missing from github.com... Where did it go?", "qid": "10002421", "answers": [{"date": "2012-04-03T22:35:25.233", "user": "Alex (596068)"}], "tag": ["ruby-on-rails-3.1", "github", "gem"], "user": "Don (580961)", "creationDate": "2012-04-03T22:33:02.300"} +{"title": "Binding multiple fields to the same property of an MVC 3 view model", "qid": "10002430", "answers": [{"date": "2012-04-03T22:39:36.950", "user": "SLaks (34397)"}, {"date": "2012-04-03T23:17:51.357", "user": "Pricey (98706)"}, {"date": "2012-04-03T23:18:35.993", "user": "rpmcnally (1301074)"}], "tag": ["c#", "asp.net-mvc-3"], "user": "Pricey (98706)", "creationDate": "2012-04-03T22:34:32.937"} +{"title": "Wrapping div to new line causing funny behavior", "qid": "10002433", "answers": [{"date": "2012-04-03T22:38:45.370", "user": "Pete (428531)"}, {"date": "2012-04-03T22:42:26.433", "user": "pinouchon (311744)"}], "tag": ["css", "html", "row", "wrap"], "user": "bradley4 (770061)", "creationDate": "2012-04-03T22:34:36.620"} +{"title": "Installing openCSV for Java. What do I do with a .gz file?", "qid": "10002436", "answers": [{"date": "2012-04-03T22:40:45.160", "user": "Guillaume Polet (928711)"}, {"date": "2012-04-04T00:51:45.667", "user": "eabraham (286459)"}], "tag": ["java", "eclipse", "netbeans", "opencsv"], "user": "screechOwl (914308)", "creationDate": "2012-04-03T22:34:57.083"} +{"title": "JDO, unowned relationship and persisting multiple objects at once", "qid": "10002437", "answers": [{"date": "2012-04-04T09:13:55.570", "user": "DataNucleus (69258)"}], "tag": ["google-app-engine", "jdo"], "user": "themarketka (473180)", "creationDate": "2012-04-03T22:34:59.593"} +{"title": "Make index.html default, but allow index.php to be visited if typed in", "qid": "10002439", "answers": [{"date": "2012-04-10T03:23:24.697", "user": "The Alpha (741747)"}, {"date": "2012-04-10T11:51:16.157", "user": "user1249679"}, {"date": "2015-06-17T19:57:08.383", "user": "Natacha Beaugeais (1711323)"}], "tag": ["html", ".htaccess"], "user": "Matt Rowles (718341)", "creationDate": "2012-04-03T22:35:13.610"} +{"title": "How best to identify that no chars appear in a given page? (In Word.)", "qid": "10002443", "answers": [{"date": "2012-04-03T23:30:03.427", "user": "Fionnuala (2548)"}], "tag": ["vba", "ms-word", "word-vba"], "user": "M M (895545)", "creationDate": "2012-04-03T22:35:38.227"} +{"title": "Div scrolling to top after contents are refreshed/reloaded", "qid": "10002444", "answers": [{"date": "2012-04-03T22:50:01.863", "user": "Selvakumar Arumugam (297641)"}, {"date": "2012-04-03T22:50:13.643", "user": "Soc (1090267)"}], "tag": ["jquery", "html", "scroll", "refresh"], "user": "DobotJr (739035)", "creationDate": "2012-04-03T22:35:39.023"} +{"title": "C libcurl print webpage contents", "qid": "10002446", "answers": [{"date": "2012-04-03T22:42:25.540", "user": "abelenky (34824)"}], "tag": ["c", "curl", "libcurl"], "user": "Stefan (1093828)", "creationDate": "2012-04-03T22:35:44.420"} +{"title": "event.preventDefault() not working in the keypress event on Android", "qid": "10002450", "answers": [{"date": "2012-04-03T23:05:50.810", "user": "keystorm (1250477)"}, {"date": "2012-04-03T23:34:51.163", "user": "TimWickstrom.com (787796)"}, {"date": "2012-04-04T00:10:38.193", "user": "keystorm (1250477)"}], "tag": ["javascript", "jquery", "android"], "user": "The Awnry Bear (848393)", "creationDate": "2012-04-03T22:36:03.247"} +{"title": "Bubble pop game Actionscript: defining ToString() method through a reference with a static type class", "qid": "10002451", "answers": [{"date": "2012-04-03T22:42:09.790", "user": "Richard Inglis (98806)"}, {"date": "2012-04-03T22:42:18.693", "user": "f-a (920457)"}, {"date": "2012-04-03T22:56:17.827", "user": "Wesley Petrowski (77926)"}, {"date": "2012-04-03T23:11:07.460", "user": "Marty (699632)"}], "tag": ["actionscript-3", "flash", "math", "random"], "user": "GivenPie (1058430)", "creationDate": "2012-04-03T22:36:22.113"} +{"title": "Variable and expressions in ruby", "qid": "10002453", "answers": [{"date": "2012-04-03T22:58:35.283", "user": "Castilho (1157224)"}], "tag": ["ruby"], "user": "user1239333 (1239333)", "creationDate": "2012-04-03T22:36:30.310"} +{"title": "add property to .jks with keytool", "qid": "10002458", "answers": [{"date": "2012-04-03T22:56:00.493", "user": "Jcs (432589)"}], "tag": ["java", "certificate", "keytool", "jks"], "user": "Oscar Jara (1178686)", "creationDate": "2012-04-03T22:37:13.333"} +{"title": "Select Element inside Form not working in JQuery", "qid": "1000246", "answers": [{"date": "2009-06-16T08:48:05.443", "user": "Paolo Bergantino (16417)"}, {"date": "2009-06-16T08:51:15.797", "user": "kgiannakakis (24054)"}], "tag": ["jquery"], "user": "Graviton (3834)", "creationDate": "2009-06-16T08:45:11.050"} +{"title": "create a modal that is animated via jquery plugin", "qid": "10002464", "answers": [{"date": "2012-04-03T22:58:17.517", "user": "coder (944919)"}], "tag": ["jquery", "plugins", "jquery-animate", "modal-dialog"], "user": "Jonas (899120)", "creationDate": "2012-04-03T22:38:21.710"} +{"title": "tying button onclick event to Backbone View", "qid": "10002466", "answers": [{"date": "2012-04-03T23:06:23.807", "user": "Edward M Smith (267404)"}, {"date": "2012-04-04T06:55:07.423", "user": "drinchev (1282674)"}], "tag": ["javascript", "backbone.js"], "user": "Ying (175225)", "creationDate": "2012-04-03T22:38:43.733"} +{"title": "How do I save and change the value of a variable in OCaml?", "qid": "10002471", "answers": [{"date": "2012-04-03T23:07:48.143", "user": "pad (634025)"}], "tag": ["ocaml", "variable-assignment", "mutation"], "user": "EBM (1302017)", "creationDate": "2012-04-03T22:39:06.343"} +{"title": "PHP: absolute paths within includes with localhost", "qid": "10002473", "answers": [{"date": "2012-04-03T23:10:06.287", "user": "markus (11995)"}, {"date": "2012-04-03T23:11:13.840", "user": "Justin Nafe (1055339)"}, {"date": "2012-04-03T23:11:33.680", "user": "TheOx (263692)"}, {"date": "2012-04-03T23:13:39.003", "user": "Pete (428531)"}], "tag": ["php", "include", "localhost"], "user": "asgaines (1311538)", "creationDate": "2012-04-03T22:39:22.450"} +{"title": "Issue with passing JSON to a view in Web2py", "qid": "10002474", "answers": [{"date": "2012-04-04T01:41:12.977", "user": "JLundell (408105)"}, {"date": "2014-11-09T01:56:15.480", "user": "Ro Mc (2289053)"}], "tag": ["json", "web2py"], "user": "user1311549 (1311549)", "creationDate": "2012-04-03T22:39:29.163"} +{"title": "iOS - Access Navigation Controller in AppDelegate", "qid": "10002477", "answers": [{"date": "2012-04-03T22:57:18.590", "user": "Phillip Mills (784753)"}, {"date": "2012-04-03T23:06:24.170", "user": "Justin A. (1261953)"}], "tag": ["iphone", "ios", "uinavigationcontroller", "uitabbarcontroller"], "user": "Brian Boyle (260506)", "creationDate": "2012-04-03T22:39:40.860"} +{"title": "jQuery UI show using slide animation jumps to full height before animation starts", "qid": "10002479", "answers": [{"date": "2012-04-04T16:35:11.187", "user": "streetlogics (542550)"}, {"date": "2014-01-17T09:20:27.807", "user": "Vivek Doshi (2349407)"}], "tag": ["jquery", "jquery-ui", "jquery-effects", "jquery-slide-effects"], "user": "streetlogics (542550)", "creationDate": "2012-04-03T22:39:52.957"} +{"title": "Push from a clone to original in gitorious", "qid": "10002482", "answers": [{"date": "2012-04-04T07:15:39.617", "user": "thomanil (59953)"}], "tag": ["git", "gitorious"], "user": "Zac (82330)", "creationDate": "2012-04-03T22:40:25.370"} +{"title": "Distance matrix for mysql, based on previous solution for haversine distance calculation", "qid": "10002489", "answers": [], "tag": ["mysql", "matrix", "distance", "self-join"], "user": "silvio (903908)", "creationDate": "2012-04-03T22:41:07.437"} +{"title": "File.Copy and character encoding", "qid": "1000249", "answers": [{"date": "2009-06-16T08:54:46.960", "user": "Jon Skeet (22656)"}, {"date": "2009-06-16T08:55:51.450", "user": "Josh (81769)"}], "tag": ["c#", ".net", "file-io"], "user": "chris166 (108655)", "creationDate": "2009-06-16T08:45:36.510"} +{"title": "Measure size of .NET objects", "qid": "10002490", "answers": [{"date": "2012-04-03T22:46:30.247", "user": "Eric J. (141172)"}], "tag": ["c#", "asp.net", "caching", ".net-4.0"], "user": "amateur (373674)", "creationDate": "2012-04-03T22:41:13.713"} +{"title": "Artificial Intelligence - Machine Learning", "qid": "10002491", "answers": [{"date": "2012-04-03T23:22:41.917", "user": "Fezvez (596951)"}, {"date": "2012-04-03T23:33:40.773", "user": "Richard Inglis (98806)"}, {"date": "2012-04-03T23:54:27.533", "user": "Franck Dernoncourt (395857)"}], "tag": ["artificial-intelligence", "machine-learning"], "user": "Raphael Mitrious (1183680)", "creationDate": "2012-04-03T22:41:20.193"} +{"title": "What version of jQuery to use with jQuery Mobile?", "qid": "10002495", "answers": [{"date": "2012-04-03T22:52:31.370", "user": "Jasper (752738)"}, {"date": "2012-04-03T22:55:18.447", "user": "codaniel (1226698)"}], "tag": ["jquery", "jquery-mobile"], "user": "Phillip Senn (111665)", "creationDate": "2012-04-03T22:41:43.477"} +{"title": "Using the results from 2 tables to get info from a 3rd one", "qid": "10002496", "answers": [{"date": "2012-04-03T22:49:48.247", "user": "Michael Fredrickson (643591)"}, {"date": "2012-04-03T22:53:12.537", "user": "JDD (717679)"}], "tag": ["mysql", "sql"], "user": "Ray (1311556)", "creationDate": "2012-04-03T22:41:44.443"} +{"title": "Trouble installing PHP-Payments", "qid": "10002499", "answers": [{"date": "2012-08-15T07:31:56.067", "user": "Zigu (174634)"}], "tag": ["php", "codeigniter", "failed-installation"], "user": "Zigu (174634)", "creationDate": "2012-04-03T22:41:58.923"} +{"title": "debugging swf locally with remote data", "qid": "10002502", "answers": [{"date": "2012-04-04T20:18:03.853", "user": "Boyo (1312097)"}], "tag": ["actionscript-3", "cross-domain", "flash-cs5"], "user": "talg (3332)", "creationDate": "2012-04-03T22:42:12.937"} +{"title": "Having trouble passing text from MySQL to a Javascript function using PHP", "qid": "10002503", "answers": [{"date": "2012-04-03T22:48:18.530", "user": "0plus1 (82098)"}, {"date": "2012-04-03T22:51:40.150", "user": "Cal (59120)"}, {"date": "2012-04-03T23:26:41.383", "user": "Pete (428531)"}, {"date": "2012-04-03T23:38:27.180", "user": "Starx (295264)"}], "tag": ["php", "javascript", "mysql", "html"], "user": "Nate (1311545)", "creationDate": "2012-04-03T22:42:14.603"} +{"title": "How to jQuery an XML file over a PHP-script and parse it right?", "qid": "10002510", "answers": [{"date": "2012-04-03T22:57:17.220", "user": "Rob W (938089)"}, {"date": "2012-04-03T23:47:35.820", "user": "Oscar (1311076)"}, {"date": "2012-04-04T00:20:42.497", "user": "Fatih (480949)"}], "tag": ["javascript", "jquery", "xml", "ajax", "parsing"], "user": "Yannick Wald (667978)", "creationDate": "2012-04-03T22:43:06.200"} +{"title": "Replace character with another character in regex PHP", "qid": "10002512", "answers": [{"date": "2012-04-03T22:45:41.817", "user": "Cal (59120)"}], "tag": ["php", "regex", "wordpress", "expression"], "user": "Justin Lucas (1275349)", "creationDate": "2012-04-03T22:43:21.450"} +{"title": "Should you avoid jQuery and/or jQueryUI?", "qid": "10002513", "answers": [{"date": "2012-04-03T22:45:58.993", "user": "Rob W (938089)"}, {"date": "2012-04-03T22:47:35.447", "user": "Panagiotis (670078)"}], "tag": ["javascript", "jquery", "jquery-ui"], "user": "Friend of Kim (1054584)", "creationDate": "2012-04-03T22:43:30.527"} +{"title": "Smart GWT purchasing license.", "qid": "10002514", "answers": [{"date": "2012-04-04T05:24:29.073", "user": "RAS (366898)"}], "tag": ["smartgwt"], "user": "MindBrain (1118559)", "creationDate": "2012-04-03T22:43:33.290"} +{"title": "Image Rotation + horizontal or vertical flip", "qid": "10002516", "answers": [{"date": "2012-04-04T07:30:02.753", "user": "jing3142 (541667)"}, {"date": "2013-08-10T17:01:03.953", "user": "Madan (1250184)"}], "tag": ["image", "html5", "canvas", "matrix"], "user": "fernandojsg (474684)", "creationDate": "2012-04-03T22:43:43.233"} +{"title": "Nginx fails to send full file from Node/Express app", "qid": "10002518", "answers": [{"date": "2012-04-05T20:29:23.507", "user": "tb. (112858)"}, {"date": "2016-02-12T16:58:36.203", "user": "K.A.D. (116987)"}], "tag": ["node.js", "nginx", "express"], "user": "tb. (112858)", "creationDate": "2012-04-03T22:43:48.440"} +{"title": "Compilers compatible with gprof?", "qid": "1000252", "answers": [{"date": "2009-06-16T08:57:23.880", "user": "Alex Brown (121332)"}, {"date": "2009-06-16T09:06:43.003", "user": "Alex Brown (121332)"}], "tag": ["compiler-construction", "gprof"], "user": "J\u00e9r\u00f4me (49850)", "creationDate": "2009-06-16T08:46:12.220"} +{"title": "Firefox 11.0 hangs with antiforgerytoken", "qid": "10002522", "answers": [{"date": "2012-04-03T22:50:52.587", "user": "Cymen (122868)"}], "tag": ["asp.net-mvc-3", "firefox", "antiforgerytoken"], "user": "Joe (1258671)", "creationDate": "2012-04-03T22:44:11.087"} +{"title": "How does UIImage get constructed when created from an XIB?", "qid": "10002529", "answers": [{"date": "2012-04-03T22:51:52.520", "user": "Michael Dautermann (981049)"}, {"date": "2012-04-03T22:53:37.827", "user": "benzado (10947)"}, {"date": "2012-04-03T23:01:40.283", "user": "Eli (117588)"}], "tag": ["iphone", "ios", "interface-builder", "xib", "nib"], "user": "Eli (117588)", "creationDate": "2012-04-03T22:45:14.957"} +{"title": "ASP.NET SlideShowExtender retrieving images from web service, but doing nothing when executed", "qid": "10002534", "answers": [{"date": "2012-04-04T16:12:41.000", "user": "James Wright (1114123)"}], "tag": ["c#", "asp.net", "sql-server", "ajax", "database"], "user": "James Wright (1114123)", "creationDate": "2012-04-03T22:45:54.620"} +{"title": "how do I replace numeric codes with value labels from a lookup table?", "qid": "10002536", "answers": [{"date": "2012-04-03T23:02:31.957", "user": "flodel (1201032)"}, {"date": "2012-04-04T01:25:26.257", "user": "Eric Fail (1305688)"}, {"date": "2014-02-19T11:36:30.977", "user": "ATN (1928660)"}], "tag": ["r", "replace", "variable-assignment", "data.frame", "rename"], "user": "Eric Fail (1305688)", "creationDate": "2012-04-03T22:45:57.560"} +{"title": "NSInvocation & NSError - __autoreleasing & memory crasher", "qid": "10002538", "answers": [{"date": "2012-04-03T23:34:46.620", "user": "John Calsbeek (5696)"}], "tag": ["objective-c", "automatic-ref-counting", "nsinvocation"], "user": "edelaney05 (492847)", "creationDate": "2012-04-03T22:46:05.230"} +{"title": "Extract VB.NET code from exe file", "qid": "1000254", "answers": [{"date": "2009-06-16T08:48:57.860", "user": "Jakob Christensen (64161)"}, {"date": "2009-06-16T08:49:55.673", "user": "Stevo3000 (89075)"}, {"date": "2009-06-16T08:50:01.167", "user": "Rad (1349)"}, {"date": "2009-06-16T08:51:40.773", "user": "Binary Worrier (18797)"}, {"date": "2009-06-16T08:51:55.203", "user": "Steven (91612)"}, {"date": "2009-06-16T08:52:34.203", "user": "merkuro (122489)"}], "tag": ["vb.net", "decompiling"], "user": "naaoumii", "creationDate": "2009-06-16T08:46:25.090"} +{"title": "how to sort subarray in ruby", "qid": "10002540", "answers": [{"date": "2012-04-04T00:08:12.047", "user": "Andrew Grimm (38765)"}], "tag": ["ruby", "sorting"], "user": "Tomas Klein (1290609)", "creationDate": "2012-04-03T22:46:17.197"} +{"title": "Selecting rows where column value is the same", "qid": "10002542", "answers": [{"date": "2012-04-03T22:49:35.657", "user": "Cal (59120)"}, {"date": "2012-04-03T22:54:02.460", "user": "Spencer Avinger (517676)"}], "tag": ["php", "mysql", "rows", "file-management"], "user": "Hugo Cornellier (1260261)", "creationDate": "2012-04-03T22:46:25.470"} +{"title": "Missing Source Files in Code::Blocks?", "qid": "10002546", "answers": [], "tag": ["c++", "codeblocks"], "user": "Andrew (847481)", "creationDate": "2012-04-03T22:47:12.420"} +{"title": "IE8 Compatibility Mode Asp.net Menu Padding issue", "qid": "10002551", "answers": [{"date": "2012-04-04T00:00:27.510", "user": "Ray (1311556)"}, {"date": "2012-04-06T16:05:52.047", "user": "Code Maverick (682480)"}], "tag": ["asp.net", "css"], "user": "the sandman (792981)", "creationDate": "2012-04-03T22:47:56.653"} +{"title": "Browse .jdb output?", "qid": "10002552", "answers": [{"date": "2012-07-11T18:44:27.513", "user": "Sualeh Fatehi (100856)"}], "tag": ["java", "database", "jdb", "crawler4j"], "user": "Morgoroth (1143639)", "creationDate": "2012-04-03T22:48:15.157"} +{"title": "Components are with the same id inside ui:repeat", "qid": "10002555", "answers": [{"date": "2012-04-04T11:44:32.167", "user": "BalusC (157882)"}], "tag": ["jsf-2", "primefaces", "composite-component", "uirepeat"], "user": "brevleq (895477)", "creationDate": "2012-04-03T22:48:51.557"} +{"title": "Win32 API call - help translating c++ to c# (failed)", "qid": "10002556", "answers": [], "tag": ["c#", "api", "winapi", "intptr", "dword"], "user": "Lida Weng (579406)", "creationDate": "2012-04-03T22:48:58.467"} +{"title": "Organization of iPhone app source code before submission to Apple", "qid": "10002558", "answers": [{"date": "2012-04-03T22:53:24.207", "user": "elliottbolzan (445788)"}, {"date": "2012-04-03T22:54:10.900", "user": "inspector-g (1304626)"}, {"date": "2012-04-03T23:12:08.547", "user": "Till (91282)"}, {"date": "2012-05-05T12:52:00.720", "user": "BHUPI (1304896)"}], "tag": ["ios", "app-store", "appstore-approval"], "user": "user1239040 (1239040)", "creationDate": "2012-04-03T22:49:06.580"} +{"title": "SlikSvn: 'svn' is not recognized as an internal or external command in cmd.exe", "qid": "10002564", "answers": [{"date": "2012-04-03T23:05:04.527", "user": "Michael Burr (12711)"}, {"date": "2013-11-13T16:44:12.977", "user": "Sam (1029191)"}], "tag": ["svn", "path", "cmd"], "user": "AZ. (166286)", "creationDate": "2012-04-03T22:49:36.287"} +{"title": "ASP.NET webforms maintain List across postbacks", "qid": "10002566", "answers": [{"date": "2012-04-03T22:57:09.607", "user": "Josh (11702)"}, {"date": "2012-04-03T23:16:42.733", "user": "msigman (482286)"}], "tag": ["asp.net", "list", "viewstate", "session-variables"], "user": "maGz (863018)", "creationDate": "2012-04-03T22:49:47.360"} +{"title": "Retrieve Last n rows from mysql within a loop", "qid": "10002568", "answers": [{"date": "2012-04-03T22:56:45.550", "user": "Michael Fredrickson (643591)"}, {"date": "2012-04-03T23:06:05.537", "user": "Petr \u00dajezdsk\u00fd (1310733)"}, {"date": "2012-04-04T00:31:56.330", "user": "nnichols (1191247)"}], "tag": ["java", "mysql"], "user": "ysdelahoz (1311504)", "creationDate": "2012-04-03T22:49:48.623"} +{"title": "Simple XML Framework and Android - strange class attribute", "qid": "10002575", "answers": [{"date": "2012-04-07T21:09:26.860", "user": "Eddy (1188695)"}, {"date": "2012-11-10T14:09:57.857", "user": "ng. (21896)"}], "tag": ["java", "android", "simple-framework"], "user": "Eddy (1188695)", "creationDate": "2012-04-03T22:50:38.050"} +{"title": "After website migration, index.html no longer automatically loaded", "qid": "10002577", "answers": [{"date": "2012-04-04T01:02:51.290", "user": "clexmond (596233)"}, {"date": "2012-04-17T11:53:20.023", "user": "KDP (1299315)"}], "tag": ["ruby-on-rails", "apache", "redirect", "joyent"], "user": "KDP (1299315)", "creationDate": "2012-04-03T22:50:48.173"} +{"title": "How to handle android child activity not finishing", "qid": "10002584", "answers": [{"date": "2012-04-04T00:38:42.710", "user": "Alexander Lucas (490526)"}, {"date": "2012-04-10T16:07:20.897", "user": "user456771 (456771)"}], "tag": ["android", "android-activity", "android-intent"], "user": "user456771 (456771)", "creationDate": "2012-04-03T22:51:31.083"} +{"title": "Validating date (both format and value)", "qid": "10002587", "answers": [{"date": "2012-04-03T23:12:16.417", "user": "SpliFF (108741)"}, {"date": "2013-04-25T13:53:46.190", "user": "user1330086 (1330086)"}, {"date": "2014-07-31T16:22:52.927", "user": "Pawan Kumar (1668274)"}, {"date": "2015-01-09T03:11:56.823", "user": "Ayushraj (4435314)"}], "tag": ["python", "regex", "validation", "date", "if-statement"], "user": "George (1276534)", "creationDate": "2012-04-03T22:51:46.020"} +{"title": "Microsoft Speech Recognition - what reference do I have to add?", "qid": "10002591", "answers": [{"date": "2012-04-03T23:03:14.720", "user": "Ritch Melton (402547)"}, {"date": "2012-04-03T23:03:32.437", "user": "Philipp Schmid (33272)"}, {"date": "2012-04-04T01:00:46.880", "user": "Michael Levy (90236)"}, {"date": "2013-09-04T13:29:37.530", "user": "Aakash Anuj (1369992)"}], "tag": ["c#", "speech-recognition", "kinect"], "user": "user1002973 (1002973)", "creationDate": "2012-04-03T22:52:12.493"} +{"title": "Do applescript repeat loops reflect changes instantly?", "qid": "10002594", "answers": [{"date": "2012-04-03T23:17:18.643", "user": "adayzdone (1191301)"}], "tag": ["arrays", "loops", "applescript"], "user": "user1159454 (1159454)", "creationDate": "2012-04-03T22:52:33.597"} +{"title": "mod_rewrite /p/about => ?p=about", "qid": "10002596", "answers": [{"date": "2012-04-03T22:55:53.893", "user": "Pete (428531)"}], "tag": ["php", "mod-rewrite"], "user": "Stee (1311566)", "creationDate": "2012-04-03T22:52:41.040"} +{"title": "I can't get npm modules to work with require?", "qid": "10002599", "answers": [{"date": "2012-04-04T08:15:58.683", "user": "mihai (865038)"}], "tag": ["node.js", "npm"], "user": "Totty.js (305270)", "creationDate": "2012-04-03T22:52:48.547"} +{"title": "Is there a better way to sentinel against empty lists in Python 3?", "qid": "10002602", "answers": [], "tag": ["python-3.x", "empty-list"], "user": "Caleb (1311548)", "creationDate": "2012-04-03T22:53:03.447"} +{"title": "Inspecting c++ libraries for different stl linkage to track down std::vector destructor crash on gcc/osx?", "qid": "10002604", "answers": [{"date": "2012-04-04T04:43:13.200", "user": "leedm777 (115478)"}], "tag": ["c++", "osx", "gcc", "stl", "linker"], "user": "tfinniga (9042)", "creationDate": "2012-04-03T22:53:09.980"} +{"title": "How to avoid javascript retrieving values from non-existing elements", "qid": "1000261", "answers": [{"date": "2009-06-16T08:55:20.827", "user": "Artem Barger (104014)"}, {"date": "2009-06-16T09:04:41.590", "user": "Dan F (11569)"}], "tag": ["javascript", "wordpress", "cookies"], "user": "Steven (91612)", "creationDate": "2009-06-16T08:48:45.317"} +{"title": "how use animated gif as JFrame title bar icon", "qid": "10002610", "answers": [{"date": "2012-08-01T00:53:16.080", "user": "Justin Wiseman (1255725)"}], "tag": ["java", "animation", "icons", "jframe", "titlebar"], "user": "Justin Wiseman (1255725)", "creationDate": "2012-04-03T22:53:40.900"} +{"title": "How do I use netsnmp_query_walk() or netsnmp_query_get()?", "qid": "10002612", "answers": [{"date": "2012-04-06T01:15:01.253", "user": "St\u00e9phane (13022)"}, {"date": "2012-07-16T12:19:39.327", "user": "sam (837489)"}], "tag": ["c", "linux", "net-snmp"], "user": "St\u00e9phane (13022)", "creationDate": "2012-04-03T22:53:49.717"} +{"title": "Kohana 3.2 - i want to get distinct dates", "qid": "10002613", "answers": [{"date": "2012-04-04T00:16:53.340", "user": "user449954 (449954)"}], "tag": ["php", "kohana", "kohana-orm", "kohana-3.2"], "user": "Gian Crescini Santillan (1021173)", "creationDate": "2012-04-03T22:53:54.220"} +{"title": "Zend MVC Page Structure & Layout Link's Paths", "qid": "10002617", "answers": [{"date": "2012-04-03T23:28:21.663", "user": "Jamie Sutherland (574825)"}, {"date": "2012-04-04T08:34:12.837", "user": "conradfr (1031015)"}], "tag": ["php", "zend-framework"], "user": "dsulli (488100)", "creationDate": "2012-04-03T22:54:13.023"} +{"title": "How to postback from an anchor tag", "qid": "10002623", "answers": [{"date": "2012-04-03T22:58:11.350", "user": "MK_Dev (39843)"}, {"date": "2012-04-03T23:02:35.653", "user": "W3Max (146070)"}], "tag": ["c#", "asp.net-mvc", "asp.net-mvc-3", "razor"], "user": "alice7 (21918)", "creationDate": "2012-04-03T22:54:38.217"} +{"title": "Add multiple data series to excel chart with VBA", "qid": "10002624", "answers": [{"date": "2012-04-03T23:56:22.320", "user": "bouvierr (542417)"}], "tag": ["excel", "charts", "excel-vba"], "user": "Martin H (597109)", "creationDate": "2012-04-03T22:54:38.757"} +{"title": "ggplot2 0.9.0 automatically dropping unused factor levels from plot legend?", "qid": "10002627", "answers": [{"date": "2012-04-03T23:04:55.320", "user": "joran (324364)"}], "tag": ["r", "ggplot2"], "user": "N. Sarkar (951558)", "creationDate": "2012-04-03T22:55:17.483"} +{"title": "Best way to integrate sound into website", "qid": "1000263", "answers": [{"date": "2009-06-16T08:52:51.143", "user": "Rad (1349)"}, {"date": "2009-06-16T08:57:33.240", "user": "gonzohunter (106972)"}, {"date": "2009-06-16T08:59:22.100", "user": "Claes Mogren (4992)"}, {"date": "2009-06-16T09:01:04.967", "user": "Leonard Ehrenfried (99022)"}, {"date": "2009-06-16T09:01:27.930", "user": "merkuro (122489)"}, {"date": "2009-06-16T09:19:26.863", "user": "Alastair Montgomery (96534)"}, {"date": "2009-06-16T09:24:08.867", "user": "John Smith (1640962)"}, {"date": "2009-06-16T09:39:51.207", "user": "Lodewijk (66842)"}, {"date": "2010-01-22T06:30:01.393", "user": "Volomike (105539)"}], "tag": ["audio"], "user": "Alec Smart (426996)", "creationDate": "2009-06-16T08:49:08.810"} +{"title": "wxPython application completely invisible in OSX", "qid": "10002631", "answers": [{"date": "2012-04-12T17:38:57.903", "user": "adcoon (606547)"}], "tag": ["python", "user-interface", "wxpython"], "user": "Aaron Marks (475244)", "creationDate": "2012-04-03T22:55:35.800"} +{"title": "Accessing objects position from another script in Unity", "qid": "10002634", "answers": [{"date": "2012-04-04T21:40:19.503", "user": "Kay (437283)"}], "tag": ["c#", "unity3d"], "user": "Sam (699969)", "creationDate": "2012-04-03T22:55:59.417"} +{"title": "MOSS 2007: Displaying data from SQL Server Database", "qid": "1000264", "answers": [{"date": "2009-06-16T09:04:27.313", "user": "Steven (91612)"}, {"date": "2009-06-16T09:47:48.350", "user": "Colin (119660)"}, {"date": "2009-06-16T10:29:07.767", "user": "Alex Angas (6651)"}, {"date": "2009-06-16T22:01:17.777", "user": "Nat (13813)"}, {"date": "2009-06-22T18:33:03.127", "user": "elorg (58383)"}], "tag": ["sharepoint", "moss", "sharepoint-2007"], "user": "Gavin (8354)", "creationDate": "2009-06-16T08:49:39.340"} +{"title": "replace substring None with 'None'", "qid": "10002642", "answers": [{"date": "2012-04-03T23:04:43.203", "user": "Honest Abe (1217270)"}, {"date": "2012-04-03T23:06:41.783", "user": "He Shiming (108574)"}, {"date": "2012-04-03T23:19:12.513", "user": "fbdcw (548215)"}], "tag": ["python", "replace"], "user": "daydreamer (379235)", "creationDate": "2012-04-03T22:56:52.240"} +{"title": "MySQL compare each tuple to each other tuple in the same relation", "qid": "10002645", "answers": [{"date": "2012-04-03T23:01:04.757", "user": "Michael Fredrickson (643591)"}], "tag": ["mysql", "sql"], "user": "user1311286", "creationDate": "2012-04-03T22:57:15.593"} +{"title": "Property title Copy attribute does not match property inherited from MKAnnotation", "qid": "10002647", "answers": [{"date": "2012-05-01T13:17:28.160", "user": "Roland Keesom (1194669)"}], "tag": ["properties", "copy", "title"], "user": "Cherrie Wilson (1284055)", "creationDate": "2012-04-03T22:57:16.033"} +{"title": "In PHP, How to call function in string?", "qid": "10002652", "answers": [{"date": "2012-04-03T22:59:42.273", "user": "Spencer Avinger (517676)"}, {"date": "2012-04-03T22:59:57.587", "user": "Frederick Marcoux (1084531)"}, {"date": "2012-04-03T23:08:26.020", "user": "Basti (1220835)"}, {"date": "2013-11-25T20:27:49.543", "user": "HonoredMule (192207)"}], "tag": ["php"], "user": "lovespring (84325)", "creationDate": "2012-04-03T22:58:06.497"} +{"title": "What are some popular DSLs?", "qid": "10002658", "answers": [{"date": "2012-04-03T23:08:54.157", "user": "FelipeAls (137626)"}, {"date": "2012-04-03T23:14:59.783", "user": "Dylan (768446)"}, {"date": "2012-11-14T16:34:48.013", "user": "brgn (1668310)"}], "tag": ["dsl"], "user": "acidzombie24 (34537)", "creationDate": "2012-04-03T22:58:27.517"} +{"title": "Subscript out of range", "qid": "10002659", "answers": [{"date": "2012-04-03T23:04:26.663", "user": "BluesRockAddict (754042)"}, {"date": "2012-04-04T00:33:33.537", "user": "bouvierr (542417)"}, {"date": "2012-04-04T01:09:42.577", "user": "brettdj (641067)"}], "tag": ["excel", "vba", "loops"], "user": "Anicho (199640)", "creationDate": "2012-04-03T22:58:28.777"} +{"title": "Pointer one linked list to another linked list", "qid": "10002660", "answers": [{"date": "2012-04-03T23:05:35.417", "user": "inspector-g (1304626)"}, {"date": "2012-04-03T23:09:18.190", "user": "Shahbaz (912144)"}], "tag": ["c", "pointers", "linked-list", "structure"], "user": "Learning C (1060036)", "creationDate": "2012-04-03T22:58:28.717"} +{"title": "list item positioning as it is in the picture", "qid": "10002664", "answers": [{"date": "2012-04-03T23:04:58.103", "user": "Pete (428531)"}, {"date": "2012-04-03T23:06:57.833", "user": "overcrookd (426540)"}, {"date": "2012-04-03T23:08:40.797", "user": "pinouchon (311744)"}], "tag": ["html", "css", "positioning", "html-lists"], "user": "Karine (797336)", "creationDate": "2012-04-03T22:58:41.943"} +{"title": "Ruby (rails) Open Emails from Google Apps and get attached picture", "qid": "10002666", "answers": [{"date": "2012-04-03T23:03:26.133", "user": "Richard N. (330922)"}, {"date": "2012-04-04T14:43:39.737", "user": "Josh (1193216)"}], "tag": ["ruby", "gmail", "google-apps"], "user": "Hommer Smith (1196150)", "creationDate": "2012-04-03T22:59:03.630"} +{"title": "get information about users erros with an android app", "qid": "10002667", "answers": [{"date": "2012-04-03T23:09:33.497", "user": "207 (924149)"}], "tag": ["android", "google-play"], "user": "Pedro Teran (1200059)", "creationDate": "2012-04-03T22:59:10.930"} +{"title": "twitter bootstrap input append dropdown button appears on wrong side of input when in a table", "qid": "10002669", "answers": [{"date": "2012-04-04T00:56:25.270", "user": "Prashanth (711347)"}, {"date": "2012-04-04T01:11:11.657", "user": "Andres Ilich (680398)"}], "tag": ["ruby-on-rails", "twitter-bootstrap"], "user": "Daniel (466355)", "creationDate": "2012-04-03T22:59:11.520"} +{"title": "Setting IP addresses on Windows machine during startup", "qid": "10002670", "answers": [], "tag": ["windows", "batch-file", "ip-address", "arp", "netsh"], "user": "Allen (419647)", "creationDate": "2012-04-03T22:59:27.373"} +{"title": "What is the difference between these two particular JavaScript functions?", "qid": "10002671", "answers": [{"date": "2012-04-03T23:04:40.893", "user": "kojiro (418413)"}, {"date": "2012-04-03T23:05:05.060", "user": "ChaosPandion (156142)"}, {"date": "2012-04-03T23:10:20.173", "user": "Tuan (360053)"}, {"date": "2012-04-03T23:12:13.153", "user": "Real Tuty (1019319)"}, {"date": "2012-04-03T23:12:38.567", "user": "Dennis Rongo (1303785)"}, {"date": "2012-04-03T23:13:12.197", "user": "Alisher Ulugbekov (1267805)"}], "tag": ["javascript"], "user": "Frankie (1074003)", "creationDate": "2012-04-03T22:57:09.380"} +{"title": "Making an MVC controller [actionresults] more modular?", "qid": "10002674", "answers": [], "tag": ["asp.net-mvc", "abstraction", "modular", "code-reuse"], "user": "MVC Newbie (799181)", "creationDate": "2012-04-03T22:59:51.613"} +{"title": "Android. Require user to prompt password to mount sdcard", "qid": "10002677", "answers": [{"date": "2012-04-04T02:31:00.277", "user": "Nikolay Elenkov (242930)"}], "tag": ["android", "security", "operating-system", "usb"], "user": "Arcantos (441621)", "creationDate": "2012-04-03T23:00:27.213"} +{"title": "Can Unity and Flash communicate between eachother if they coexists in the browser?", "qid": "10002678", "answers": [{"date": "2012-04-04T01:25:10.753", "user": "f-a (920457)"}], "tag": ["actionscript-3", "browser", "communication", "unity3d", "bidirectional"], "user": "bigp (468206)", "creationDate": "2012-04-03T23:00:39.820"} +{"title": "rsync files as user using ssh key", "qid": "10002680", "answers": [{"date": "2012-04-05T23:22:52.973", "user": "Greg Price (378130)"}, {"date": "2012-04-09T16:59:59.723", "user": "user1172482 (1172482)"}], "tag": ["bash", "cron", "rsync"], "user": "user1172482 (1172482)", "creationDate": "2012-04-03T23:00:54.873"} +{"title": "shell script syntax: variable name to reference array", "qid": "10002688", "answers": [{"date": "2012-04-03T23:30:38.417", "user": "icyrock.com (438544)"}], "tag": ["arrays", "bash", "shell", "variables"], "user": "Dave Rau (483217)", "creationDate": "2012-04-03T23:01:52.140"} +{"title": "A couple of questions regarding using jQuery to manipulate video HTML5 video", "qid": "10002689", "answers": [{"date": "2012-04-03T23:27:48.983", "user": "tim peterson (702275)"}], "tag": ["jquery", "video"], "user": "Adam (282302)", "creationDate": "2012-04-03T23:01:52.330"} +{"title": "Rearranging array with O(1) extra memory in faster than O(n^2) time", "qid": "10002690", "answers": [{"date": "2012-04-03T23:07:21.160", "user": "Guffa (69083)"}, {"date": "2012-04-03T23:21:54.023", "user": "Justin (950252)"}, {"date": "2012-04-03T23:21:54.287", "user": "MPD (364913)"}, {"date": "2012-04-03T23:48:51.180", "user": "fwenom (1306979)"}], "tag": ["algorithm"], "user": "Anders Lind (947301)", "creationDate": "2012-04-03T23:02:05.380"} +{"title": "Programatically adding Static IP's", "qid": "10002691", "answers": [{"date": "2012-04-04T00:04:00.070", "user": "mellamokb (116614)"}], "tag": [".net", "c#-4.0", "windows-server-2008", "ip", "netsh"], "user": "Brett Powell (470760)", "creationDate": "2012-04-03T23:02:08.793"} +{"title": "How can you capture a subset of a screenshot in iOS using objective-c?", "qid": "10002693", "answers": [{"date": "2012-04-03T23:31:47.183", "user": "Greg (809519)"}], "tag": ["iphone", "objective-c", "ios", "screenshot"], "user": "thiesdiggity (461802)", "creationDate": "2012-04-03T23:02:23.707"} +{"title": "Why does a null date cause crosstab function to fail?", "qid": "10002697", "answers": [{"date": "2012-04-04T00:00:09.163", "user": "Clodoaldo Neto (131874)"}, {"date": "2012-04-04T00:25:44.657", "user": "Mosty Mostacho (268273)"}], "tag": ["postgresql"], "user": "rixter (253742)", "creationDate": "2012-04-03T23:02:44.917"} +{"title": "How do I make bootstrap table rows clickable?", "qid": "10002704", "answers": [{"date": "2012-04-04T00:19:02.823", "user": "Terry (803739)"}, {"date": "2012-04-04T00:26:11.853", "user": "Starx (295264)"}, {"date": "2012-07-25T09:41:43.963", "user": "matouuuuu (1551188)"}, {"date": "2012-07-25T10:36:43.843", "user": "Jasny - Arnold Daniels (1160754)"}, {"date": "2013-05-25T00:25:40.283", "user": "alpc (1365978)"}, {"date": "2015-03-08T18:06:32.643", "user": "Naren (4647328)"}, {"date": "2015-03-18T17:56:01.190", "user": "Simmoniz (651987)"}], "tag": ["css", "html5", "twitter-bootstrap"], "user": "rjurney (13969)", "creationDate": "2012-04-03T23:03:42.437"} +{"title": "Error change CCScene", "qid": "10002708", "answers": [{"date": "2012-04-04T01:35:22.990", "user": "johnbakers (3758484)"}, {"date": "2012-04-04T10:00:09.383", "user": "LearnCocos2D (201863)"}], "tag": ["ios", "ipad", "ios5", "cocos2d-iphone"], "user": "DaSilva (745459)", "creationDate": "2012-04-03T23:04:02.377"} +{"title": "Understanding Apache Camel Dynamic Routing", "qid": "10002710", "answers": [{"date": "2012-04-04T05:35:36.210", "user": "Christian Schneider (930728)"}], "tag": ["java", "apache-camel"], "user": "esimran (420723)", "creationDate": "2012-04-03T23:04:17.580"} +{"title": "Tracking list overlaps in knockoutjs", "qid": "10002712", "answers": [{"date": "2012-04-04T13:51:06.013", "user": "Roman Bataev (73432)"}], "tag": ["knockout.js"], "user": "user24359", "creationDate": "2012-04-03T23:04:24.467"} +{"title": "How to work with a model with slightly different forms in Rails?", "qid": "10002713", "answers": [{"date": "2012-04-03T23:43:00.743", "user": "Yanhao (1093890)"}, {"date": "2012-04-04T01:36:33.257", "user": "tsherif (1308624)"}], "tag": ["jquery", "ruby-on-rails", "ruby-on-rails-3"], "user": "B Seven (336920)", "creationDate": "2012-04-03T23:04:25.723"} +{"title": "Tortoise SVN - Keyword for Date/Author of File Addition to Repo", "qid": "10002715", "answers": [{"date": "2012-04-05T15:39:32.557", "user": "WhiteKnight (664054)"}], "tag": ["svn", "properties", "tortoisesvn"], "user": "raven (849761)", "creationDate": "2012-04-03T23:04:28.553"} +{"title": "How do I ignore all files apart from one or two directories?", "qid": "10002728", "answers": [{"date": "2012-04-03T23:19:21.813", "user": "JDD (717679)"}], "tag": ["git"], "user": "user1104799 (1104799)", "creationDate": "2012-04-03T23:05:11.147"} +{"title": "Reusing images in same layout", "qid": "10002734", "answers": [{"date": "2012-04-03T23:21:05.137", "user": "JRaymond (947304)"}], "tag": ["android", "eclipse", "android-image"], "user": "s.nguyen (1310531)", "creationDate": "2012-04-03T23:05:43.683"} +{"title": "emberjs: when I try to use the action helper, i get - Handlebars error: Could not find property 'action' on object", "qid": "10002737", "answers": [{"date": "2012-04-04T03:26:54.490", "user": "Dan Gebhardt (664735)"}, {"date": "2012-04-05T07:29:50.023", "user": "sly7_7 (373254)"}], "tag": ["ember.js"], "user": "Robert Beaupre (1311561)", "creationDate": "2012-04-03T23:06:02.407"} +{"title": "Custom Input View (Split Keyboard)", "qid": "10002745", "answers": [], "tag": ["ipad", "ios5", "keyboard", "inputview"], "user": "Jaden10 (913052)", "creationDate": "2012-04-03T23:06:43.467"} +{"title": "Using Structure Map to replace an abstract type in generic type parameter", "qid": "10002748", "answers": [{"date": "2012-04-04T17:09:06.823", "user": "svick (41071)"}], "tag": ["c#", "generics", "abstract-class", "structuremap"], "user": "mafue (1311550)", "creationDate": "2012-04-03T23:07:02.980"} +{"title": "svg clone only shape of a scaled group", "qid": "10002749", "answers": [{"date": "2012-04-04T11:02:30.213", "user": "mihai (865038)"}], "tag": ["javascript", "svg"], "user": "Ecrin (1073777)", "creationDate": "2012-04-03T23:07:19.577"} +{"title": "Java/Serializable - Overwrite only changed objects", "qid": "10002753", "answers": [{"date": "2012-04-03T23:37:26.670", "user": "EJP (207421)"}, {"date": "2012-04-03T23:58:29.383", "user": "Greg Kopff (1212960)"}, {"date": "2012-04-04T21:47:18.843", "user": "Fortyrunner (16828)"}], "tag": ["java", "serialization"], "user": "ast (1311575)", "creationDate": "2012-04-03T23:07:27.850"} +{"title": "How can I have the user change options of the jQuery UI Slider?", "qid": "10002754", "answers": [{"date": "2012-04-03T23:42:48.490", "user": "OAC Designs (1097858)"}, {"date": "2012-04-03T23:54:54.973", "user": "Starx (295264)"}], "tag": ["javascript", "jquery", "html", "jquery-ui", "jquery-ui-slider"], "user": "Sam Pellino (1179310)", "creationDate": "2012-04-03T23:07:33.527"} +{"title": "How to avoid resetting the java Scanner position", "qid": "10002756", "answers": [{"date": "2012-04-04T00:45:24.603", "user": "Brian Roach (302916)"}], "tag": ["java", "regex", "java.util.scanner"], "user": "Derek (229072)", "creationDate": "2012-04-03T23:07:43.343"} +{"title": "Filling in a data set using three \"puzzle pieces\"", "qid": "10002758", "answers": [{"date": "2012-04-03T23:28:53.033", "user": "Justin (906490)"}, {"date": "2012-04-04T00:51:46.677", "user": "flodel (1201032)"}, {"date": "2012-04-04T00:57:19.313", "user": "Thomson Comer (498629)"}], "tag": ["r"], "user": "Charlie (160553)", "creationDate": "2012-04-03T23:07:50.000"} +{"title": "Apache ModRewrite pattern not stored", "qid": "10002759", "answers": [{"date": "2012-04-04T06:23:07.570", "user": "Olivier Pons (106140)"}], "tag": ["regex", "bash", "mod-rewrite", "lamp"], "user": "puk (654789)", "creationDate": "2012-04-03T23:07:50.130"} +{"title": "AD Provider Membership.GetUser() cause error saying: \"The parameter 'username' must not be empty.\"", "qid": "1000276", "answers": [{"date": "2009-06-16T09:58:31.993", "user": "Tamir (94334)"}], "tag": ["c#", "visual-studio", "unit-testing", "active-directory", "asp.net-membership"], "user": "Tamir (94334)", "creationDate": "2009-06-16T08:52:11.787"} +{"title": "jQuery image fade not working for unknown reason...?", "qid": "10002763", "answers": [{"date": "2012-04-03T23:26:11.457", "user": "caoglish (1311607)"}, {"date": "2012-04-03T23:28:52.120", "user": "cha55son (595130)"}, {"date": "2012-04-03T23:30:42.160", "user": "Josh Infiesto (392119)"}, {"date": "2012-04-03T23:46:42.320", "user": "caoglish (1311607)"}], "tag": ["jquery", "html", "opacity", "fade"], "user": "Henrik Petterson (1185126)", "creationDate": "2012-04-03T23:08:44.873"} +{"title": "Strings variations in python - what do they mean?", "qid": "10002764", "answers": [{"date": "2012-04-03T23:13:07.707", "user": "Mike Christensen (392044)"}, {"date": "2012-04-03T23:13:21.703", "user": "veiset (581395)"}, {"date": "2012-04-03T23:19:52.290", "user": "Josh Infiesto (392119)"}], "tag": ["python"], "user": "9-bits (801820)", "creationDate": "2012-04-03T23:08:53.837"} +{"title": "Using LESS: compile minified and non-minified versions of CSS", "qid": "10002767", "answers": [{"date": "2012-04-11T15:49:34.913", "user": "Chao (300996)"}], "tag": ["css", "compiler-construction", "less"], "user": "cbaone (1311580)", "creationDate": "2012-04-03T23:09:09.343"} +{"title": "WM_GESTURE: retrieve all fingers?", "qid": "10002768", "answers": [{"date": "2012-04-04T15:49:44.180", "user": "tkcast (1281972)"}], "tag": ["winapi", "touch", "gesture-recognition", "gestures"], "user": "tkcast (1281972)", "creationDate": "2012-04-03T23:09:14.023"} +{"title": "Need help working with AJAX", "qid": "10002769", "answers": [], "tag": ["php", "javascript", "mysql", "ajax"], "user": "Francisco (1294342)", "creationDate": "2012-04-03T23:09:17.007"} +{"title": "need to ssh to remote machine from web page with python/django", "qid": "10002771", "answers": [{"date": "2012-04-04T00:14:14.297", "user": "ghoti (1072112)"}], "tag": ["python", "django", "ssh"], "user": "pcm (1204098)", "creationDate": "2012-04-03T23:09:19.407"} +{"title": "How to scroll a TextBox horizontally just like the WP7 Browser's address", "qid": "10002772", "answers": [{"date": "2012-04-04T08:01:59.653", "user": "Paul Diston (611155)"}], "tag": ["windows-phone-7", "textbox", "scroll"], "user": "Mark Wager-Smith (246009)", "creationDate": "2012-04-03T23:09:33.633"} +{"title": "Moving a UIManagedDocument from the sandbox to iCloud", "qid": "10002776", "answers": [], "tag": ["ios5", "icloud", "uimanageddocument", "icloud-api"], "user": "Robert Charest (1311574)", "creationDate": "2012-04-03T23:09:46.477"} +{"title": "compling assemblies on a 64bit plaform for a 32bit", "qid": "1000278", "answers": [{"date": "2009-06-16T08:57:13.367", "user": "AnthonyWJones (17516)"}, {"date": "2009-06-16T08:58:54.050", "user": "jerryjvl (111781)"}], "tag": [".net", "windows-vista", "64bit", "32-bit", "publish"], "user": "sam (309834)", "creationDate": "2009-06-16T08:52:25.623"} +{"title": "TFS 2010: WorkItem.Save triggers WorkItemChangedEvent again", "qid": "10002780", "answers": [{"date": "2012-04-04T19:16:41.480", "user": "jessehouwing (736079)"}, {"date": "2014-07-17T13:56:57.810", "user": "Tamir Daniely (1704733)"}], "tag": ["tfs", "event-handling", "tfs2010"], "user": "ctb (512629)", "creationDate": "2012-04-03T23:10:10.373"} +{"title": "Neural Networks for opponent prediction in AI", "qid": "10002782", "answers": [{"date": "2012-04-04T23:09:29.087", "user": "Laky (1178007)"}], "tag": ["java", "artificial-intelligence", "machine-learning", "neural-network"], "user": "Laky (1178007)", "creationDate": "2012-04-03T23:10:27.923"} +{"title": "I need to display the entire Text of my ListViewItems (not truncated)", "qid": "10002783", "answers": [{"date": "2012-04-04T02:04:46.767", "user": "Jeremy Thompson (495455)"}, {"date": "2012-04-04T02:17:17.307", "user": "Dr. Wily's Apprentice (207976)"}, {"date": "2012-04-07T15:58:12.743", "user": "B. Clay Shannon (875317)"}, {"date": "2015-03-05T09:01:55.817", "user": "Ahmad (1463733)"}, {"date": "2016-02-04T10:04:01.267", "user": "Fetchez la vache (786103)"}], "tag": ["c#", ".net", "winforms", "listview", "listviewitem"], "user": "B. Clay Shannon (875317)", "creationDate": "2012-04-03T23:10:45.413"} +{"title": "tfsbuild --- how to output to 2 different sources", "qid": "10002785", "answers": [{"date": "2012-04-04T10:35:42.340", "user": "M.Radwan -MVP (386323)"}], "tag": ["msbuild", "tfsbuild"], "user": "TFSHomeBoy (1311567)", "creationDate": "2012-04-03T23:10:54.233"} +{"title": "How to abbreviate the long Selenium CSS code for table elements?", "qid": "10002788", "answers": [{"date": "2012-05-01T04:01:14.403", "user": "Robert Evans (620622)"}], "tag": ["css", "css3", "css-selectors", "selenium-rc", "selenium-chromedriver"], "user": "seleniumlover (766240)", "creationDate": "2012-04-03T23:11:18.813"} +{"title": "Grails named query for NOT IN", "qid": "10002796", "answers": [{"date": "2012-04-03T23:18:17.487", "user": "pablomolnar (705117)"}], "tag": ["hibernate", "grails", "criteria", "named-query"], "user": "dbrin (834424)", "creationDate": "2012-04-03T23:12:21.230"} +{"title": "Overriding the maximum value of a bigint datatype in SQL Server", "qid": "10002798", "answers": [{"date": "2012-04-03T23:14:17.147", "user": "SQLMenace (740)"}, {"date": "2012-04-03T23:16:35.463", "user": "Diego (1169020)"}], "tag": ["sql-server", "sql-server-2008", "tsql", "constraints"], "user": "Elliott (250030)", "creationDate": "2012-04-03T23:12:29.880"} +{"title": "How semantic versioning fits into the git workflow", "qid": "10002803", "answers": [{"date": "2012-04-04T01:09:06.437", "user": "svick (41071)"}], "tag": ["git", "versioning"], "user": "Adrian Chung (1311559)", "creationDate": "2012-04-03T23:13:19.550"} +{"title": "Storing password in tables and Digest authentication", "qid": "1000281", "answers": [{"date": "2009-06-16T08:59:06.280", "user": "Almad (123558)"}], "tag": ["security", "authentication"], "user": "Remus Rusanu (105929)", "creationDate": "2009-06-16T08:52:38.960"} +{"title": "parse_str on an object instead of global namespace", "qid": "10002810", "answers": [{"date": "2012-04-03T23:19:02.660", "user": "hakre (367456)"}, {"date": "2012-04-03T23:23:59.950", "user": "alex (31671)"}, {"date": "2012-04-03T23:43:06.873", "user": "Darrell Ding (1311361)"}], "tag": ["php", "security"], "user": "qwertymk (465546)", "creationDate": "2012-04-03T23:14:43.417"} +{"title": "C# Insert ArrayList in DataRow", "qid": "10002811", "answers": [{"date": "2012-04-03T23:35:33.407", "user": "Davide Piras (559144)"}, {"date": "2012-04-03T23:37:33.437", "user": "John Woo (491243)"}], "tag": ["c#"], "user": "RainMan (1237226)", "creationDate": "2012-04-03T23:14:47.727"} +{"title": "Thumbnail plugin in wordpress", "qid": "10002813", "answers": [], "tag": ["image", "wordpress-plugin", "thumbnails"], "user": "Mohan Ahire (1301857)", "creationDate": "2012-04-03T23:14:58.810"} +{"title": "Simulating multiple HTTP Clients from single machine c#", "qid": "10002816", "answers": [], "tag": ["c#", "http", "httpwebrequest", "keep-alive", "servicepoint"], "user": "Tejas Vora (1241991)", "creationDate": "2012-04-03T23:15:08.487"} +{"title": "how to dynamically create binding proxies?", "qid": "10002817", "answers": [{"date": "2012-04-04T00:23:04.007", "user": "surfen (724944)"}], "tag": ["c#", ".net", "winforms", "data-binding"], "user": "svallory (219838)", "creationDate": "2012-04-03T23:15:11.577"} +{"title": "Simple Array in java", "qid": "10002818", "answers": [{"date": "2012-04-03T23:23:55.760", "user": "anthropomorphic (1291990)"}, {"date": "2012-04-03T23:29:47.213", "user": "stzzz1 (1311189)"}, {"date": "2012-04-03T23:41:37.303", "user": "Bohemian (256196)"}, {"date": "2012-04-04T00:25:24.093", "user": "Tommy B (331062)"}, {"date": "2012-04-04T03:00:17.913", "user": "David DeMar (1236018)"}], "tag": ["java", "arrays"], "user": "New2.java (1311590)", "creationDate": "2012-04-03T23:15:18.403"} +{"title": "XPages more fields at the click on a button issue with partial refresh", "qid": "10002820", "answers": [{"date": "2012-04-04T05:05:42.997", "user": "jjtbsomhorst (1219277)"}, {"date": "2012-04-04T07:27:11.517", "user": "Simon McLoughlin (1185169)"}], "tag": ["xpages"], "user": "pipalia (1219176)", "creationDate": "2012-04-03T23:15:26.990"} +{"title": "How do I POST an array with multipart/form-data encoding?", "qid": "10002821", "answers": [{"date": "2012-04-03T23:35:40.860", "user": "Alexei Tenitski (45508)"}], "tag": ["php", "apache", "http", "post", "multipartform-data"], "user": "DougW (205192)", "creationDate": "2012-04-03T23:15:27.863"} +{"title": "Play! - Expecting a stack map frame in method controllers", "qid": "10002824", "answers": [{"date": "2012-08-09T01:44:34.180", "user": "Dean Hiller (517781)"}], "tag": ["playframework"], "user": "Benny (194261)", "creationDate": "2012-04-03T23:15:50.827"} +{"title": "Javascript run function on