Skip to content

Instantly share code, notes, and snippets.

@angoca
Created February 29, 2012 20:18
Show Gist options
  • Save angoca/1944110 to your computer and use it in GitHub Desktop.
Save angoca/1944110 to your computer and use it in GitHub Desktop.
Access Twitter from DB2 via a select
import java.util.Iterator;
import twitter4j.Query;
import twitter4j.QueryResult;
import twitter4j.Tweet;
import twitter4j.Twitter;
import twitter4j.TwitterFactory;
import COM.ibm.db2.app.UDF;
/**
* Este es el código en Java para poder consultar a Twitter desde DB2.
* <p>
* Las siguientes líneas de código son las necesarias para crear la función
* tabla en DB2 y asociando el archivo en Java y su función.
* <p>
* <code>
* create or replace function tweets(query varchar(32) default 'Twitter')
returns table (user varchar(32), date varchar(50), message varchar(140))
language java
external name 'TweetTable.tweets'
parameter style db2general
not deterministic
fenced
returns null on null input
no sql
external action
no scratchpad
final call
disallow parallel
cardinality 15;
</code>
*
* @author Andres Gomez Casanova (AngocA)
*/
public class TweetTable extends UDF {
/**
* Set of retrieved tweets.
*/
private static Iterator<Tweet> tweetList = null;
/**
* Envía una consulta en Twitter y retorna los mensajes que corresponden a
* la consulta dada.
*
* @param query
* Consulta para filtrar los Tweets.
* @param user
* Usuario que publicó el Tweet.
* @param date
* Fecha del Tweet.
* @param message
* Mensaje o Tweet.
* @throws Exception
* En caso de que haya un problema accediendo a Twitter.
*/
public void tweets(String query, String user, String date, String message)
throws Exception {
switch (getCallType()) {
case SQLUDF_TF_FIRST:
// Inicializa la función tabla.
break;
case SQLUDF_TF_OPEN:
// Inicializa los componentes necesarios para el retorno de la
// tabla, haciendo la consulta a Twitter.
Twitter twitter = new TwitterFactory().getInstance();
final QueryResult result = twitter.search(new Query(query));
tweetList = result.getTweets().iterator();
break;
case SQLUDF_TF_FETCH:
// Posición actual en el ciclo
if (tweetList.hasNext()) {
// Recupera el tweet en la posición dada
final Tweet tweet = tweetList.next();
user = tweet.getFromUser();
date = tweet.getCreatedAt().toString();
message = tweet.getText();
// Devuelve los valores
set(2, user);
set(3, date.toString());
set(4, message);
} else {
// No hay más tweets a procesar.
// Se indica a DB2 que se completó el proceso via SQLSTATE
setSQLstate("02000");
}
break;
case SQLUDF_TF_CLOSE:
// Libera los elementos abiertos
break;
case SQLUDF_TF_FINAL:
// Termina otros elementos inicializados en la función tabla.
break;
default:
throw new Exception("Unexpected call type of " + getCallType());
}
}
}
@angoca
Copy link
Author

angoca commented Feb 29, 2012

With this Java code, and defining the next table function, you can do a select in DB2 and retrieve the most recent Tweets about the provided topic (select * from table(tweets('DB2'));):

create or replace function tweets(query varchar(32) default 'Twitter')
returns table (user varchar(32), date varchar(50), message varchar(140))
language java
external name 'TweetTable.tweets'
parameter style db2general
not deterministic
fenced
returns null on null input
no sql
external action
no scratchpad
final call
disallow parallel
cardinality 15;

For more information, visit: http://angocadb2.blogspot.com/

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment