1. Building A User-Definable,
Flexible UI
with Oracle Application Express (ApEx)
By Bradley D. Brown, InteliVideo
2. Who am I?
• Bradley D. Brown • Today
http://bradleydbrown.blogspot.com • InteliVideo in April 2012
• Founder • Video Monetization Platform
• TUSC in 1988 • Built it to sell training online
• Sold to Rolta in 2008 • Focused on mid and long tail and
corporate deals
• IntelliReal in 2005
• ApEx provides a “quick turns”
• Sold to Equifax in 2011
approach to our offering
• 10+ other companies, boards • Founders Institute
• Professor – DU
• Advisor for Founders Institute
• Author – 6 technical books
3. My Interests
• Making a difference
• Helping people – teaching,
advising, …
• Building companies
• Using my talents with
technology
• The outdoors
5. User Definable
• Data Driven • Trade-offs
• Drive code based on data • Performance
rather than hard coded
• “Readability” of code
• Examples
• Too many choices
• ES valuation model at
IntelliReal • Advantages
• Partners “turning off” partners • Quick Turns
on InteliVideo site
• Testing 100s of models,
• Flexible Database variable changes, etc. can all
be done programmatically
• Do you need the ability to add
(perfect value)
“columns” without “adding
columns?”
6. Flexible UI
• Data Driven • My bottom line
• What page to start at (after • If I’m doing the original
login) coding or I’m going to make
a change to my code and
• What partners to show
there is an assumption (i.e.
• Colors to display a hard coded number that I
might put into my code), I
• Easy with Apex stop and think
• Authorization rules • Should I add a column to a
table and should I change
• Display rules at all levels the code so it points at the
column?
• What level? Per user? Per
customer?
7. Independent Nation – POC Goals
• Dave read the book
• Called the author – Fipp (John
Avalon)
• Met with him and discussed the
concepts
• We met with numerous political
campaign target market experts
• I developed the software,
secured data,…
• We did demos to politicians,
target market people, etc.
• EC2 platform
8. Political Premise
• Politicians want to share their views with targeted groups of people who
are voting
• Key target groups (lobstermen, working moms, first time home owners)
• Identify and find those people
• Invite them to custom events (per group)
• Drive custom messages (reduced taxes for lobster, better day care options,
incentives for buying your first home) – email, text, phone
• Visit the networkers
9. Project / POC Goals
• Provide intelligence to political campaigns
• Build a GUI and GIS application (with ApEx)
• Application for Independent Nation, but wanted something we
could use for any customer with Google map needs
• Application that is dynamic and flexible
• Design and develop application that allows customization by
changing data, not code.
• Data about people, their properties or addresses they live at, and
other information about them – yet, stay open for others
10. Application Specifics
• Independent Nation is a company that specializes in provide
intelligence about voters to political campaigns
• Data sourcing - merged voter registration, voter contribution and
numerous other data sources as the starting data set
• Goal was to provide a flexible database design that will allow for
SIMPLE attribute additions without new coding. New data feeds
won’t require DB changes.
11. Application Design
• Developed for Independent Nation
• Every user
• Starts in a different part of the world
• Has their own color scheme and search criteria
• Uses Google Maps
• Could integrate other mapping solutions in
• Database
• Generic driving table with attributes
• Not many tables (i.e. simple design)
12
14. Key Tables
• Application Data • User Driven Data
• Attribute • User
• Category • User Attribute
• People • User Attribute Color
• People Attribute • User Option
• Property • User Option User
• People Property
16. Attribute Table
• Attributes (fields) • Parent Attribute
• Short Description • Text 1,2
• Long Description • Data 1,2
• Category • Number 1,2
17. Category Table
• Categories of • Add a new category, assign
Windows/Tabs it to attribute(s) and it
shows up for all of the
• Category ID
people…
• Short Description
• Full Description
• Parent Category
18. People
• People
• ID
• First, Last Name
• Voter ID
• Property ID
• People Attribute
• People ID
• Attribute ID
• Start and End Date
• Source, Integrity
• Text, Number, Date Values
19. Properties and People
• Property
• ID
• Address
• Phone, Cell
• Valuation
• Lat and Long
• People Property
• People ID
• Property ID
• Start and End Date
20. User Specific Data
• User Attribute Color
• Colorization
• Limiting data
• User Option
• Saved Filters
• Descriptions, Include, Exclude
• Starting map location
• User Option User
• Users who share a filter
• Default filter
21. Functions
• Get_Desc • Get_People
• Gets the description for a • Brains for everything here
specific attribute for a
• Pipeline (or table-based)
specific user
function
• Get_Option
• Finds the people that live
• Gets the default filter for a within the lat/long range
user on the map, matching the
filters
22. Let’s Add a New Category
• Add the category
• Change attributes to be in the category
• Refresh the Materialized View
• Test it out in the UI
23. Let’s Create a New Filter
• Education of Too Youngs…
• Color by education level
• Include <18 year olds
• Exclude other age categories
• Save it
24. List of People Matching
• Uses the same service as the map
• Shows the details
• Can be exported
27. Performance
• Created materialized • Faster Spatial
view Options
• PEOPLE_MV • Change from
lat/long to spatial
• Indexed search
column
columns
• sdo_geometry
• Turned on query re-
• Change query to
write
use sdo functions
• ALTER SESSION SET
query_rewrite_enabled=TRUE;
• Or…I could have just changed
queries (people_mv)
28. How the Maps Works
• AJAX • select * from
table(cast(get_people(:P6_SW
• var url = "f?p=&APP_ID.:6:' _LAT, :P6_NE_LAT,
|| v('app_session') || :P6_SW_LONG, :P6_NE_LONG,
'::::P6_SW_LAT,P6_SW_LO :P1_COLOR_ATTRIBUTE_ID,
NG,P6_NE_LAT,P6_NE_LO independent_authentication.g
NG,P6_ZOOM,P6_MAPTYP et_user_id(:APP_USER),:P1_IN
E:" + sw.lat() + "," + CLUDE_LIST,
sw.lng() + "," + ne.lat() + "," :P1_REMOVE_LIST,
+ ne.lng() + "," + zm + "," + :P1_SHOW_UNCOLORED,
mt; :P1_PEOPLE_ID,
• See Page 6 in my nvl(:P1_ROWS,1000)) as
people_Table))
application
• XML Report
• Cast function as if it’s a
table
29. Other Options
• Could use a Cloud provider • Yahoo Pipes requires data
in XML format
• Yahoo Pipes
• Can come from ApEx too
• Google App Engine
• iPerspective
• We put this in a hosted
environment
• Amazon EC2
• MaxApex
30. BTW – Political Reality
• Politicians don’t decide much of anything
• Their interns and experts do
• They don’t want to pay for anything
• They do know what groups they want to get to
• They cannot craft a message to them – for fear one
person will get the wrong message and spread it
• They want to deliver generic messages
• This killed Independent Nation in the end…
31. Getting Started, then Other Mapping I’ve Done
• Heat Maps
• GeoSearch
• Highlight and Visual Search
• Test Scores within a Radius
• Get Creative!
39. Brad’s Papers and Presentations
• Java-based Oracle Web • Practical Portal Practices
Development • Implementing JSP in Portal
• Java Server Pages • UltraSearch
• JavaMail • Search Engines
• Java for the PL/SQL • Utl_smtp and Utl_http
Developer
• iFS
• Web Cache – achieving 150
the performance • JavaScript
• 9iAS Installation, • Top DBA scripts for Web
Configuration, and Tuning Developers
• Wireless • Security