Skip to content

File set_object.h

File List > cubrid > src > object > set_object.h

Go to the documentation of this file

/*
 * Copyright 2008 Search Solution Corporation
 * Copyright 2016 CUBRID Corporation
 *
 *  Licensed 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.
 *
 */


/*
 * set_object.h - Set management
 */

#ifndef _SET_OBJECT_H_
#define _SET_OBJECT_H_

#ident "$Id$"

#include "config.h"

#include "dbtype_def.h"
#include "error_manager.h"
#include "object_domain.h"  /* for TP_DOMAIN */
#include "locator.h"        /* for LC_OIDSET */

#if !defined (SERVER_MODE)
#include "parser.h"     /* for PT_OP_TYPE */
#endif /* CS_MODE */

#define SET_DUPLICATE_VALUE (1)
#define IMPLICIT (1)

#define COL_BLOCK_SIZE (64)

/* Is there some compelling reason to keep the value array larger than necessary?
 * this will suck proportionally with the size of the collection
 * Leaving it as is for now, not sure if the code relies on this being 1 larger
 * than the necessary size.
 */
#define EXPAND(blockindex) ((int) (((blockindex)*1.1) + 1))

#define BLOCK(collection_index) ((int) ((collection_index)/COL_BLOCK_SIZE))
#define OFFSET(collection_index) ((int) ((collection_index)%COL_BLOCK_SIZE))
#define INDEX(collection,index) (&(collection->array[BLOCK(index)][OFFSET(index)]))
#define BLOCKING_LESS1 (COL_BLOCK_SIZE -1)
#define VALUETOP(col) ((col->topblock * COL_BLOCK_SIZE) + col->topblockcount)
#define COLBLOCKSIZE(n) (sizeof(COL_BLOCK) + (n * sizeof(DB_VALUE)))
#define BLOCK_START(block)      ((COL_BLOCK *) \
            ((char *)block - offsetof(struct collect_block, val)))

/* hack, need to check for a NULL OID pointer (a virtual object) before using
 * OID_ISTEMP.
 */
#define OBJECT_HAS_TEMP_OID(obj) \
  ((WS_OID(obj) == NULL) ? 0 : OID_ISTEMP(WS_OID(obj)))

typedef struct setobj SETOBJ;
struct setobj
{

  DB_TYPE coltype;
  int size;         /* valid indexes from 0 to size -1 aka the number of represented values in the
                 * collection */
  int lastinsert;       /* the last value insertion point 0 to size. */
  int topblock;         /* maximum index of an allocated block. This is the maximum non-NULL db_value pointer
                 * index of array. array[topblock] should be non-NULL. array[topblock+1] will be a NULL
                 * pointer for future expansion. */
  int arraytop;         /* maximum indexable pointer in array the valid indexes for array are 0 to arraytop
                 * inclusive Generally this may be greater than topblock */
  int topblockcount;        /* This is the max index of the top block Since it may be shorter than a standard sized
                 * block for space efficiency. */
  DB_VALUE **array;

  /* not stored on disk, attached at run time by the schema */
  struct tp_domain *domain;

  /* external reference list */
  DB_COLLECTION *references;

  /* clear if we can't guarantee sort order, always on for sequences */
  unsigned sorted:1;

  /* set if we can't guarantee that there are no temporary OID's in here */
  unsigned may_have_temporary_oids:1;
};
typedef SETOBJ COL;

typedef struct set_iterator
{
  struct set_iterator *next;    /* chain of iterators on this set */

  DB_SET *ref;          /* set we're iterating over */
  SETOBJ *set;          /* set object */
  DB_VALUE_LIST *element;   /* current list element */
  DB_VALUE *value;      /* current element pointer */
  int position;         /* current element index */
} SET_ITERATOR;



extern DB_COLLECTION *set_create (DB_TYPE type, int initial_size);
extern int set_area_init (void);
extern void set_area_final (void);
extern void set_area_reset ();
extern DB_COLLECTION *set_create_basic (void);
extern DB_COLLECTION *set_create_multi (void);
extern DB_COLLECTION *set_create_sequence (int size);
extern DB_COLLECTION *set_create_with_domain (TP_DOMAIN * domain, int initial_size);
extern DB_COLLECTION *set_make_reference (void);
extern DB_COLLECTION *set_copy (DB_COLLECTION * set);
#if defined (ENABLE_UNUSED_FUNCTION)
extern int set_clear (DB_COLLECTION * set);
#endif
extern void set_free (DB_COLLECTION * set);
extern DB_COLLECTION *set_coerce (DB_COLLECTION * set, TP_DOMAIN * domain, bool implicit_coercion);
extern int set_filter (DB_COLLECTION * set);

