Created
February 29, 2012 20:18
-
-
Save angoca/1944110 to your computer and use it in GitHub Desktop.
Access Twitter from DB2 via a select
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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()); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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/