Cqengine in short is a in-memory DataBase. It is a NoSQL indexing and Query Engine, for retrieving objects matching SQL-like queries from Java collections, with ultra-low latency. Supports millions of queries per second, with response times in the order of microseconds.
Maven Dependency
<dependency>
<groupId> com.googlecode.cqengine</groupId>
<artifactId> cqengine</artifactId>
<version> 1.2.7</version>
</dependency>
SBT
libraryDependencies += “com.googlecode.cqengine” % “cqengine” % “1.2.7”
Adding Attributes
First Step is to create a class with the revelant Objects and add Attributes which can be indexed and queried with.
######The initial Class Structure without the attributes
import java.util.List ;
public class User {
private String userName ;
private String email ;
private String firstName ;
private String lastName ;
private String profession ;
public User ( String userName , String email , String firstName , String lastName , String profession ) {
this . userName = userName ;
this . email = email ;
this . firstName = firstName ;
this . lastName = lastName ;
this . profession = profession ;
}
}
Attributes
In the Below code we are adding a SimpleAttribute for the UserName Values so that the User Name can be indexed and queried with.
public static final Attribute < User , String > USER_NAME = new SimpleAttribute < User , String >() {
@Override
public String getValue ( User user ) {
return user . getUserName ();
}
};
The Complete Class with attributes for email username and profession
import com.googlecode.cqengine.attribute.Attribute ;
import com.googlecode.cqengine.attribute.SimpleAttribute ;
public class User {
private String userName ;
private String email ;
private String firstName ;
private String lastName ;
private String profession ;
public User ( String userName , String email , String firstName , String lastName , String profession ) {
this . userName = userName ;
this . email = email ;
this . firstName = firstName ;
this . lastName = lastName ;
this . profession = profession ;
}
public static final Attribute < User , String > USER_NAME = new SimpleAttribute < User , String >() {
@Override
public String getValue ( User user ) {
return user . getUserName ();
}
};
public static final Attribute < User , String > PROFESSION = new SimpleAttribute < User , String >() {
@Override
public String getValue ( User user ) {
return user . getProfession ();
}
};
public static final Attribute < User , String > EMAIL = new SimpleAttribute < User , String >() {
@Override
public String getValue ( User user ) {
return user . getEmail ();
}
};
public static final Attribute < User , String > FISRT_NAME = new SimpleAttribute < User , String >() {
@Override
public String getValue ( User user ) {
return user . getFirstName ();
}
};
public String getUserName () {
return userName ;
}
public String getEmail () {
return email ;
}
public String getFirstName () {
return firstName ;
}
public String getLastName () {
return lastName ;
}
public String getProfession () {
return profession ;
}
}
Preparing the Index
Lets create a Indexed Collection that we can use for the User Objects.
private static IndexedCollection indexedUsers = CQEngine . newInstance ();
Adding an attribute to the IndexedCollection so that they will be indexed.
indexedUsers . addIndex ( HashIndex . onAttribute ( User . USER_NAME ));
Adding User to the indexed Collection
public static void addUser ( User user ) {
indexedUsers . add ( user );
}
import com.googlecode.cqengine.CQEngine ;
import com.googlecode.cqengine.IndexedCollection ;
import com.googlecode.cqengine.index.hash.HashIndex ;
public class UserCollections {
private static IndexedCollection indexedUsers = CQEngine . newInstance ();
public static void initialize () {
indexedUsers . addIndex ( HashIndex . onAttribute ( User . USER_NAME ));
indexedUsers . addIndex ( HashIndex . onAttribute ( User . EMAIL ));
indexedUsers . addIndex ( HashIndex . onAttribute ( User . PROFESSION ));
indexedUsers . addIndex ( HashIndex . onAttribute ( User . FISRT_NAME ));
}
public static void addUser ( User user ) {
indexedUsers . add ( user );
}
}
Querying
Lets do a simple Query which would return the users having a given profession
public static List < User > getUsersWithProfession ( String profession ){
List < User > users = new ArrayList < User >();
for ( Object obj : indexedUsers . retrieve ( equal ( User . PROFESSION , profession ))){
users . add (( User ) obj );
}
return users ;
}
A Query for searching users with a given profession and a spefic First name
public static List < User > getUsersWithProfessionAndName ( String profession , String firstName ){
List < User > users = new ArrayList < User >();
for ( Object obj : indexedUsers . retrieve ( and ( equal ( User . PROFESSION , profession ), equal ( User . FIRST_NAME , firstName )))){
users . add (( User ) obj );
}
return users ;
}
Lets Say you have multiple Queries its a good practice to use a list of queries instead of just a query
public static List < User > getUsersWithProfession ( List < String > professions ) {
List < User > users = new ArrayList < User >();
List < Query < User >> userQueries = new ArrayList < Query < User >>();
for ( String profession : professions ) {
userQueries . add ( equal ( User . PROFESSION , profession ));
}
Query < User > finalQuery ;
if ( userQueries . size () == 1 ) {
finalQuery = userQueries . get ( 0 );
} else {
finalQuery = or ( userQueries );
}
for ( Object obj : indexedUsers . retrieve ( finalQuery )) {
users . add (( User ) obj );
}
return users ;
}
Complete Class UserCollections
package in . cybergen . blog ;
import com.googlecode.cqengine.CQEngine ;
import com.googlecode.cqengine.IndexedCollection ;
import com.googlecode.cqengine.index.hash.HashIndex ;
import com.googlecode.cqengine.query.Query ;
import java.util.ArrayList ;
import java.util.List ;
import static com . googlecode . cqengine . query . QueryFactory . and ;
import static com . googlecode . cqengine . query . QueryFactory . equal ;
import static com . googlecode . cqengine . query . QueryFactory . or ;
/**
* Created by vishnu on 12/11/14.
*/
public class UserCollections {
private static IndexedCollection indexedUsers = CQEngine . newInstance ();
public static void initialize () {
indexedUsers . addIndex ( HashIndex . onAttribute ( User . USER_NAME ));
indexedUsers . addIndex ( HashIndex . onAttribute ( User . EMAIL ));
indexedUsers . addIndex ( HashIndex . onAttribute ( User . PROFESSION ));
}
public static void addUser ( User user ) {
indexedUsers . add ( user );
}
public static List < User > getUsersWithProfessionAndName ( String profession , String firstName ) {
List < User > users = new ArrayList < User >();
for ( Object obj : indexedUsers . retrieve ( and ( equal ( User . PROFESSION , profession ), equal ( User . FIRST_NAME , firstName )))) {
users . add (( User ) obj );
}
return users ;
}
public static List < User > getUsersWithProfession ( String profession ) {
List < User > users = new ArrayList < User >();
for ( Object obj : indexedUsers . retrieve ( equal ( User . PROFESSION , profession ))) {
users . add (( User ) obj );
}
return users ;
}
public static List < User > getUsersWithProfession ( List < String > professions ) {
List < User > users = new ArrayList < User >();
List < Query < User >> userQueries = new ArrayList < Query < User >>();
for ( String profession : professions ) {
userQueries . add ( equal ( User . PROFESSION , profession ));
}
Query < User > finalQuery ;
if ( userQueries . size () == 1 ) {
finalQuery = userQueries . get ( 0 );
} else {
finalQuery = or ( userQueries );
}
for ( Object obj : indexedUsers . retrieve ( finalQuery )) {
users . add (( User ) obj );
}
return users ;
}
public static void main ( String [] args ) {
initialize ();
addUser ( new User ( "vishnu667" , "vishnu@i.com" , "vishnu" , "prasad" , "programmer" ));
addUser ( new User ( "sam675" , "sam@i.com" , "sam" , "jenrich" , "lawyer" ));
addUser ( new User ( "john321" , "john@i.com" , "john" , "paul" , "manager" ));
addUser ( new User ( "nirmal047" , "nimmmy@i.com" , "nirmal" , "kumar" , "programmer" ));
System . out . println ( "Users with Profession " );
listUsers ( getUsersWithProfession ( "programmer" ));
System . out . println ( "Users with Profession and first name" );
listUsers ( getUsersWithProfessionAndName ( "programmer" , "nirmal" ));
System . out . println ( "Users with the given Professions " );
List < String > professions = new ArrayList < String >();
professions . add ( "programmer" );
professions . add ( "lawyer" );
listUsers ( getUsersWithProfession ( professions ));
}
public static void listUsers ( List < User > users ) {
for ( User user : users ) {
System . out . println ( "UserName " + user . getUserName () + " email " + user . getEmail () + " firstName " + user . getFirstName () + " Profession " + user . getProfession ());
}
}
}
Users with Profession
UserName nirmal047 email nimmmy@i.com firstName nirmal Profession programmer
UserName vishnu667 email vishnu@i.com firstName vishnu Profession programmer
Users with Profession and first name
UserName nirmal047 email nimmmy@i.com firstName nirmal Profession programmer
Users with the given Professions
UserName nirmal047 email nimmmy@i.com firstName nirmal Profession programmer
UserName vishnu667 email vishnu@i.com firstName vishnu Profession programmer
UserName sam675 email sam@i.com firstName sam Profession lawyer