/* Element access */

extern int set_get_element (DB_COLLECTION * set, int index, DB_VALUE * value);
extern int set_get_element_nocopy (DB_COLLECTION * set, int index, DB_VALUE * value);
extern int set_add_element (DB_COLLECTION * set, DB_VALUE * value);
#if defined (ENABLE_UNUSED_FUNCTION)
extern int set_add_element_quick (DB_COLLECTION * set, DB_VALUE * value);
#endif
extern int set_put_element (DB_COLLECTION * set, int index, DB_VALUE * value);
extern int set_insert_element (DB_COLLECTION * set, int index, DB_VALUE * value);
extern int set_drop_element (DB_COLLECTION * set, DB_VALUE * value, bool match_nulls);
extern int set_drop_seq_element (DB_COLLECTION * set, int index);
extern int set_find_seq_element (DB_COLLECTION * set, DB_VALUE * value, int index);

/* set operations */

extern int set_difference (DB_COLLECTION * collection1, DB_COLLECTION * collection2, DB_COLLECTION ** result,
               DB_DOMAIN * domain);
extern int set_union (DB_COLLECTION * collection1, DB_COLLECTION * collection2, DB_COLLECTION ** result,
              DB_DOMAIN * domain);
extern int set_intersection (DB_COLLECTION * collection1, DB_COLLECTION * collection2, DB_COLLECTION ** result,
                 DB_DOMAIN * domain);
extern void set_make_collection (DB_VALUE * value, DB_COLLECTION * col);

/* Information */

extern int set_cardinality (DB_COLLECTION * set);
extern int set_size (DB_COLLECTION * set);
extern bool set_isempty (DB_COLLECTION * set);
#if defined(ENABLE_UNUSED_FUNCTION)
extern bool set_is_all_null (DB_COLLECTION * set);
#endif
extern bool set_has_null (DB_COLLECTION * set);
extern bool set_ismember (DB_COLLECTION * set, DB_VALUE * value);
#if !defined (SERVER_MODE)
extern int set_issome (DB_VALUE * value, DB_COLLECTION * set, PT_OP_TYPE op, int do_coercion);
#endif /* !defined (SERVER_MODE) */
extern int set_convert_oids_to_objects (DB_COLLECTION * set);
extern DB_TYPE set_get_type (DB_COLLECTION * set);
extern DB_VALUE_COMPARE_RESULT set_compare_order (DB_COLLECTION * set1, DB_COLLECTION * set2, int do_coercion,
                          int total_order);
extern DB_VALUE_COMPARE_RESULT set_compare (DB_COLLECTION * set1, DB_COLLECTION * set2, int do_coercion);
extern DB_VALUE_COMPARE_RESULT set_seq_compare (DB_COLLECTION * set1, DB_COLLECTION * set2, int do_coercion,
                        int total_order);
extern DB_VALUE_COMPARE_RESULT vobj_compare (DB_COLLECTION * set1, DB_COLLECTION * set2, int do_coercion,
                         int total_order);
extern TP_DOMAIN_STATUS set_check_domain (DB_COLLECTION * set, TP_DOMAIN * domain);
extern TP_DOMAIN *set_get_domain (DB_COLLECTION * set);

/* Debugging functions */
#ifdef __cplusplus
extern "C"
{
#endif
  extern void set_fprint (FILE * fp, DB_COLLECTION * set);
  extern void set_print (DB_COLLECTION * set);
#ifdef __cplusplus
}
#endif
/* shut down */

extern void set_final (void);

/* hack for post-sorting collections with temporary OIDs */

extern int set_optimize (DB_COLLECTION * ref);

/* These are lower level functions intended only for the transformer */

extern DB_VALUE_COMPARE_RESULT setvobj_compare (COL * set1, COL * set2, int do_coercion, int total_order);

/* intended for use only by the object manager (obj) */

extern int set_connect (DB_COLLECTION * ref, MOP owner, int attid, TP_DOMAIN * domain);
extern int set_disconnect (DB_COLLECTION * ref);
extern DB_COLLECTION *set_change_owner (DB_COLLECTION * ref, MOP owner, int attid, TP_DOMAIN * domain);
extern int set_get_setobj (DB_COLLECTION * ref, COL ** setptr, int for_write);
/* hacks for loaddb */

