Documentation ¶
Overview ¶
Package gocassa is a high-level library on top of gocql
Current version: v1.1.0 Compared to gocql it provides query building, adds data binding, and provides easy-to-use "recipe" tables for common query use-cases. Unlike cqlc, it does not use code generation.
Index ¶
- type ClusteringOrderColumn
- type ColumnDirection
- type Connection
- type Counter
- type Filter
- type KeySpace
- type Keys
- type MapTable
- type MockFilter
- type MockTable
- func (t *MockTable) Create() error
- func (t *MockTable) CreateIfNotExist() error
- func (t *MockTable) CreateIfNotExistStatement() (string, error)
- func (t *MockTable) CreateStatement() (string, error)
- func (t *MockTable) Name() string
- func (t *MockTable) Recreate() error
- func (t *MockTable) Set(i interface{}) Op
- func (t *MockTable) SetWithOptions(i interface{}, options Options) Op
- func (t *MockTable) Where(relations ...Relation) Filter
- func (t *MockTable) WithOptions(o Options) Table
- type Modifier
- func CounterIncrement(value int) Modifier
- func ListAppend(value interface{}) Modifier
- func ListPrepend(value interface{}) Modifier
- func ListRemove(value interface{}) Modifier
- func ListSetAtIndex(index int, value interface{}) Modifier
- func MapSetField(key, value interface{}) Modifier
- func MapSetFields(fields map[string]interface{}) Modifier
- type MultiTimeSeriesTable
- type MultimapMkTable
- type MultimapTable
- type Op
- type Options
- type QueryExecutor
- type Relation
- type RowNotFoundError
- type Table
- type TableChanger
- type TimeSeriesTable
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type ClusteringOrderColumn ¶
type ClusteringOrderColumn struct { Direction ColumnDirection Column string }
ClusteringOrderColumn specifies a clustering column and whether its clustering order is ASC or DESC.
type Connection ¶
type Connection interface { CreateKeySpace(name string) error DropKeySpace(name string) error KeySpace(name string) KeySpace }
Connection exists because one can not connect to a keyspace if it does not exist, thus having a Create on KeySpace is not possible. Use ConnectToKeySpace to acquire an instance of KeySpace without getting a Connection.
func Connect ¶
func Connect(nodeIps []string, username, password string) (Connection, error)
Connect to a cluster. If you are happy with default the options use this, if you need anything fancier, use `NewConnection`
func NewConnection ¶
func NewConnection(q QueryExecutor) Connection
NewConnection creates a Connection with a custom query executor. Use `Connect` if you just want to talk to Cassandra with the default options. See `GoCQLSessionToQueryExecutor` if you want to use a gocql session with your own options as a `QueryExecutor`
type Filter ¶
type Filter interface { // Updates does a partial update. Use this if you don't want to overwrite your whole row, but you want to modify fields atomically. Update(m map[string]interface{}) Op // Probably this is danger zone (can't be implemented efficiently) on a selectuinb with more than 1 document // Delete all rows matching the filter. Delete() Op // Read the results. Make sure you pass in a pointer to a slice. Read(pointerToASlice interface{}) Op // Read one result. Make sure you pass in a pointer. ReadOne(pointer interface{}) Op }
Filter is a subset of a Table, filtered by Relations. You can do writes or reads on a filter.
type KeySpace ¶
type KeySpace interface { MapTable(tableName, id string, row interface{}) MapTable MultimapTable(tableName, fieldToIndexBy, uniqueKey string, row interface{}) MultimapTable MultimapMultiKeyTable(tableName string, fieldToIndexBy, uniqueKey []string, row interface{}) MultimapMkTable TimeSeriesTable(tableName, timeField, uniqueKey string, bucketSize time.Duration, row interface{}) TimeSeriesTable MultiTimeSeriesTable(tableName, fieldToIndexByField, timeField, uniqueKey string, bucketSize time.Duration, row interface{}) MultiTimeSeriesTable Table(tableName string, row interface{}, keys Keys) Table // DebugMode enables/disables debug mode depending on the value of the input boolean. // When DebugMode is enabled, all built CQL statements are printe to stdout. DebugMode(bool) // Name returns the keyspace name as in C* Name() string // Tables returns the name of all configured column families in this keyspace Tables() ([]string, error) // Exists returns whether the specified column family exists within the keyspace Exists(string) (bool, error) }
KeySpace is used to obtain tables from.
func ConnectToKeySpace ¶
func ConnectToKeySpace(keySpace string, nodeIps []string, username, password string) (KeySpace, error)
Connect to a certain keyspace directly. Same as using Connect().KeySpace(keySpaceName)
func NewMockKeySpace ¶
func NewMockKeySpace() KeySpace
type Keys ¶
type Keys struct { PartitionKeys []string ClusteringColumns []string Compound bool //indicates if the partitions keys are gereated as compound key when no clustering columns are set }
Keys is used with the raw CQL Table type. It is implicit when using recipe tables.
type MapTable ¶
type MapTable interface { Set(v interface{}) Op Update(id interface{}, m map[string]interface{}) Op Delete(id interface{}) Op Read(id, pointer interface{}) Op MultiRead(ids []interface{}, pointerToASlice interface{}) Op WithOptions(Options) MapTable TableChanger }
MapTable gives you basic CRUD functionality. If you need fancier ways to query your data set have a look at the other tables.
type MockFilter ¶
type MockFilter struct {
// contains filtered or unexported fields
}
MockFilter implements the Filter interface and works with MockTable.
func (*MockFilter) Delete ¶
func (f *MockFilter) Delete() Op
func (*MockFilter) Read ¶
func (q *MockFilter) Read(out interface{}) Op
func (*MockFilter) ReadOne ¶
func (q *MockFilter) ReadOne(out interface{}) Op
func (*MockFilter) Update ¶
func (f *MockFilter) Update(m map[string]interface{}) Op
func (*MockFilter) UpdateWithOptions ¶
func (f *MockFilter) UpdateWithOptions(m map[string]interface{}, options Options) Op
type MockTable ¶
MockTable implements the Table interface and stores rows in-memory.
func (*MockTable) CreateIfNotExist ¶
func (*MockTable) CreateIfNotExistStatement ¶
func (*MockTable) CreateStatement ¶
func (*MockTable) SetWithOptions ¶
func (*MockTable) WithOptions ¶
type Modifier ¶
type Modifier struct {
// contains filtered or unexported fields
}
func CounterIncrement ¶
CounterIncrement increments the value of the counter with the given value. Negative value results in decrementing.
func ListAppend ¶
func ListAppend(value interface{}) Modifier
ListAppend appends a value to the end of the list
func ListPrepend ¶
func ListPrepend(value interface{}) Modifier
ListPrepend prepends a value to the front of the list
func ListRemove ¶
func ListRemove(value interface{}) Modifier
ListRemove removes all elements from a list having a particular value
func ListSetAtIndex ¶
ListSetAtIndex sets the list element at a given index to a given value
func MapSetField ¶
func MapSetField(key, value interface{}) Modifier
MapSetField updates the map with the given key and value
func MapSetFields ¶
MapSetFields updates the map with keys and values in the given map
type MultiTimeSeriesTable ¶
type MultiTimeSeriesTable interface { // timeField and idField must be present Set(v interface{}) Op Update(v interface{}, timeStamp time.Time, id interface{}, m map[string]interface{}) Op Delete(v interface{}, timeStamp time.Time, id interface{}) Op Read(v interface{}, timeStamp time.Time, id, pointer interface{}) Op List(v interface{}, start, end time.Time, pointerToASlice interface{}) Op WithOptions(Options) MultiTimeSeriesTable TableChanger }
MultiTimeSeriesTable is a cross between TimeSeries and Multimap tables.
type MultimapMkTable ¶
type MultimapMkTable interface { Set(v interface{}) Op Update(v, id map[string]interface{}, m map[string]interface{}) Op Delete(v, id map[string]interface{}) Op DeleteAll(v map[string]interface{}) Op List(v, startId map[string]interface{}, limit int, pointerToASlice interface{}) Op Read(v, id map[string]interface{}, pointer interface{}) Op MultiRead(v, id map[string]interface{}, pointerToASlice interface{}) Op WithOptions(Options) MultimapMkTable TableChanger }
MultimapMkTable lets you list rows based on several fields equality, eg. 'list all sales where seller id = v and name = 'john'.
type MultimapTable ¶
type MultimapTable interface { Set(v interface{}) Op Update(v, id interface{}, m map[string]interface{}) Op Delete(v, id interface{}) Op DeleteAll(v interface{}) Op List(v, startId interface{}, limit int, pointerToASlice interface{}) Op Read(v, id, pointer interface{}) Op MultiRead(v interface{}, ids []interface{}, pointerToASlice interface{}) Op WithOptions(Options) MultimapTable TableChanger }
MultimapTable lets you list rows based on a field equality, eg. 'list all sales where seller id = v'.
type Op ¶
type Op interface { // Run the operation. Run() error // You do not need this in 95% of the use cases, use Run! // Using atomic batched writes (logged batches in Cassandra terminology) comes at a high performance cost! RunAtomically() error // Add an other Op to this one. Add(...Op) Op // WithOptions lets you specify `Op` level `Options`. // The `Op` level Options and the `Table` level `Options` will be merged in a way that Op level takes precedence. // All queries in an `Op` will have the specified `Options`. // When using Add(), the existing options are preserved. // For example: // // op1.WithOptions(Options{Limit:3}).Add(op2.WithOptions(Options{Limit:2})) // op1 has a limit of 3, op2 has a limit of 2 // op1.WithOptions(Options{Limit:3}).Add(op2).WithOptions(Options{Limit:2}) // op1 and op2 both have a limit of 2 // WithOptions(Options) Op // Preflight performs any pre-execution validation that confirms the op considers itself "valid". // NOTE: Run() and RunAtomically() should call this method before execution, and abort if any errors are returned. Preflight() error // GenerateStatement generates the statment and params to perform the operation GenerateStatement() (string, []interface{}) // QueryExecutor returns the QueryExecutor QueryExecutor() QueryExecutor }
Op is returned by both read and write methods, you have to run them explicitly to take effect. It represents one or more operations.
type Options ¶
type Options struct { // TTL specifies a duration over which data is valid. It will be truncated to second precision upon statement // execution. TTL time.Duration // Limit query result set Limit int // TableName overrides the default internal table name. When naming a table 'users' the internal table name becomes 'users_someTableSpecificMetaInformation'. TableName string // ClusteringOrder specifies the clustering order during table creation. If empty, it is omitted and the defaults are used. ClusteringOrder []ClusteringOrderColumn // Indicates if allow filtering should be appended at the end of the query AllowFiltering bool // Select allows you to do partial reads, ie. retrieve only a subset of fields Select []string // Consistency specifies the consistency level. If nil, it is considered not set Consistency *gocql.Consistency // Setting CompactStorage to true enables table creation with compact storage CompactStorage bool // Compressor specifies the compressor (if any) to use on a newly created table Compressor string }
Options can contain table or statement specific options. The reason for this is because statement specific (TTL, Limit) options make sense as table level options (eg. have default TTL for every Update without specifying it all the time)
func (Options) AppendClusteringOrder ¶
func (o Options) AppendClusteringOrder(column string, direction ColumnDirection) Options
AppendClusteringOrder adds a clustering order. If there already clustering orders, the new one is added to the end.
type QueryExecutor ¶
type QueryExecutor interface { // Query executes a query and returns the results. It also takes Options to do things like set consistency QueryWithOptions(opts Options, stmt string, params ...interface{}) ([]map[string]interface{}, error) // Query executes a query and returns the results Query(stmt string, params ...interface{}) ([]map[string]interface{}, error) // Execute executes a DML query. It also takes Options to do things like set consistency ExecuteWithOptions(opts Options, stmt string, params ...interface{}) error // Execute executes a DML query Execute(stmt string, params ...interface{}) error // ExecuteAtomically executs multiple DML queries with a logged batch ExecuteAtomically(stmt []string, params [][]interface{}) error }
QueryExecutor actually executes the queries - this is mostly useful for testing/mocking purposes, ignore this otherwise. This library is using github.com/gocql/gocql as the query executor by default.
func GoCQLSessionToQueryExecutor ¶
func GoCQLSessionToQueryExecutor(sess *gocql.Session) QueryExecutor
GoCQLSessionToQueryExecutor enables you to supply your own gocql session with your custom options Then you can use NewConnection to mint your own thing See #90 for more details
type RowNotFoundError ¶
type RowNotFoundError struct {
// contains filtered or unexported fields
}
RowNotFoundError is returned by Reads if the Row is not found.
func (RowNotFoundError) Error ¶
func (r RowNotFoundError) Error() string
type Table ¶
type Table interface { // Set Inserts, or Replaces your row with the supplied struct. Be aware that what is not in your struct // will be deleted. To only overwrite some of the fields, use Query.Update. Set(v interface{}) Op // Where accepts a bunch of realtions and returns a filter. See the documentation for Relation and Filter to understand what that means. Where(relations ...Relation) Filter // Because we provide selections // Name returns the underlying table name, as stored in C* WithOptions(Options) Table TableChanger }
Table is the only non-recipe table, it is the "raw CQL table", it lets you do pretty much whatever you want with the downside that you have to know what you are doing - eg. you have to know what queries can you make on a certain partition key - clustering column combination.
type TableChanger ¶
type TableChanger interface { // Create creates the table in the keySpace, but only if it does not exist already. // If the table already exists, it returns an error. Create() error // CreateStatement returns you the CQL query which can be used to create the table manually in cqlsh CreateStatement() (string, error) // Create creates the table in the keySpace, but only if it does not exist already. // If the table already exists, then nothing is created. CreateIfNotExist() error // CreateStatement returns you the CQL query which can be used to create the table manually in cqlsh CreateIfNotExistStatement() (string, error) // Recreate drops the table if exists and creates it again. // This is useful for test purposes only. Recreate() error // Name returns the name of the table, as in C* Name() string }
Danger zone! Do not use this interface unless you really know what you are doing
type TimeSeriesTable ¶
type TimeSeriesTable interface { // timeField and idField must be present Set(v interface{}) Op Update(timeStamp time.Time, id interface{}, m map[string]interface{}) Op Delete(timeStamp time.Time, id interface{}) Op Read(timeStamp time.Time, id, pointer interface{}) Op List(start, end time.Time, pointerToASlice interface{}) Op WithOptions(Options) TimeSeriesTable TableChanger }
TimeSeriesTable lets you list rows which have a field value between two date ranges.
Source Files ¶
Directories ¶
Path | Synopsis |
---|---|
examples
|
|
This package provides some punk-rock reflection which is not in the stdlib.
|
This package provides some punk-rock reflection which is not in the stdlib. |