mirror of https://gitee.com/bigwinds/arangodb
Merge branch 'devel' of github.com:triAGENS/AvocadoDB into devel
This commit is contained in:
commit
1ac35825e4
|
@ -259,6 +259,218 @@ bool TRI_CheckInListJson (const TRI_json_t* const search,
|
|||
return false;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief uniquify a sorted json list into a new list
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
TRI_json_t* TRI_UniquifyListJson (const TRI_json_t* const list) {
|
||||
TRI_json_t* last = NULL;
|
||||
TRI_json_t* result;
|
||||
size_t i, n;
|
||||
|
||||
assert(list);
|
||||
assert(list->_type == TRI_JSON_LIST);
|
||||
|
||||
// create result list
|
||||
result = TRI_CreateListJson(TRI_UNKNOWN_MEM_ZONE);
|
||||
if (!result) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
n = list->_value._objects._length;
|
||||
for (i = 0; i < n; ++i) {
|
||||
TRI_json_t* p = TRI_AtVector(&list->_value._objects, i);
|
||||
|
||||
// don't push value if it is the same as the last value
|
||||
if (!last || TRI_CompareValuesJson(p, last) > 0) {
|
||||
TRI_PushBackListJson(TRI_UNKNOWN_MEM_ZONE, result, p);
|
||||
// remember last element
|
||||
last = p;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief create the union of two sorted json lists into a new list
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
TRI_json_t* TRI_UnionizeListsJson (const TRI_json_t* const list1,
|
||||
const TRI_json_t* const list2,
|
||||
const bool unique) {
|
||||
TRI_json_t* last = NULL;
|
||||
TRI_json_t* result;
|
||||
size_t i1, i2;
|
||||
size_t n1, n2;
|
||||
|
||||
assert(list1);
|
||||
assert(list1->_type == TRI_JSON_LIST);
|
||||
assert(list2);
|
||||
assert(list2->_type == TRI_JSON_LIST);
|
||||
|
||||
n1 = list1->_value._objects._length;
|
||||
n2 = list2->_value._objects._length;
|
||||
|
||||
// special cases for empty lists
|
||||
if (n1 == 0 && !unique) {
|
||||
return TRI_CopyJson(TRI_UNKNOWN_MEM_ZONE, (TRI_json_t*) list2);
|
||||
}
|
||||
|
||||
if (n2 == 0 && !unique) {
|
||||
return TRI_CopyJson(TRI_UNKNOWN_MEM_ZONE, (TRI_json_t*) list1);
|
||||
}
|
||||
|
||||
// create result list
|
||||
result = TRI_CreateListJson(TRI_UNKNOWN_MEM_ZONE);
|
||||
if (!result) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// reset positions
|
||||
i1 = 0;
|
||||
i2 = 0;
|
||||
|
||||
// iterate over lists
|
||||
while (true) {
|
||||
// pointers to elements in both lists
|
||||
TRI_json_t* p1;
|
||||
TRI_json_t* p2;
|
||||
|
||||
if (i1 < n1 && i2 < n2) {
|
||||
int compareResult;
|
||||
|
||||
// both lists not yet exhausted
|
||||
p1 = TRI_AtVector(&list1->_value._objects, i1);
|
||||
p2 = TRI_AtVector(&list2->_value._objects, i2);
|
||||
compareResult = TRI_CompareValuesJson(p1, p2);
|
||||
|
||||
if (compareResult < 0) {
|
||||
// left element is smaller
|
||||
if (!unique || !last || TRI_CompareValuesJson(p1, last) > 0) {
|
||||
TRI_PushBackListJson(TRI_UNKNOWN_MEM_ZONE, result, p1);
|
||||
last = p1;
|
||||
}
|
||||
++i1;
|
||||
}
|
||||
else if (compareResult > 0) {
|
||||
// right element is smaller
|
||||
if (!unique || !last || TRI_CompareValuesJson(p2, last) > 0) {
|
||||
TRI_PushBackListJson(TRI_UNKNOWN_MEM_ZONE, result, p2);
|
||||
last = p2;
|
||||
}
|
||||
++i2;
|
||||
}
|
||||
else {
|
||||
// both elements are equal
|
||||
if (!unique || !last || TRI_CompareValuesJson(p1, last) > 0) {
|
||||
TRI_PushBackListJson(TRI_UNKNOWN_MEM_ZONE, result, p1);
|
||||
last = p1;
|
||||
if (!unique) {
|
||||
TRI_PushBackListJson(TRI_UNKNOWN_MEM_ZONE, result, p2);
|
||||
}
|
||||
}
|
||||
++i1;
|
||||
++i2;
|
||||
}
|
||||
}
|
||||
else if (i1 < n1 && i2 >= n2) {
|
||||
// only right list is exhausted
|
||||
p1 = TRI_AtVector(&list1->_value._objects, i1);
|
||||
|
||||
if (!unique || !last || TRI_CompareValuesJson(p1, last) > 0) {
|
||||
TRI_PushBackListJson(TRI_UNKNOWN_MEM_ZONE, result, p1);
|
||||
last = p1;
|
||||
}
|
||||
++i1;
|
||||
}
|
||||
else if (i1 >= n1 && i2 < n2) {
|
||||
// only left list is exhausted
|
||||
p2 = TRI_AtVector(&list1->_value._objects, i2);
|
||||
|
||||
if (!unique || !last || TRI_CompareValuesJson(p2, last) > 0) {
|
||||
TRI_PushBackListJson(TRI_UNKNOWN_MEM_ZONE, result, p2);
|
||||
last = p2;
|
||||
}
|
||||
++i2;
|
||||
}
|
||||
else {
|
||||
// both lists exhausted, stop!
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief create the intersection of two sorted json lists into a new list
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
TRI_json_t* TRI_IntersectListsJson (const TRI_json_t* const list1,
|
||||
const TRI_json_t* const list2,
|
||||
const bool unique) {
|
||||
TRI_json_t* last = NULL;
|
||||
TRI_json_t* result;
|
||||
size_t i1, i2;
|
||||
size_t n1, n2;
|
||||
|
||||
assert(list1);
|
||||
assert(list1->_type == TRI_JSON_LIST);
|
||||
assert(list2);
|
||||
assert(list2->_type == TRI_JSON_LIST);
|
||||
|
||||
// create result list
|
||||
result = TRI_CreateListJson(TRI_UNKNOWN_MEM_ZONE);
|
||||
if (!result) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
n1 = list1->_value._objects._length;
|
||||
n2 = list2->_value._objects._length;
|
||||
|
||||
// special case for empty lists
|
||||
if (n1 == 0 || n2 == 0) {
|
||||
return result;
|
||||
}
|
||||
|
||||
// reset positions
|
||||
i1 = 0;
|
||||
i2 = 0;
|
||||
|
||||
// iterate over lists
|
||||
while (i1 < n1 && i2 < n2) {
|
||||
// pointers to elements in both lists
|
||||
TRI_json_t* p1 = TRI_AtVector(&list1->_value._objects, i1);
|
||||
TRI_json_t* p2 = TRI_AtVector(&list2->_value._objects, i2);
|
||||
|
||||
int compareResult = TRI_CompareValuesJson(p1, p2);
|
||||
|
||||
if (compareResult < 0) {
|
||||
// left element is smaller
|
||||
++i1;
|
||||
}
|
||||
else if (compareResult > 0) {
|
||||
// right element is smaller
|
||||
++i2;
|
||||
}
|
||||
else {
|
||||
// both elements are equal
|
||||
if (!unique || !last || TRI_CompareValuesJson(p1, last) > 0) {
|
||||
TRI_PushBackListJson(TRI_UNKNOWN_MEM_ZONE, result, p1);
|
||||
last = p1;
|
||||
if (!unique) {
|
||||
TRI_PushBackListJson(TRI_UNKNOWN_MEM_ZONE, result, p2);
|
||||
}
|
||||
}
|
||||
++i1;
|
||||
++i2;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief sorts a json list in place
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
@ -67,6 +67,37 @@ bool TRI_CheckSameValueJson (const TRI_json_t* const, const TRI_json_t* const);
|
|||
|
||||
bool TRI_CheckInListJson (const TRI_json_t* const, const TRI_json_t* const);
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief uniquify a sorted json list into a new list
|
||||
///
|
||||
/// it is a prerequisite that the input list is already sorted.
|
||||
/// otherwise the result is unpredictable.
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
TRI_json_t* TRI_UniquifyListJson (const TRI_json_t* const);
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief create the union of two sorted json lists into a new list
|
||||
///
|
||||
/// the result list can be made unique or non-unique. it is a prerequisite that
|
||||
/// both input lists are already sorted. otherwise the result is unpredictable.
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
TRI_json_t* TRI_UnionizeListsJson (const TRI_json_t* const,
|
||||
const TRI_json_t* const,
|
||||
const bool);
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief create the intersection of two sorted json lists into a new list
|
||||
///
|
||||
/// the result list can be made unique or non-unique. it is a prerequisite that
|
||||
/// both input lists are already sorted. otherwise the result is unpredictable.
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
TRI_json_t* TRI_IntersectListsJson (const TRI_json_t* const,
|
||||
const TRI_json_t* const,
|
||||
const bool);
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief sorts a json list in place
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
|
Loading…
Reference in New Issue