extern DB_VALUE *set_new_element (DB_COLLECTION * ref);

extern SET_ITERATOR *set_iterate (DB_COLLECTION * set);
extern void set_iterator_free (SET_ITERATOR * it);
extern DB_VALUE *set_iterator_value (SET_ITERATOR * it);
extern int set_iterator_next (SET_ITERATOR * it);
extern void set_free_block (DB_VALUE * in_block);

extern int col_value_compare (DB_VALUE * a, DB_VALUE * b);

extern int col_sort (COL * col);
extern int col_expand (COL * col, long i);
extern COL *col_new (long size, int settype);
extern int col_has_null (COL * col);

extern long col_find (COL * col, long *found, DB_VALUE * val, int do_coerce);
extern int col_put (COL * col, long colindex, DB_VALUE * val);

extern int col_insert (COL * col, long colindex, DB_VALUE * val);
extern int col_delete (COL * col, long colindex);
extern int col_add (COL * col, DB_VALUE * val);
extern int col_drop (COL * col, DB_VALUE * val);
extern int col_drop_nulls (COL * col);
extern int col_permanent_oids (COL * col);

extern int set_tform_disk_set (DB_COLLECTION * ref, COL ** setptr);
#if defined(ENABLE_UNUSED_FUNCTION)
extern int set_iterator_finished (SET_ITERATOR * it);

#if !defined(SERVER_MODE)
extern int setobj_find_temporary_oids (SETOBJ * col, LC_OIDSET * oidset);
#endif /* SERVER_MODE */
#endif /* ENABLE_UNUSED_FUNCTION */

extern COL *setobj_create_with_domain (TP_DOMAIN * domain, int initial_size);
extern COL *setobj_create (DB_TYPE collection_type, int size);
extern void setobj_clear (COL * col);
extern void setobj_free (COL * col);
extern COL *setobj_copy (COL * col);
extern int setobj_sort (COL * col);
extern TP_DOMAIN_STATUS setobj_check_domain (COL * col, TP_DOMAIN * domain);
extern TP_DOMAIN *setobj_get_domain (COL * set);
extern void swizzle_value (DB_VALUE * val, int input);
extern int setobj_filter (COL * col, int filter, int *cardptr);
extern int setobj_size (COL * col);
extern int setobj_cardinality (COL * col);
extern bool setobj_isempty (COL * col);
extern bool setobj_ismember (COL * col, DB_VALUE * proposed_value, int check_null);
extern DB_VALUE_COMPARE_RESULT setobj_compare (COL * set1, COL * set2, int do_coercion);
extern DB_VALUE_COMPARE_RESULT setobj_compare_order (COL * set1, COL * set2, int do_coercion, int total_order);
extern int setobj_difference (COL * set1, COL * set2, COL * result);
extern int setobj_union (COL * set1, COL * set2, COL * result);
extern int setobj_intersection (COL * set1, COL * set2, COL * result);
#if !defined (SERVER_MODE)
extern int setobj_issome (DB_VALUE * value, COL * set, PT_OP_TYPE op, int do_coercion);
#endif /* defined (CS_MODE) */
extern int setobj_convert_oids_to_objects (COL * col);
extern int setobj_get_element_ptr (COL * col, int index, DB_VALUE ** result);
extern int setobj_get_element (COL * set, int index, DB_VALUE * value);
extern int setobj_add_element (COL * col, DB_VALUE * value);
extern int setobj_put_element (COL * col, int index, DB_VALUE * value);
extern int setobj_insert_element (COL * col, int index, DB_VALUE * value);
extern int setobj_drop_element (COL * col, DB_VALUE * value, bool match_nulls);
extern int setobj_drop_seq_element (COL * col, int index);
extern int setobj_find_seq_element (COL * col, DB_VALUE * value, int index);
extern COL *setobj_coerce (COL * col, TP_DOMAIN * domain, bool implicit_coercion);
extern void setobj_print (FILE * fp, COL * col);
extern TP_DOMAIN *setobj_domain (COL * set);
extern void setobj_put_domain (COL * set, TP_DOMAIN * domain);
extern int setobj_put_value (COL * col, int index, DB_VALUE * value);
extern DB_COLLECTION *setobj_get_reference (COL * set);
extern int setobj_release (COL * set);
extern int setobj_build_domain_from_col (COL * col, TP_DOMAIN ** set_domain);

#endif /* _SET_OBJECT_H_ */